我終於搞懂了時間……(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);
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM