【问题标题】:What's the best way to store date values in string format?以字符串格式存储日期值的最佳方法是什么?
【发布时间】:2011-08-28 15:42:53
【问题描述】:

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

FloatToStr:精度下降,取决于区域设置

带有格式设置的`FloatToStr':精度降低

DateTimeToStr :取决于区域设置

DateTimeToStr 带有格式设置:?

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

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

【问题讨论】:

  • DateTimeToStr 可能会比 FloatToStr 失去更多的精度。

标签: delphi date delphi-xe date-format


【解决方案1】:

使用 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”。 p>

为了获得更好的分辨率,您可以通过在逗号或点字符后添加分数来添加亚秒级计时:例如要表示“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;

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

【讨论】:

  • +1 用于使用国际标准并提供相关的额外信息
【解决方案2】:

FormatDateTime('yyyymmddhhnnss.zzz', 现在)

【讨论】:

  • 我建议使用 yyyymmddhhnnss.zzz 作为格式字符串。这样,它将独立于语言环境,并且您还可以对它们进行排序。
  • HeartWare 是对的,store 日期以 'dd/mm' 开头并不是一个好主意。可能更适合在非英语国家/地区显示,但对于计算机 POV 来说不太合乎逻辑。
  • 已编辑以反映上述 cmets。顺便说一句,我总是将时间存储为 UTC 时间。
  • @A.Bouchez 呃,“原始”英国国家(英格兰)也使用 d-m-y 顺序。我相信只有一个月在一天之前到来的州。但我能理解为什么你会认为这是一个英语的东西,所有的英语软件都来自美国......
  • @Marjan 你是对的......从我的“douce France”来看,我的观点有点粗鲁和错误。 ;)
【解决方案3】:

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

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

【讨论】:

  • 您说的是哪种“ISO”格式?您建议的布局与 ISO-8601 兼容。
  • 它与为 ISO 9075-2:2003 中定义的时间戳文字定义的格式相匹配
  • 来自 SQL 世界 - 所以它用于查询端,而不是存储端格式...我认为顺便说一句,yyyymmddhhnnss 格式不符合 ISO 9075。
  • 我从未声称没有分隔符的格式符合 ISO 9075。 yyyy-mm-dd hh:nn:ss.zzz 一个是。
【解决方案4】:

您需要多少精度?例如,您可以取自 1970 年 1 月 1 日以来的毫秒数,并将其存储为转换为字符串的数字。如果空间真的很紧,你可以base64那个值。缺点是两者都不是人类可读的。

【讨论】:

  • 将整数值保存为字符串而不是浪费空间并使机器更难读取(因为它们需要再次将字符串转换为正确的整数)还有什么意义?跨度>
  • 因为,OP 说:“我必须以字符串格式存储日期值 (TDateTime)。”我已经知道你的观点,因为这很明显,但我尊重了 OP 的约束。
  • 只是添加,转换为整数消除了无效日期值的可能性,例如“2/30/2011”。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多