Delphi 7和Delphi XE4中的默认日期格式

3

我正在将Delphi 7应用程序迁移到Delphi XE4。在两个版本中,DateToStr函数的行为有所不同。

例如:

DateToStr(IncDay(Today, -9)) 在Delphi 7中计算结果为 11/30/2013,而在Delphi XE4中计算结果为 30/11/3013

这意味着,在Delphi 7中,日期采用mm/dd/yyyy格式,而在Delphi XE4中,则采用dd/mm/yyyy格式。那么,在Delphi XE4中,我可以把它设置为mm/dd/yyyy吗?

注意:我不希望在每个需要进行此转换的地方修改代码格式设置。我只想在一个地方进行更改,可能是Delphi XE4的某个设置文件。


1
最安全的方法是明确使用FormatDateTime('yyyyddmm',TDateTime)。这样,您就不必依赖formatsettings,因为在其他地区使用时,它可能会破坏您的应用程序。(当然也可以使用FormatDateTime('mm/dd/yyyy',TDateTime),但我更喜欢yyyymmdd) - Pieter B
@PieterB 我同意ymd是更好的日期格式。然而,我也不喜欢无必要地将自己的喜好强加给别人。(无论他们的偏好多么不合逻辑。)所以我的做法如下:(1)对于日志文件和文本存储,一致性和搜索/排序比用户需求更重要。(2)对于基于文本的通信,再次明确无歧义比用户偏好更重要。(3)对于屏幕显示,我宁愿满足用户的怪癖,并期望其他开发者容忍我的。 - Disillusioned
@whosrdaddy 被踩的一个好理由(虽然不是我)是_偏爱_最_不合逻辑_的日期格式,而这种格式通常被广泛使用。有人会用十位数、个位数,然后是百位数来表示一个人的年龄吗?那么为什么他们要用这种方式来表示日期呢?;) - Disillusioned
对于不需要向最终用户展示的东西,例如日志文件:这并不是关于偏好,而是关于使用标准:ISO 8601。一旦您开始向用户显示日期,请使用本地格式。 - Pieter B
@PieterB 似乎你没有理解我的意思。你是否熟悉“X 胜过 Y”这个说法?因为基本上你已经同意我的观点了。 ;) - Disillusioned
显示剩余4条评论
1个回答

8

对于 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对应用程序有全局影响。您需要决定是否需要这样做。


您需要明白的关键是,日期和时间格式因地区、机器和用户而异。除非您采取明确的措施,否则在格式化日期和时间时,输出将取决于执行代码的用户的语言环境。


你可以通过在两个Delphi版本上运行此程序来验证我的说法是否正确:我怀疑OP在一台计算机上运行Delphi 7,在另一台计算机上运行Delphi XE4。应该在同一台计算机上运行生成的程序。 - user743382
2
@DavidHeffernan - 你说得对。我在不同的机器上运行Delphi 7和XE4,控制面板(区域和语言选项)中的日期和时间设置是不同的。我在Delphi XE4机器上设置为mm/dd/yyyy,问题得到了解决。 - user1556433

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接