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