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

问题描述:

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

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

`FloatToStr”与格式设置:失去精度

DateTimeToStr:取决于区域设置

DateTimeToStr与格式设置:?

有没有其他的选择?他们如何在

  • 尺寸方面比较记忆的区域设置
  • 独立
  • 精密
+0

DateTimeToStr可能会比FloatToStr失去更多的精度。 – Misha 2011-05-19 07:45:18

使用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

+1使用国际标准并提供相关的额外信息 – 2011-05-19 08:52:55

+1

+1很好的答案。谢谢! – jpfollenius 2011-05-20 14:01:08

多少精做你需要什么?例如,你可以说从1970年1月1日以来的毫秒数,并将其存储为转换为字符串的数字。如果空间非常紧张,你可以基于这个价值。缺点是两者都不会是人类可读的。

+0

将整数值保存为一个字符串,而不是浪费空间,并使其更难以读取机器(因为它们需要再次将字符串转换为适当的整数),这又有什么意义呢? – 0xC0000022L 2011-05-22 21:58:37

+1

因为,OP说:“我必须以字符串格式存储日期值(TDateTime)。”我已经知道你的观点,因为这很明显,但我尊重OP的约束。 – 2011-05-22 22:45:26

+1

只需添加,转换为整数就可以消除无效日期值(如“2/30/2011”)的可能性。 – 2011-05-22 22:47:11

一般来说,我会建议在ISO格式的日期时间存储为字符串:YYYY-MM-DD HH:NN:ss.mmmm

编辑:如果你想最大限度地减少空间,你可以离开了所有的分离器和格式是这样的:yyyymmddhhnnssmmmm

+1

你在说什么“ISO”格式?你提出的布局是**不兼容ISO-8601。 – 2011-05-19 08:33:35

+0

它与为ISO 9075-2:2003 – 2011-05-19 09:28:32

+0

中定义的时间戳文字定义的格式相匹配从SQL世界 - 因此它是查询端,而不是存储端格式...我认为BTW yyyymmddhhnnss格式不符合ISO 9075标准。 – 2011-05-19 10:42:51

的FormatDateTime( 'yyyymmddhhnnss.zzz',现在)

+3

我建议使用yyyymmddhhnnss.zzz作为格式字符串。这样,它将独立于区域设置,最重要的是您可以对它们进行排序。 – HeartWare 2011-05-19 08:26:23

+1

HeartWare是对的,在开始时用* dd/mm存储*日期不是个好主意。也许更适合在非英语国家展示,但对于计算机POV而言不太合乎逻辑。 – 2011-05-19 08:35:13

+0

编辑以反映上述评论。顺便说一句,我总是把时间存储为UTC时间。 – Misha 2011-05-19 08:54:39