前言
参考博客
C#获取和转换时间戳:
https://blog.****.net/weixin_39885282/article/details/79462443
获取时间戳:
https://www.cnblogs.com/xiangxisheng/p/12364423.html
Convert.ToInt64(Double):
示例
获取时间戳
关于Ticks和TimeSpan
使用过程中发现了一个问题,TimeSpan获取的10位和13位时间戳有时候会存在差异。
建议使用Ticks去整除得到时间戳。
原因:Convert.ToInt64(Double),对小数的保留规则导致数据会有偏差
使用Ticks
static void Test7() { //1970-01-01的Ticks值 long tStart = 621355968000000000; //方法1,直接相减 long ts1 = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks; //方法2,将当前时间转换为Utc时间,再减 long ts2 = DateTime.Now.ToUniversalTime().Ticks - tStart; //方法3,直接获取当前Utc时间,再减 long ts3 = DateTime.UtcNow.Ticks - tStart; var ret1 = ts1 / 10000000; var ret2 = ts1 / 10000; Console.WriteLine(ret1);//10位 Console.WriteLine(ret2);//13位 }
运行结果
使用TimeSpan
/// <summary> /// 获取时间戳,TimeSpan /// </summary> static void Test6() { //1970-01-01的Ticks值 long tStart = 621355968000000000; //方法1,直接相减 TimeSpan ts1 = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); //方法2,将当前时间转换为Utc时间,再减 TimeSpan ts2 = new TimeSpan(DateTime.Now.ToUniversalTime().Ticks - tStart); //方法3,直接获取当前Utc时间,再减 TimeSpan ts3 = new TimeSpan(DateTime.UtcNow.Ticks - tStart); var ret1 = Convert.ToInt64(ts1.TotalSeconds); var ret2 = Convert.ToInt64(ts1.TotalMilliseconds); Console.WriteLine(ret1);//10位 Console.WriteLine(ret2);//13位 }
运行结果
转换时间戳
static void Test8() { long ret1 = 1593488038; long ret2 = 1593488038297; var ret10 = ret1 * 10000000; var ret20 = ret2 * 10000; DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); TimeSpan ts1 = new TimeSpan(ret10); var dt1 = dtStart.Add(ts1); TimeSpan ts2 = new TimeSpan(ret20); var dt2 = dtStart.Add(ts2); Console.WriteLine(dt1.ToString("yyyy-MM-dd HH:mm:ss.ffff")); Console.WriteLine(dt2.ToString("yyyy-MM-dd HH:mm:ss.ffff")); }
运行结果