gpt4 book ai didi

delphi - 如何将 Delphi TDateTime 转换为微秒精度的字符串

转载 作者:行者123 更新时间:2023-12-03 15:10:04 27 4
gpt4 key购买 nike

我需要将 TDateTime 转换为具有微秒精度的String。如果是毫秒精度,可以使用格式:

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

但我还需要三位数字(微秒)。

可以将小数部分除以 1/86400/1000000,但我正在寻找更有效的方法来转换它。

最佳答案

日期时间的准确性取决于您距“零”有多远。

Delphi TDateTime 实际上是一个 8 字节浮点 Double,零为 12/30/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 甚至可以处理的最小增量。它随使用的日期而变化,距离零越远,量子量就越大:

  • 1899 年 12 月 31 日:±0 纳秒
  • 1900 年 1 月 1 日:±0 纳秒
  • 1970 年 1 月 1 日:±314 纳秒
  • 2000 年 1 月 1 日:±629 纳秒
  • 2016 年 1 月 1 日:±629 纳秒
  • 2038 年 1 月 1 日:±629 纳秒
  • 3000/1/1:±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 structure does support a resolution of 100nsthe SYSTEMTIME structure only supports down to the millisecond :

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

关于delphi - 如何将 Delphi TDateTime 转换为微秒精度的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35200000/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com