網站首頁 編程語言 正文
時間戳轉換:
由于TimeZone類已經過時,官方推薦使用TimeZoneInfo來做時間的轉換。
/// <summary>
/// 本時區日期時間轉時間戳
/// </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);//本地時間轉成UTC時間
TimeSpan ts = (timeUTC - dd);
return (Int64)ts.TotalMilliseconds;//精確到毫秒
}
/// <summary>
/// 時間戳轉本時區日期時間
/// </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日為起始
最初計算機操作系統是32位,而時間也是32為表示。Integer在java內用32位表示,因此32為能表示的最大值就是2147483647。另外一年365天的總秒數是31536000,2147483647/31536000=68.1,也就是說32為能表示的最長時間是68.1,也就是說32為能表示的最長時間就是68年,從1970年開始的話,加上68.1年,實際最終到2038年01月19日03時14分07秒,便會達到最大時間,過了這個時間點,所有32為操作系統時間便會變為10000000 00000000 00000000 00000000,算下來也就是1901年12月13日20時45分52秒,這樣便會出現時間回歸的現象,很多軟件便會運行異常。
到這里我想問題的答案已經顯現出來了,那就是因為用32為來表示時間的最大間隔是68年,而最早出現的UNIX系統考慮到計算機產生的年代個應用的時限,綜合取了1970年1月1日作為UNIX TIME的紀元時間(開始時間),至于時間回歸現象相信隨著64位操作系統可以表示到292,277,026,596年以后了,這是時間已經是兩千億年以后了,所以也不用擔心了。
二、本地時間和UTC時間相互轉化
DateTime localDateTime = DateTime.Now;//本地時間
DateTime utcDateTime = DateTime.UtcNow;//協調世界時
DateTime temp1 = DateTime.SpecifyKind(localDateTime, DateTimeKind.Utc);
//本地時間轉成UTC時間
DateTime temp2 = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Local);
//將UTC時間轉成本地時間
DateTime temp3 = DateTime.SpecifyKind(localDateTime, DateTimeKind.Unspecified);
//既不是本地時間也不是UTC時間
UtcNow的替代方法DateTimeOffset.UtcNow
? ? 前者通過分配DateTimeKind.Utc給其Kind屬性來指示日期和時間值是協調世界時 (UTC), 后者會將日期和時間值分配給 UTC 時間的偏移量 (等于TimeSpan.Zero)。
三、javascript和unix時間戳的使用和轉化
1. 什么是時間戳
首先要清楚JavaScript與Unix的時間戳的區別:
JavaScript時間戳:是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總毫秒數。
Unix時間戳:是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。
可以看出JavaScript時間戳總毫秒數,Unix時間戳是總秒數。
比如同樣是的 2016/11/03 12:30:00 ,轉換為JavaScript時間戳為 1478147400000;轉換為Unix時間戳為 1478147400。
2. JavaScript時間戳相互轉換
2.1 C# DateTime轉換為JavaScript時間戳
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區
long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds; // 相差毫秒數
System.Console.WriteLine(timeStamp);
2.2 JavaScript時間戳轉換為C# DateTime
long jsTimeStamp = 1478169023479;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區
DateTime dt = startTime.AddMilliseconds(jsTimeStamp);
System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));
3. Unix時間戳相互轉換
3.1 C# DateTime轉換為Unix時間戳
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區
long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒數
System.Console.WriteLine(timeStamp);
3.2 Unix時間戳轉換為C# DateTime
long unixTimeStamp = 1478162177;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區
DateTime dt = startTime.AddSeconds(unixTimeStamp);
System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));
應用:
一、獲取系統時間的時間戳
獲取系統時間的時間戳
? ? public string GetTimeStamp()
? ? {
? ? ? ? //DateTime.Now獲取的是電腦上的當前時間
? ? ? ? ? ?TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
? ? ? ? return Convert.ToInt64(ts.TotalSeconds).ToString();//精確到秒
? ? }
獲取世界標準時區的當前時間的時間戳
? ? public static string GetUtcNowTimeStamp()
? ? {
? ? ? ? //DateTime.UtcNow獲取的是世界標準時區的當前時間(比北京時間少8小時)
? ? ? ? TimeSpan ts = DateTime.Now ?- new DateTime(1970, 1, 1, 0, 0, 0, 0);
? ? ? ? return Convert.ToInt64(ts.TotalMilliseconds).ToString();//精確到毫秒
? ? }
二、時間戳和DateTime的相互轉換
? ?/// 時間戳轉換為DataTime
? ? public DateTime TimestampToDataTime(long unixTimeStamp)
? ? { ? ? ? ?
? ? ? ? System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區
? ? ? ? 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); // 當地時區
? ? ? ? long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒數
? ? ? ? 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;
? ? }
? ? /// 已重載.計算一個時間與當前本地日期和時間的時間間隔,返回的是時間間隔的日期差的絕對值.
? ? /// 一個日期和時間
? ? private string DateDiff(DateTime DateTime1)
? ? {
? ? ? ? print(this.DateDiff(DateTime1, DateTime.Now));
? ? ? ? return this.DateDiff(DateTime1, DateTime.Now);
? ? }
四、判斷系統日期是否超過既定日期
?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;
? ? } ??
總結
原文鏈接:https://blog.csdn.net/wobaiwodedukuku/article/details/124819182
相關推薦
- 2022-04-23 C#多線程系列之async和await用法詳解_C#教程
- 2022-04-16 WPF框架Prism中View?Injection用法介紹_基礎應用
- 2022-10-11 golang游戲等資源壓縮包創建和操作方法_Golang
- 2022-09-15 React組件三大屬性之state,props,refs_React
- 2022-09-01 前端工程Monorepo項目管理方式_其它綜合
- 2022-06-25 C++虛函數表的原理與使用解析_C 語言
- 2022-09-07 Go泛型應用工廠方法及泛型使用_Golang
- 2022-08-26 C++?超詳細示例講解list的使用_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支