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

时间:2011-05-19 07:30:45

标签: delphi date delphi-xe date-format

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

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

带有格式设置的“FloatToStr”:丢失精度

DateTimeToStr:取决于区域设置

DateTimeToStr格式设置:?

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

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

4 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:6)

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

编辑:如果你想减少空间,你可以省略所有分隔符并将其格式化为:yyyymmddhhnnssmmmm

答案 2 :(得分:3)

FormatDateTime('yyyymmddhhnnss.zzz',现在)

答案 3 :(得分:0)

您需要多少精度?例如,你可以采用自1970年1月1日以来的毫秒数,并将其存储为转换为字符串的数字。如果空间非常紧张,你可以使用该值。缺点是两者都不会是人类可读的。