我终于搞懂了时间……(C# 中时间类型(DateTime) 时间戳(Unix时间戳)互转)

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);
        }

 

posted @ 2022-03-02 15:28  rhyswang  阅读(2080)  评论(0编辑  收藏  举报