在我的应用程序中,我正在从一个数据库中读取并写入第二个数据库。该应用程序快速而且肮脏,因此我在查询的AsString
和FieldByName
上使用ParamByName
进行阅读/写作。
除了数据类型为Date
或DateTime
据我所知,FieldByName.AsString
使用系统ShortDateTime
格式将日期返回为(在我的情况下) dd / mm / yyyy 。数据库期望将日期写为 yyyy-mm-dd
根据Delphi Basics,我应该可以将ShortDateFormat
设置为我需要的内容,但似乎在XE5中不再是这种情况(正确吗?)
在此处进一步挖掘会返回使用TFormatSettings
来覆盖本地设置的these two个问题。但是,这两个都直接使用StrToDate
和FormatDateTime
中生成的FormatSettings。
所以两个问题
1)我可以告诉我的应用程序覆盖系统ShortDateFormat
吗?
2)如果是,如何(如果没有,我有B计划?)
答案 0 :(得分:6)
对于日期和时间格式使用全局变量是很久以前由原始RTL设计人员犯下的错误。依赖于全局格式设置的函数(如单个参数StrToDate
)会保留以便向后兼容,但您不应该使用它们。
对于日期/时间和字符串之间的转换,您应该:
TFormatSettings
实例。StrToDate
,将TFormatSettings
传递给字符串转换为日期。FormatDateTime
重载,在向另一个方向转换时接受TFormatSettings
。现在,问题的主旨。在您描述的场景中,您不应该根据日期和时间使用字符串。使用AsDateTime
而不是AsString
。如果您碰巧有一个数据库列确实将日期/时间存储为字符串,那么您应该使用基于TFormatSettings
的转换函数来解决该设计错误。
如果您完全没有使用字符串,我无法说服您,那么您需要使用SysUtils
中的FormatSettings.ShortDateFormat
来控制您的短日期格式。