我需要将TDateTime
转换为具有微秒精度的String
。
在毫秒精度的情况下,可以使用格式:
DateTimeToString(Result, 'd.m.yyyy hh:nn:ss.zzz', dateTime);
但我还需要三个数字(微秒)。
可以取小数部分除以1/86400/1000000,但我正在寻找更有效的方法来转换它。
答案 0 :(得分:5)
日期时间的准确性取决于您离"零" 的距离。
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
甚至可以处理的最小增量。它随着使用的日期而变化,因为距离零越远,量子量越大:
所以目前,DateTime 可以给你一个大约半微秒的分辨率。
Windows FILETIME
structure does support a resolution of 100ns,the 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)
返回最多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