首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 與 C# 時間戳互轉實戰:跨平台 Web Service 的時間一致性方案

     編輯:Java 相關知識

問題場景

Java Web Service 以 long 傳遞操作時間(System.currentTimeMillis(),1970-01-01 起毫秒數),存入 MySQL TIMESTAMP。.NET 客戶端調用時需生成相同格式的時間戳。

.NET Ticks 與 Java Millis 的換算關係

  • Java:1970-01-01 00:00:00 UTC 起的**毫秒數**。
  • .NET DateTime.Ticks:0001-01-01 00:00:00 起的**百納秒數**(1 Tick = 100 ns = 0.0001 ms)。

核心轉換代碼

// C# 獲取與 Java currentTimeMillis() 等價的長整型
long javaMillis = (DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks) / 10000;

// 或者使用 TimeSpan(更語義化)
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long javaMillis = (long)ts.TotalMilliseconds;

關鍵陷阱:UtcNow vs Now

必須使用 DateTime.UtcNow**,而非 DateTime.Now。

原因:Java 時間戳基於 UTC。若用 Now(本地時間),東八區會相差 8 小時(28800000 ms),導致服務端存入時間偏移。

反向轉換:Java Long → C# DateTime

DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(javaLong);

最佳實踐清單

  1. 傳輸層統一用 **UTC 毫秒長整型**,避免時區/格式歧義。
  2. 數據庫存儲用 TIMESTAMP(MySQL)或 DATETIMEOFFSET(SQL Server),保留時區信息。
  3. 日誌/顯示層再按用戶時區格式化,不污染核心數據。
  4. 單元測試覆蓋跨時區、夏令時切換邊界案例。

掌握這對轉換,即可消除 Java/.NET 異構系統間的時間一致性隱患。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved