对于 Delphi 7 和 Delphi XE4,DateToStr
的单参数重载使用应用程序的全局格式设置。XE4 的实现方式是:
function DateToStr(const DateTime: TDateTime): string;
begin
Result := DateToStr(DateTime, FormatSettings);
end;
因此,它调用了传递全局共享的FormatSettings
变量的两个参数重载。
这个两个参数的重载看起来像这样:
function DateToStr(const DateTime: TDateTime;
const AFormatSettings: TFormatSettings): string;
begin
DateTimeToString(Result, AFormatSettings.ShortDateFormat, DateTime,
AFormatSettings);
end;
所以,使用短日期格式。Delphi 7的实现略有不同,但完全等效。因此,这两个版本的Delphi执行完全相同的操作。它们根据全局格式设置格式化日期。这些格式设置是从用户的区域设置初始化的。唯一合理的结论是差异不在于Delphi版本,而在于程序之间的差异。
明确地说,我要表达的是问题中的这个陈述是不正确的:“这意味着,Delphi 7采用mm/dd/yyyy作为日期格式,而Delphi XE4则采用dd/mm/yyyy。”显然,你的两个程序具有不同的短日期格式。你需要弄清楚为什么这两个程序具有不同的短日期格式才能理解这种行为上的差异。您可以通过在Delphi版本上运行此程序来检查我所说的是否正确:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
Writeln(DateToStr(Date));
end.
当您在同一台计算机上使用相同的用户运行任何Delphi版本编译的程序时,您会发现它们产生相同的输出。
现在,您想要调用一个函数来创建一个人类可读的日期。而且您不想指定格式。所以你必须问问自己程序的目的是什么。不同的人对日期格式有不同的偏好。这是一个地区性问题。美国人喜欢把月份放在日期前面,英国人喜欢日期在月份前面。除了这些之外,还有许多其他变化。
当您调用DateToStr
的单参数版本时,库会将其解释为您要求按当前用户的首选方式格式化日期。在纯正的英国机器上调用DateToStr
会得到与在美国机器上调用时不同的结果。
因此,如果您想要一个预先确定的格式,无论用户的偏好如何都始终相同,则必须指定该格式。您可以通过更改全局FormatSettings
变量或将格式传递给DateToStr
的两个参数版本来实现。
显然,修改FormatSettings
对应用程序有全局影响。您需要决定是否需要这样做。
您需要明白的关键是,日期和时间格式因地区、机器和用户而异。除非您采取明确的措施,否则在格式化日期和时间时,输出将取决于执行代码的用户的语言环境。