以字符串格式存储日期值的最佳方式是什么?
我不得不日期值(TDateTime
)存储在一个字符串格式。做这个的最好方式是什么?我考虑了以下方法:以字符串格式存储日期值的最佳方式是什么?
FloatToStr
:失去精度,取决于区域设置
`FloatToStr”与格式设置:失去精度
DateTimeToStr
:取决于区域设置
DateTimeToStr
与格式设置:?
有没有其他的选择?他们如何在
- 尺寸方面比较记忆的区域设置
- 独立
- 精密
使用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使用国际标准并提供相关的额外信息 – 2011-05-19 08:52:55
+1很好的答案。谢谢! – jpfollenius 2011-05-20 14:01:08
多少精做你需要什么?例如,你可以说从1970年1月1日以来的毫秒数,并将其存储为转换为字符串的数字。如果空间非常紧张,你可以基于这个价值。缺点是两者都不会是人类可读的。
将整数值保存为一个字符串,而不是浪费空间,并使其更难以读取机器(因为它们需要再次将字符串转换为适当的整数),这又有什么意义呢? – 0xC0000022L 2011-05-22 21:58:37
因为,OP说:“我必须以字符串格式存储日期值(TDateTime)。”我已经知道你的观点,因为这很明显,但我尊重OP的约束。 – 2011-05-22 22:45:26
只需添加,转换为整数就可以消除无效日期值(如“2/30/2011”)的可能性。 – 2011-05-22 22:47:11
一般来说,我会建议在ISO格式的日期时间存储为字符串:YYYY-MM-DD HH:NN:ss.mmmm
编辑:如果你想最大限度地减少空间,你可以离开了所有的分离器和格式是这样的:yyyymmddhhnnssmmmm
你在说什么“ISO”格式?你提出的布局是**不兼容ISO-8601。 – 2011-05-19 08:33:35
它与为ISO 9075-2:2003 – 2011-05-19 09:28:32
中定义的时间戳文字定义的格式相匹配从SQL世界 - 因此它是查询端,而不是存储端格式...我认为BTW yyyymmddhhnnss格式不符合ISO 9075标准。 – 2011-05-19 10:42:51
DateTimeToStr可能会比FloatToStr失去更多的精度。 – Misha 2011-05-19 07:45:18