日期時間在不同系統、語言、資料庫間的表示方式不一,導致整合困難。本文詳細說明 C# DateTime 轉長整型的三種核心方式(Ticks、ToOADate、FromOADate),並分析各自適用場景與資料庫儲存建議。
Ticks 表示從 0001 年 1 月 1 日 00:00:00.000 起經過的 100 奈秒間隔數(1 Tick = 100 ns = 0.1 微秒)。
// DateTime → long
long ticks = DateTime.Now.Ticks; // 唯讀屬性,直接取得
// long → DateTime
DateTime dt = new DateTime(ticks); // 建構函數接受 long 參數
BIGINT 欄位,可索引、可排序、可運算VB6、VBA、Excel、COM 使用 OLE Automation Date:以 double 表示,整數部分為日期(從 1899/12/30 起算),小數部分為時間比例。
// DateTime → double (OADate)
double oaDate = DateTime.Now.ToOADate();
// double (OADate) → DateTime
DateTime dt = DateTime.FromOADate(oaDate);
private void TestDateTimeLong()
{
double doubleDate = DateTime.Now.ToOADate();
DateTime theDate = DateTime.FromOADate(doubleDate);
Console.WriteLine($"Double value of now: {doubleDate}");
Console.WriteLine($"DateTime from double value: {theDate}");
}
/* 輸出範例:
Double value of now: 37494.661541713
DateTime from double value: 2002-08-26 15:52:37
*/
| 特性 | Ticks (long) | OADate (double) | Unix Timestamp (long) |
|---|---|---|---|
| 基準時間 | 0001/01/01 00:00:00 | 1899/12/30 00:00:00 | 1970/01/01 00:00:00 UTC |
| 資料型別 | long (64-bit 整數) | double (64-bit 浮點數) | long (32/64-bit 整數) |
| 精度 | 100 奈秒 | 約 1 毫秒 | 1 秒 |
| 跨語言相容 | 佳(純整數) | 佳(COM/VB6/Excel 標準) | 佳(Unix/Linux/Web 標準) |
| 資料庫儲存 | BIGINT,推薦 | FLOAT,不推薦(精度問題) | BIGINT,常用 |
| C# 原生支援 | DateTime.Ticks / new DateTime(ticks) | ToOADate() / FromOADate() | DateTimeOffset.ToUnixTimeSeconds() |
-- SQL Server
CREATE TABLE Events (
Id BIGINT PRIMARY KEY,
EventTime BIGINT NOT NULL -- 儲存 Ticks
);
-- 查詢範例:某日期範圍
DECLARE @startTicks BIGINT = 637900000000000000; -- 2023/01/01
DECLARE @endTicks BIGINT = 637908640000000000; -- 2023/02/01
SELECT * FROM Events WHERE EventTime BETWEEN @startTicks AND @endTicks;
優勢:精度最高、整數索引效能最佳、支援完整 DateTime 範圍、跨資料庫相容。
直接使用資料庫原生日期時間型別。但不同資料庫精度、範圍、時區處理不同(SQL Server DATETIME 精度 3.33ms、MySQL DATETIME 無時區、PostgreSQL TIMESTAMPTZ 有時區)。
2023-01-15T14:30:00.123Z 格式。缺點:佔用空間大、索引效能差、排序需字串比較、時區易混淆。
double 52 位有效位數不足以精確表示 64 位 Ticks(約 10^18),會丟失精度DateTime.Kind,跨系統傳輸建議統一用 UTCDateTime.Ticks 是 C# 內部最自然、精度最高、資料庫儲存最佳的長整型表示。OADate 專為 COM/VB6/Excel 互通設計。選擇儲存格式時,優先考慮 精度需求、查詢效能、跨系統相容性 三大維度,Ticks 通常是最佳平衡點。