以字符串格式存储日期值的最佳方法是什么?

jpf*_*ius 12 delphi date date-format delphi-xe

我必须以TDateTime字符串格式存储日期值().做这个的最好方式是什么?我考虑了以下方法:

FloatToStr :丢失精度,取决于区域设置

带有格式设置的`FloatToStr':失去精度

DateTimeToStr :取决于区域设置

DateTimeToStr 格式设置:?

还有其他选择吗?他们如何比较

  • 内存大小
  • 区域设置的独立性
  • 精确

Arn*_*hez 15

使用ISO-8601格式,详见http://en.wikipedia.org/wiki/ISO_8601

如果需要节省存储空间,可以使用"紧凑"布局,例如'20090621T054523'.

你可以用FormatDateTime('yyyymmddThhnnss',aDateTime)它来制作它.

关于时区和本地化(来自维基百科):

ISO 8601中没有时区指示符.时间仅表示为本地时间或与UTC相关.

如果没有给出具有时间表示的UTC关系信息,则假定时间是在本地时间.虽然在同一时区进行通信时假定当地时间可能是安全的,但是当用于跨不同时区的通信时,它是不明确的.通常最好使用标准符号表示时区(区域指示符).

因此,您应该更好地将时间转换为UTC,然后在时间戳的末尾附加"Z".或者根据您当地的时区使用+ hh/-hh.以下时间均指同一时刻:"18:30Z","22:30 + 04","1130-0700"和"15:00-03:30".

为了获得更好的分辨率,您可以通过在逗号或点字符后添加分数来添加亚秒级时序:例如,表示"14小时,30分钟,10秒和500毫秒",将其表示为"14:30: 10,5","143010,5","14:30:10.5"或"143010.5".您可以添加几个小数以提高分辨率.

如果您需要快速的Iso8601转换例程(使用UTF-8内容),请查看SynCommons.pas中的相应部分.它比默认SysUtils功能快得多.

PS:

如果您的目的只是将TDateTime作为文本存储在纯Delphi应用程序中,您可以使用非标准但快速:

function DateTimeToText(const aDateTime: TDateTime): string;
begin
  result := IntToStr(PInt64(@aDateTime)^);
end;

function TextToDateTime(const aText: string): TDateTime;
begin
  PInt64(@result)^ := StrToInt64Def(aText,0);
end;
Run Code Online (Sandbox Code Playgroud)

使用内存结构的Int64二进制布局TDateTime/double将比任何其他浮点相关转换更快.


Tho*_*ler 6

一般来说,我建议将日期时间以ISO格式存储为字符串:yyyy-mm-dd hh:nn:ss.mmmm

编辑:如果你想最小化空间,你可以省略所有分隔符并格式化如下:yyyymmddhhnnssmmmm