1:
首先要了解的概念:
如果你看完这篇文章还不懂计算机时间,那就掐死我吧 - 21ic电子网
UTC_GMT_格林威治时间_协调世界时 (beijing-time.org)
协调世界时(UTC)
又称世界统一时间、世界标准时间、国际协调时间、世界协调时间,UTC协调世界时即格林威治平太阳时间,是指格林威治所在地的标准时间,也是表示地球自转速率的一种形式,UTC基于国际原子时间,通过不规则的加入闰秒来抵消地球自转变慢的影响,是世界上调节时钟和时间的主要时间标准。
东八区
(UTC/GMT+08:00)是比世界协调时间(UTC)/格林尼治时间(GMT)快8小时的时区,理论上的位置是位于东经112.5度至127.5度之间,在此15度的范围内,统一采用以东经120度中心线的地方时间为准。是东盟标准的其中一个候选时区。当格林尼治标准时间为00:00时,东八区的标准时间为08:00。
中国基于「世界协调时」再加上 8 小时时区之差,确立了「北京时间」,并广播给整个中国大地使用。
unix时间戳
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。Unix 时间戳(英文为 Unix epoch, Unix time, POSIX time 或 Unix timestamp)
2:
理解以上概念就很清楚:
* 我们通常说的 ”时间戳“ 指的就是 【Unix时间戳】例如: https://tool.lu/timestamp/ https://tool.chinaz.com/tools/unixtime.aspx 在线工具所示。
* 而通过 第一部分了解基本概念后 可得知 【Unix时间戳】 就是 utc 午夜时间开始所经过的秒数,
* 避免一个误区,什么 零时区转换时间戳 还是北京时间转换时间戳,,时间戳就是 时间戳 不管什么时区的时间值
在 C#中获取一个时间的时间戳就是:
为什么要减去一个数 又除以 另一个数。 可参考:
DateTime.Ticks 属性 (System) | Microsoft Docs
0625-ticks-18位时间戳转换 - 知乎 (zhihu.com)
/// <summary> /// 时间转换为Unix时间戳 /// </summary> /// <param name="date"></param> /// <returns></returns> public static double DateConvertToUnixTimestamp(this DateTime date) { var unixTimestamp = (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000; return unixTimestamp; }
时间戳转换时间:
/// <summary> /// Unix时间戳转换为时间 /// </summary> /// <param name="timestamp"></param> /// <returns></returns> public static DateTime UnixTimestampConvertToDate(this double timestamp) { //DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));//过时的 //DateTime dtStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")); //硬编码时区标识id DateTime dtStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local); //表示本地时区 long lTime = long.Parse(timestamp.ToString() + "0000000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); }