簡體   English   中英

如何將 Delphi TDateTime 轉換為具有微秒精度的字符串

[英]How to convert Delphi TDateTime to String with microsecond precision

我需要將TDateTime轉換為具有微秒精度的String 在毫秒精度的情況下,可以使用格式:

DateTimeToString(Result, 'd.m.yyyy hh:nn:ss.zzz', dateTime);

但我還需要三位數字(微秒)。

可以取小數部分並將其除以 1/86400/1000000,但我正在尋找更有效的方法來轉換它。

日期時間的准確性取決於您離“零”有多遠。

Delphi TDateTime實際上是一個 8 字節的浮點Double ,零是12/31/1899 12:00:00 am

我們可以通過將浮點日期時間增加盡可能小的量子來計算出TDateTime的精度:

function AddQuantumToDateTime(const dt: TDateTime): TDateTime;
var
   overlay: Int64 absolute Result;
begin
   Result := dt;
   overlay := overlay+1;
end;

有了這個,我們可以計算出TDateTime甚至可以處理的最小增量。 它隨着使用的日期而變化,因為您離零越遠,量子數量就越大:

  • 12/31/1899 :±0 納秒
  • 1900 年 1 月 1 日:±0 納秒
  • 1970 年 1 月 1 日:±314 納秒
  • 2000 年 1 月 1 日:±629 納秒
  • 2016 年 1 月 1 日:±629 納秒
  • 2038 年 1 月 1 日:±629 納秒
  • 1/1/3000 :±5,029 納秒
  • 1/1/4000 :±10,058 納秒
  • 1/1/5000 :±20,117 納秒
  • 1/1/6000 :±20,117 納秒
  • 1/1/7000 :±20,117 納秒
  • 1/1/8000 :±40,233 納秒
  • 1/1/9000 :±40,233 納秒
  • 1/1/9999 :±40,233 納秒

因此,就目前而言,DateTime可以為您提供大約半微秒的分辨率。

雖然 Windows FILETIME結構確實支持 100ns 的分辨率SYSTEMTIME結構只支持到毫秒

typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;

Microsoft SQL Server 的新datetime2(7)返回具有多達七位 (100 ns) 的小數秒精度的日期時間字符串:

SELECT CAST('20160802' AS datetime2(6)) AS TheNow

TheNow
==========================
2016-08-02 00:00:00.000000

那么您的問題是如何將TDateTime轉換為包含微秒(十億分之一秒)精度的字符串。 你已經有了答案:

function DateTimeToStrUs(dt: TDatetime): string;
var
    us: string;
begin
    //Spit out most of the result: '20160802 11:34:36.'
    Result := FormatDateTime('yyyymmdd hh":"nn":"ss"."', dt);

    //extract the number of microseconds    
    dt := Frac(dt); //fractional part of day
    dt := dt * 24*60*60; //number of seconds in that day
    us := IntToStr(Round(Frac(dt)*1000000));

    //Add the us integer to the end:
    // '20160801 11:34:36.' + '00' + '123456'
    Result := Result + StringOfChar('0', 6-Length(us)) + us;
end;
  

在哪里:

DateTimeToStrUs(Now)

返回:

20160802 11:34:36.482364

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM