如何实现时间戳转换

[复制链接]
查看11 | 回复3 | 2018-6-28 05:52:47 | 显示全部楼层 |阅读模式
时间戳就是如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("时间格式");//时间格式转为时间戳.
回复

使用道具 举报

千问 | 2018-6-28 05:52:47 | 显示全部楼层
本来下午能解答的..但是当时用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 < 0) break;
++month;
TimeSp -= YearArr;
}
//天
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;
}
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<YearArr.length; i++){ if (TimeSp - YearArr < 0) break; ++month; TimeSp -= YearArr;}//天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);
回复

使用道具 举报

千问 | 2018-6-28 05:52:47 | 显示全部楼层
1286526868
回复

使用道具 举报

千问 | 2018-6-28 05:52:47 | 显示全部楼层
1286526868123123123
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行