【问题标题】:Default Date Format in Delphi 7 and Delphi XE4Delphi 7 和 Delphi XE4 中的默认日期格式
【发布时间】:2013-12-09 09:39:15
【问题描述】:

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

例如:

DateToStr(IncDay(Today, -9)) 计算结果为 11/30/2013 in Delphi 730/11/3013 in Delphi XE4

这意味着,Delphi 7 以mm/dd/yyyy 为日期,而 Delphi XE4 以dd/mm/yyyy 为日期。在Delphi XE4哪里可以设置成mm/dd/yyyy

注意:我不想在进行此转换的每个地方都使用格式设置修改代码。我只想在一个地方做这个改变,可能是Delphi XE4的一些设置文件。

【问题讨论】:

  • 反对票是怎么回事?
  • 最安全的方法是明确使用 FormatDateTime('yyyyddmm',TDateTime)。这样您就不必依赖格式设置,例如,当它在另一个区域使用时可能会破坏您的应用程序。 (当然是 FormatDateTime('mm/dd/yyyy',TDateTime),但我对 yyyymmdd 有强烈的偏好)
  • @PieterB 还有DateToStr的两个参数重载
  • @DavidHeffernan 这也可以。我只是不喜欢依赖全局格式设置,所以我总是很明确。
  • @PieterB 这取决于您的需求。如果您想使用用户的语言环境,则可以依赖FormatSettings。这就是他们的目的。如果你想要一种文化不变的格式,那么显然你需要明确。

标签: delphi date delphi-7 delphi-xe4


【解决方案1】:

对于 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 .生成的程序应在同一台计算机上运行。
  • @DavidHeffernan - 你是对的。我在不同的机器上运行 Delphi 7 和 XE4,控制面板(区域和语言选项)中的日期和时间设置不同。我在Delphi XE4机器上做了mm/dd/yyyy,问题解决了。
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2014-05-15
  • 2013-08-18
  • 1970-01-01
  • 2013-11-04
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多