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

C# DateTime 與長整型互轉:Ticks、OADate 與資料庫儲存最佳實踐

     編輯:關於C語言

前言

日期時間在不同系統、語言、資料庫間的表示方式不一,導致整合困難。本文詳細說明 C# DateTime 轉長整型的三種核心方式(Ticks、ToOADate、FromOADate),並分析各自適用場景與資料庫儲存建議。

核心屬性:DateTime.Ticks

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 參數

特點

  • 精度最高(100 奈秒),範圍最廣(0001-9999 年)
  • 純整數運算,跨平台、跨語言相容性佳
  • 資料庫儲存首選:單一 BIGINT 欄位,可索引、可排序、可運算

VB6 / COM 互通:OADate 格式

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:001899/12/30 00:00:001970/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()

資料庫儲存建議

方案 1:Ticks (BIGINT) — 最推薦

-- 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 範圍、跨資料庫相容。

方案 2:DateTime/DATETIME2 欄位 — 次選

直接使用資料庫原生日期時間型別。但不同資料庫精度、範圍、時區處理不同(SQL Server DATETIME 精度 3.33ms、MySQL DATETIME 無時區、PostgreSQL TIMESTAMPTZ 有時區)。

方案 3:字串 (ISO 8601) — 僅限特殊需求

2023-01-15T14:30:00.123Z 格式。缺點:佔用空間大、索引效能差、排序需字串比較、時區易混淆。

避坑指南

  • 勿用 double 儲存 Ticks:double 52 位有效位數不足以精確表示 64 位 Ticks(約 10^18),會丟失精度
  • 時區一致性:Ticks 為本地時間或 UTC 取決於來源 DateTime.Kind,跨系統傳輸建議統一用 UTC
  • Unix Timestamp 2038 年問題:32 位有符號整數 2038/01/19 溢位,務必用 64 位

總結

DateTime.Ticks 是 C# 內部最自然、精度最高、資料庫儲存最佳的長整型表示。OADate 專為 COM/VB6/Excel 互通設計。選擇儲存格式時,優先考慮 精度需求、查詢效能、跨系統相容性 三大維度,Ticks 通常是最佳平衡點。

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