覆盖系统日期格式

时间:2013-10-31 15:14:49

标签: delphi delphi-xe5

在我的应用程序中,我正在从一个数据库中读取并写入第二个数据库。该应用程序快速而且肮脏,因此我在查询的AsStringFieldByName上使用ParamByName进行阅读/写作。

除了数据类型为DateDateTime

之外,这适用于我的所有用例

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

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

在此处进一步挖掘会返回使用TFormatSettings来覆盖本地设置的these two个问题。但是,这两个都直接使用StrToDateFormatDateTime中生成的FormatSettings。

所以两个问题

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

2)如果是,如何(如果没有,我有B计划?)

1 个答案:

答案 0 :(得分:6)

对于日期和时间格式使用全局变量是很久以前由原始RTL设计人员犯下的错误。依赖于全局格式设置的函数(如单个参数StrToDate)会保留以便向后兼容,但您不应该使用它们。

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

  1. 使用您的日期格式初始化TFormatSettings实例。
  2. 调用两个参数StrToDate,将TFormatSettings传递给字符串转换为日期。
  3. 调用FormatDateTime重载,在向另一个方向转换时接受TFormatSettings
  4. 现在,问题的主旨。在您描述的场景中,您不应该根据日期和时间使用字符串。使用AsDateTime而不是AsString。如果您碰巧有一个数据库列确实将日期/时间存储为字符串,那么您应该使用基于TFormatSettings的转换函数来解决该设计错误。

    如果您完全没有使用字符串,我无法说服您,那么您需要使用SysUtils中的FormatSettings.ShortDateFormat来控制您的短日期格式。