Delphi:DateTimeToStr输出零时间(午夜)

时间:2016-05-25 07:47:35

标签: delphi

我发现了一个类似的问题here,但它与我想要做的事情无关。我已经在互联网上做了很多研究,我已经确定Delphi正在按设计或预期工作,如果时间为零则省略时间。我有一个显示日期和时间的应用程序。列表视图中的时间,当时间是午夜时,它不显示00:00:00,因此结果看起来不均匀且不合适。

我已经解决了这个仍然是独立的语言环境的方法是添加一个微秒的时间,参见示例代码:

02/12/2020
02/12/2020 00:00:00

随后的输出:

MarkerOptions markerOptions = new MarkerOptions()
    // Set all the options for your marker
    .anchor(0.5, 0.5);

问题是 - 是否有更好的,更正确的方法来实现这一目标?

运行Delphi XE6

2 个答案:

答案 0 :(得分:9)

您可以使用FormatDateTime功能更好地控制日期时间格式。

FormatDateTime('ddddd tt', 44167, TFormatSettings.Create);

注意:无需使用区域设置参数调用TFormatSettings.Create(GetThreadLocale),因为普通TFormattSettings.Create调用将在Windows平台内部使​​用GetThreadLocale

答案 1 :(得分:-1)

这是VCL的“正常”行为。查看来自System.SysUtils的相关代码(来自西雅图,但我认为自XE6以来没有太大变化)。

function DateTimeToStr(const DateTime: TDateTime;
  const AFormatSettings: TFormatSettings): string;
begin
  DateTimeToString(Result, '', DateTime, AFormatSettings);
end;

procedure DateTimeToString(var Result: string; const Format: string;
  DateTime: TDateTime; const AFormatSettings: TFormatSettings);
begin
  ...
  if Format <> '' then AppendFormat(Pointer(Format)) else AppendFormat('C');
  ...

//This is another related part of DateTimeToString.
case Token of
  'C':
    begin
      GetCount;
      AppendFormat(Pointer(AFormatSettings.ShortDateFormat));
      GetTime;
      if (Hour <> 0) or (Min <> 0) or (Sec <> 0) or (MSec <> 0) then
      begin
        AppendChars(' ', 1);
        AppendFormat(Pointer(AFormatSettings.LongTimeFormat));
      end;
    end;

如果datetime值的时间部分等于零,那么只有date才会出现在结果字符串中。

如果您希望始终以单一格式显示日期时间,请按照其他答案的建议更好地使用FormatDateTime