5

在我的应用程序中,我正在读取一个数据库并写入第二个数据库。该应用程序又快又脏,所以我在查询和查询AsString上都使用读/写。FieldByNameParamByName

这适用于我的所有用例,除了数据类型是DateDateTime

据我所知,FieldByName.AsString使用系统ShortDateTime格式将日期返回为(在我的情况下)dd/mm/yyyy。数据库希望将日期写入为yyyy-mm-dd

根据Delphi Basics我应该能够设置ShortDateFormat为我需要的,但在 XE5 中似乎不再是这种情况(正确吗?)

在这里进一步挖掘会返回 两个用于TFormatSettings覆盖本地设置的问题。但是,这两者都直接使用生成的StrToDateFormatSettings FormatDateTime

所以两个问题

1)我可以告诉我的应用程序覆盖系统ShortDateFormat吗?

2) 如果是,怎么做(如果没有,我有 B 计划)?

4

1 回答 1

7

对日期和时间格式使用全局变量是最初的 RTL 设计者很久以前犯的一个错误。保留了依赖于全局格式设置的函数,例如单个参数StrToDate,以实现向后兼容性,但您不应该使用它们。

对于日期/时间和字符串之间的转换,您应该:

  1. TFormatSettings使用您的日期格式初始化一个实例。
  2. 调用这两个参数StrToDate,将您的参数TFormatSettings从字符串转换为日期。
  3. 在另一个方向转换时FormatDateTime接受 a 的调用重载。TFormatSettings

现在,到你问题的主旨。在您描述的场景中,您根本不应该使用字符串作为日期和时间。使用AsDateTime而不是AsString. 如果您碰巧有一个将日期/时间存储为字符串的数据库列,那么您应该使用TFormatSettings基于转换的函数来解决该设计错误。

如果你完全不打算用字符串来做这一切,而且我不能说服你,那么你需要使用FormatSettings.ShortDateFormatfromSysUtils来控制你的短日期格式。

于 2013-10-31T15:25:01.787 回答