以前遇到过一个关于时间戳的问题,为了不被大家鄙视,先说一下概念。
具体时间戳怎么定义的我也不清楚,但百度百科中有这么一句:“时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)至当前时间的总秒数”。
按这个定义,编程语言中倒是有一种类似的函数,getTime(),但这个函数返回的是自1970年1月1日到当前时间的总 毫秒数 ,而不是总 秒数。
在js中,将一个字符转化成Date型也不是什么难事:
var str = '2013-08-30'; // 日期字符串
str = str.replace(/-/g,'/'); // 将-替换成/,因为下面这个构造函数只支持/分隔的日期字符串
var date = new Date(str); // 构造一个日期型数据,值为传入的字符串
在上面,new Date(str)构造了一个日期,参数str至少要提供年月日三部分,也就是形如“2013/03/08”的字符串,不能是"2013/03",否则将得到一个NaN。此时构造出来的时间是:2013/03/08 00:00:00。同时你还可以传入小时、分钟和秒数,但不能只传入小时,比如“2013/03/08 17”,这样的参数同样会得到一个NaN。参数可以是“2013/03/08 17:20”或者“2013/03/08 17:20:05”,这样都可以得到正确的时间,其中如果秒数没给出,则默认为0。
此时得到的是日期型数据,如果要得到上面所谓的时间戳,可以这样:
var time = date.getTime();
这样得到的是一个数值,表示的是从1970年1月1日0点0分0秒到date那一刻的毫秒数,如果把这个数字除以1000,就得到了秒数,同样继续除以60,得到分钟,再除以60得到小时等等。
提示,通过这个getTime()函数,你可以得到两个日期的毫秒数,继而转化成秒数、分钟、小时甚至天数,比较两个日期的差值。
时间戳就是如1377216000000 这种格式,在mysql数据库中会经常用到把时间转换成时间戳或把时间戳转换成日期格式了,下面是时间戳操作转换方法:
一、原理
时间戳的原理是把时间格式转为十进制格式,这样就方便时间的计算
如: 2013年08月23日 转化后是 1377216000000
二、步骤
1、创建 DateUtilsl类。
代码如下:
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/*
* @author Msquirrel
*/
public class DateUtils {
privateSimpleDateFormat sf = null;
/*获取系统时间 格式为:"yyyy/MM/dd "*/
public static String getCurrentDate() {
Date d = newDate();
sf = newSimpleDateFormat("yyyy年MM月dd日");
returnsf.format(d);
}
/*时间戳转换成字符窜*/
public static String getDateToString(long time) {
Date d = newDate(time);
sf = newSimpleDateFormat("yyyy年MM月dd日");
returnsf.format(d);
}
/*将字符串转为时间戳*/
public static long getStringToDate(String time) {
sdf = newSimpleDateFormat("yyyy年MM月dd日");
Date date = newDate();
try{
date = sdf.parse(time);
} catch(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
returndate.getTime();
}
2、在对应使用的地方调用。
代码如下:
DateUtils.getCurrentDate(); //获取系统当前时间
DateUtils.getDateToString(时间戳); //时间戳转为时间格式
DateUtils.getStringToDate("时间格式");//时间格式转为时间戳.
本来下午能解答的..但是当时用JS写方法...发现有几个小时的差..一直不知道怎么解决...刚刚用C#重写了..终于知道了为什么了
要说的是..你的思路是错误的..因为你忽略了闰年~~
下面是C#的代码 : (.Net的DateTime对象返回的是100纳秒的时间单位,年份是从AD1开始计算的,纳秒我也不会换算成毫秒,系数是网上找到的~)
class Program
{
// 定义必须变量
const int _1M = 60; // 分钟
const int _1H = _1M * 60; // 小时
const int _1D = _1H * 24; // 天
const long _1Y = _1D * 365; // 年(非闰年)
const long _YS = _1Y * 3 + _1D * 366; // 一个闰年年度
const long _30D = _1D * 30; // 30天(月)
const long _31D = _1D * 31; // 31天(月)
const long _28D = _1D * 28; // 28天(月)
const long _29D = _1D * 29; // 29天(月)
long[] NormalYear = { _31D, _28D, _31D, _30D, _31D, _30D, _31D, _31D, _30D, _31D, _30D, _31D }; // 年
long[] LeapYear = { _31D, _29D, _31D, _30D, _31D, _30D, _31D, _31D, _30D, _31D, _30D, _31D }; // 闰年
static void Main(string[] args)
{
Program P = new Program();
System.Console.WriteLine(P.getDate(P.getTimeSpame()));
DateTime T = DateTime.Now;
System.Console.WriteLine(P.getTimeSpame() + " : " + P.getTimeSpame(T.Year, T.Month, T.Day, T.Hour, T.Minute, T.Second));
System.Console.ReadKey();
}
private Program() {}
public string getDate(long TimeSp)
{
// 年,月,天,小时,分钟,秒
int year = 0;
int month = 0;
int day = 0;
int hour = 0;
int minute = 0;
int second = 0;
//DateTime now = DateTime.Now;
//long TimeSp = getTimeSpame(); // 当前时间戳
// 年
int _y1 = (int)(TimeSp / _YS); // 获得按年度得到的年度
TimeSp -= _YS * _y1; // 计算剩余秒
int _y2 = (int)(TimeSp / _1Y); // 剩余年
TimeSp -= _1Y * _y2;
year = _y1 * 4 + _y2 + 1970;
// 月
long[] YearArr = isLeapYear(year) ? LeapYear : NormalYear; // 获取年的月度表
month = 1; // 从1月开始计算
for (int i = 0; i < YearArr.Length; i++)
{
if (TimeSp - YearArr[i] < 0) break;
++month;
TimeSp -= YearArr[i];
}
// 天
day = (int)(TimeSp / _1D);
TimeSp -= day * _1D;
// 时
hour = (int)(TimeSp / _1H);
TimeSp -= hour * _1H;
// 分
minute = (int)(TimeSp / _1M);
// 秒
second = (int)(TimeSp % _1M);
string DateStr = year + "年" + month + "月" + day + "日 " + hour + "点" + minute + "分" + second + "秒";
return DateStr;
}
// 判断是否闰年
private bool isLeapYear(int year)
{
return (year % 4 == 0 ? true : false);
}
// 获取当前时间戳 按1970年开始计算,精度为秒!
private long getTimeSpame()
{
DateTime _Now = DateTime.Now;
DateTime _1970 = new DateTime(1970, 1, 1);
long _Sp = (_Now.Ticks - _1970.Ticks) / 10000000;
return _Sp;
}
// 按既定格式把时间转成成时间戳
private long getTimeSpame(int Year, int Month, int Day, int Hour, int Minute, int Second)
{
long val = 0;
val += Second; // 秒
val += Minute * _1M; // 分钟
val += Hour * _1H; // 小时
val += Day * _1D; // 天
long[] YearArr = isLeapYear(Year) ? LeapYear : NormalYear;
for (int i = 0; i < Month - 1; i++)
{
val += YearArr[i];
}
Year -= 1970;
val += (Year / 4) * _YS;
Year -= (int)(Year / 4) * 4;
val += Year * _1Y;
return val;
}
}
然后是JS的: (后来用C#完成后才发现,JS的Date对象的getTime()方法返回的是UTC的时间戳,这个手册上居然没明示,不过有getTimezoneOffset()方法来返回与UTC时差的分钟~)
// 定义常量
var _1M = 60; // 分钟
var _1H = _1M * 60; // 小时
var _1D = _1H * 24; // 天
var _1Y = _1D * 365; // 年(非闰年)
var _YS = _1Y * 3 + _1D * 366; // 一个闰年年度
var _30D = _1D * 30; // 30天(月)
var _31D = _1D * 31; // 31天(月)
var _28D = _1D * 28; // 28天(月)
var _29D = _1D * 29; // 29天(月)
var NormalYear = [ _31D, _28D, _31D, _30D, _31D, _30D, _31D, _31D, _30D, _31D, _30D, _31D ]; // 年
var LeapYear = [ _31D, _29D, _31D, _30D, _31D, _30D, _31D, _31D, _30D, _31D, _30D, _31D ]; // 闰年
var Now = new Date();
TimeSp = Now.getTime() / 1000;
//alert(Now.getTimezoneOffset()); // 时区差
TimeSp += -1 * Now.getTimezoneOffset() * _1M; // 修正UTC
// 年,月,天,小时,分钟,秒
var year = month = day = hour = minute = second = 0;
// 年
var _y1 = parseInt(TimeSp / _YS); // 获得按年度得到的年度
TimeSp -= _YS * _y1; // 计算剩余秒
var _y2 = parseInt(TimeSp / _1Y); // 剩余年
TimeSp -= _1Y * _y2;
year = _y1 * 4 + _y2 + 1970;
// 月
var YearArr = year % 4 == 0 ? LeapYear : NormalYear; // 获取年的月度表
month = 1; // 从1月开始计算
for (i=0; i
{
if (TimeSp - YearArr[i] < 0) break;
++month;
TimeSp -= YearArr[i];
}
// 天
day = parseInt(TimeSp / _1D);
TimeSp -= day * _1D;
// 时
hour = parseInt(TimeSp / _1H);
TimeSp -= hour * _1H;
// 分
minute = parseInt(TimeSp / _1M);
// 秒
second = parseInt(TimeSp % _1M);
var DateStr = year + "年" + month + "月" + day + "日 " + hour + "点" + minute + "分" + second + "秒";
alert(DateStr);
1286526868
标签:转换,实现