C#時(shí)間戳基本使用方法詳解
時(shí)間戳轉(zhuǎn)換:
由于TimeZone類已經(jīng)過(guò)時(shí),官方推薦使用TimeZoneInfo來(lái)做時(shí)間的轉(zhuǎn)換。
/// <summary> /// 本時(shí)區(qū)日期時(shí)間轉(zhuǎn)時(shí)間戳 /// </summary> /// <param name="datetime"></param> /// <returns>long=Int64</returns> public static long DateTimeToTimestamp(DateTime datetime) { DateTime dd = new DateTime(1970, 1, 1, 0, 0, 0, 0); DateTime timeUTC = DateTime.SpecifyKind(datetime, DateTimeKind.Utc);//本地時(shí)間轉(zhuǎn)成UTC時(shí)間 TimeSpan ts = (timeUTC - dd); return (Int64)ts.TotalMilliseconds;//精確到毫秒 } /// <summary> /// 時(shí)間戳轉(zhuǎn)本時(shí)區(qū)日期時(shí)間 /// </summary> /// <param name="timeStamp"></param> /// <returns></returns> public static DateTime TimestampToDateTime(string timeStamp) { DateTime dd = DateTime.SpecifyKind(new DateTime(1970, 1, 1, 0, 0, 0, 0),DateTimeKind.Local); long longTimeStamp = long.Parse(timeStamp + "0000"); TimeSpan ts = new TimeSpan(longTimeStamp); return dd.Add(ts); }
==已下timeZone已過(guò)時(shí)=============================
一、計(jì)算機(jī)時(shí)間為什么都從1970年1月1日為起始
最初計(jì)算機(jī)操作系統(tǒng)是32位,而時(shí)間也是32為表示。Integer在java內(nèi)用32位表示,因此32為能表示的最大值就是2147483647。另外一年365天的總秒數(shù)是31536000,2147483647/31536000=68.1,也就是說(shuō)32為能表示的最長(zhǎng)時(shí)間是68.1,也就是說(shuō)32為能表示的最長(zhǎng)時(shí)間就是68年,從1970年開始的話,加上68.1年,實(shí)際最終到2038年01月19日03時(shí)14分07秒,便會(huì)達(dá)到最大時(shí)間,過(guò)了這個(gè)時(shí)間點(diǎn),所有32為操作系統(tǒng)時(shí)間便會(huì)變?yōu)?0000000 00000000 00000000 00000000,算下來(lái)也就是1901年12月13日20時(shí)45分52秒,這樣便會(huì)出現(xiàn)時(shí)間回歸的現(xiàn)象,很多軟件便會(huì)運(yùn)行異常。
到這里我想問(wèn)題的答案已經(jīng)顯現(xiàn)出來(lái)了,那就是因?yàn)橛?2為來(lái)表示時(shí)間的最大間隔是68年,而最早出現(xiàn)的UNIX系統(tǒng)考慮到計(jì)算機(jī)產(chǎn)生的年代個(gè)應(yīng)用的時(shí)限,綜合取了1970年1月1日作為UNIX TIME的紀(jì)元時(shí)間(開始時(shí)間),至于時(shí)間回歸現(xiàn)象相信隨著64位操作系統(tǒng)可以表示到292,277,026,596年以后了,這是時(shí)間已經(jīng)是兩千億年以后了,所以也不用擔(dān)心了。
二、本地時(shí)間和UTC時(shí)間相互轉(zhuǎn)化
DateTime localDateTime = DateTime.Now;//本地時(shí)間 DateTime utcDateTime = DateTime.UtcNow;//協(xié)調(diào)世界時(shí) DateTime temp1 = DateTime.SpecifyKind(localDateTime, DateTimeKind.Utc); //本地時(shí)間轉(zhuǎn)成UTC時(shí)間 DateTime temp2 = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Local); //將UTC時(shí)間轉(zhuǎn)成本地時(shí)間 DateTime temp3 = DateTime.SpecifyKind(localDateTime, DateTimeKind.Unspecified); //既不是本地時(shí)間也不是UTC時(shí)間
UtcNow的替代方法DateTimeOffset.UtcNow
前者通過(guò)分配DateTimeKind.Utc給其Kind屬性來(lái)指示日期和時(shí)間值是協(xié)調(diào)世界時(shí) (UTC), 后者會(huì)將日期和時(shí)間值分配給 UTC 時(shí)間的偏移量 (等于TimeSpan.Zero)。
三、javascript和unix時(shí)間戳的使用和轉(zhuǎn)化
1. 什么是時(shí)間戳
首先要清楚JavaScript與Unix的時(shí)間戳的區(qū)別:
JavaScript時(shí)間戳:是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總毫秒數(shù)。
Unix時(shí)間戳:是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。
可以看出JavaScript時(shí)間戳總毫秒數(shù),Unix時(shí)間戳是總秒數(shù)。
比如同樣是的 2016/11/03 12:30:00 ,轉(zhuǎn)換為JavaScript時(shí)間戳為 1478147400000;轉(zhuǎn)換為Unix時(shí)間戳為 1478147400。
2. JavaScript時(shí)間戳相互轉(zhuǎn)換
2.1 C# DateTime轉(zhuǎn)換為JavaScript時(shí)間戳
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū) long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds; // 相差毫秒數(shù) System.Console.WriteLine(timeStamp);
2.2 JavaScript時(shí)間戳轉(zhuǎn)換為C# DateTime
long jsTimeStamp = 1478169023479; System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū) DateTime dt = startTime.AddMilliseconds(jsTimeStamp); System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));
3. Unix時(shí)間戳相互轉(zhuǎn)換
3.1 C# DateTime轉(zhuǎn)換為Unix時(shí)間戳
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū) long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒數(shù) System.Console.WriteLine(timeStamp);
3.2 Unix時(shí)間戳轉(zhuǎn)換為C# DateTime
long unixTimeStamp = 1478162177; System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū) DateTime dt = startTime.AddSeconds(unixTimeStamp); System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));
應(yīng)用:
一、獲取系統(tǒng)時(shí)間的時(shí)間戳
獲取系統(tǒng)時(shí)間的時(shí)間戳
? ? public string GetTimeStamp() ? ? { ? ? ? ? //DateTime.Now獲取的是電腦上的當(dāng)前時(shí)間 ? ? ? ? ? ?TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); ? ? ? ? return Convert.ToInt64(ts.TotalSeconds).ToString();//精確到秒 ? ? }
獲取世界標(biāo)準(zhǔn)時(shí)區(qū)的當(dāng)前時(shí)間的時(shí)間戳
? ? public static string GetUtcNowTimeStamp() ? ? { ? ? ? ? //DateTime.UtcNow獲取的是世界標(biāo)準(zhǔn)時(shí)區(qū)的當(dāng)前時(shí)間(比北京時(shí)間少8小時(shí)) ? ? ? ? TimeSpan ts = DateTime.Now ?- new DateTime(1970, 1, 1, 0, 0, 0, 0); ? ? ? ? return Convert.ToInt64(ts.TotalMilliseconds).ToString();//精確到毫秒 ? ? }
二、時(shí)間戳和DateTime的相互轉(zhuǎn)換
? ?/// 時(shí)間戳轉(zhuǎn)換為DataTime ? ? public DateTime TimestampToDataTime(long unixTimeStamp) ? ? { ? ? ? ? ? ? ? ? System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當(dāng)?shù)貢r(shí)區(qū) ? ? ? ? DateTime dt = startTime.AddSeconds(unixTimeStamp); ? ? ? ? System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff")); ? ? ? ? return dt; ? ? } ? ? public long DataTimeToTimestamp(DateTime dateTime) ? ? { ? ? ? ? //new System.DateTime(1970, 1, 1) ? ? ? ? System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(dateTime); // 當(dāng)?shù)貢r(shí)區(qū) ? ? ? ? long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒數(shù) ? ? ? ? System.Console.WriteLine(timeStamp); ? ? ? ? return timeStamp; ? ? }
三、時(shí)差計(jì)算
? ?/// 計(jì)算兩個(gè)日期的時(shí)間間隔,返回的是時(shí)間間隔的日期差的絕對(duì)值...... ? ?? ? ? /// DateTime1 第一個(gè)日期和時(shí)間 ? ? /// DateTime2 第二個(gè)日期和時(shí)間 ? ? private string DateDiff(DateTime DateTime1, DateTime DateTime2) ? ? { ? ? ? ? string dateDiff = null; ? ? ? ? try ? ? ? ? { ? ? ? ? ? ? TimeSpan ts1 = new TimeSpan(DateTime1.Ticks); ? ? ? ? ? ? TimeSpan ts2 = new TimeSpan(DateTime2.Ticks); ? ? ? ? ? ? TimeSpan ts = ts1.Subtract(ts2).Duration(); ? ? ? ? ? ? dateDiff = ts.Days.ToString() + "天" ? ? ? ? ? ? ? ? ? ? + ts.Hours.ToString() + "小時(shí)" ? ? ? ? ? ? ? ? ? ? + ts.Minutes.ToString() + "分鐘" ? ? ? ? ? ? ? ? ? ? + ts.Seconds.ToString() + "秒"; ? ? ? ? ? ? Debug.Log("時(shí)間相差:" + dateDiff); ? ? ? ? } ? ? ? ? catch ? ? ? ? { ? ? ? ? ? ? print("計(jì)算失??!"); ? ? ? ? } ? ? ? ? ? ? ? ? return dateDiff; ? ? } ? ? /// 已重載.計(jì)算一個(gè)時(shí)間與當(dāng)前本地日期和時(shí)間的時(shí)間間隔,返回的是時(shí)間間隔的日期差的絕對(duì)值. ? ? /// 一個(gè)日期和時(shí)間 ? ? private string DateDiff(DateTime DateTime1) ? ? { ? ? ? ? print(this.DateDiff(DateTime1, DateTime.Now)); ? ? ? ? return this.DateDiff(DateTime1, DateTime.Now); ? ? }
四、判斷系統(tǒng)日期是否超過(guò)既定日期
?public static bool IsProcessTimeOut(string TragetTime = "20230227010000") ? ? { ? ? ? ? DateTime dt = DateTime.ParseExact(TragetTime, "yyyyMMddhhmmss", System.Globalization.CultureInfo.CurrentCulture); ? ? ? ? if (DateTime.Now > dt) ? ? ? ? { ? ? ? ? ? ? //print("超時(shí)了"); ? ? ? ? ? ? return true; ? ? ? ? } ? ? ? ? //print("未超時(shí)"); ? ? ? ? return false; ? ? } ??
總結(jié)
到此這篇關(guān)于C#時(shí)間戳基本使用方法的文章就介紹到這了,更多相關(guān)C#時(shí)間戳使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity登錄注冊(cè)時(shí)限制發(fā)送驗(yàn)證碼次數(shù)功能的解決方法
這篇文章主要為大家詳細(xì)介紹了Unity登錄注冊(cè)時(shí)限制發(fā)送驗(yàn)證碼次數(shù)功能的解決方案,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01深入理解c# checked unchecked 關(guān)鍵字
本篇文章是對(duì)c#中的checked unchecked 關(guān)鍵字進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C# 實(shí)現(xiàn)簡(jiǎn)易的串口監(jiān)視上位機(jī)功能附源碼下載
這篇文章主要介紹了C# 實(shí)現(xiàn)簡(jiǎn)易的串口監(jiān)視上位機(jī)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11利用C#實(shí)現(xiàn)繪制出地球旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了如何利用C#語(yǔ)言實(shí)現(xiàn)繪制出地球旋轉(zhuǎn)的效果,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-02-02