我必须以字符串格式存储日期值(TDateTime
)。做这个的最好方式是什么?我考虑了以下方法:
FloatToStr
:失去精确度,取决于区域设置
DateTimeToStr
:取决于区域设置
DateTimeToStr
格式设置:?
还有其他选择吗?他们如何比较
答案 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日以来的毫秒数,并将其存储为转换为字符串的数字。如果空间非常紧张,你可以使用该值。缺点是两者都不会是人类可读的。