【问题标题】:Delphi: format datetime without time part in midnightDelphi:在午夜格式化没有时间部分的日期时间
【发布时间】:2019-09-30 13:02:32
【问题描述】:

德尔福西雅图:

我想在 cxGridDBTableView(Devexpress,cxGrid)中使用此规则(作为 DateTimeToStr)格式化日期时间字段:

  • 午夜 - 00:00:00 - 时间部分不可见
  • 其他时间 - 时间部分可见

我记得 formatdatetime HH:NN:SS 显示时间部分“每次”。

您知道模拟 DateTimeToStr 的选项吗? 我想在存储库中使用它。

谢谢!

【问题讨论】:

  • 你使用哪个网格?
  • @DelphiCoder:答案不应该取决于哪个网格。未来的读者可能会使用不同的。
  • @MartynA:我同意。我只是想更清楚一点。
  • TcxGrid (Devexpress)、TcxGridDBTableView - 以及那个存储库。

标签: datetime delphi time format repository


【解决方案1】:

使用“c”作为字段的DisplayFormat。文档说明了这一点:

使用 ShortDateFormat 全局给定格式的日期 变量,后跟时间,使用的格式由 LongTimeFormat 全局变量。如果时间不显示 DateTime 值的小数部分为零。

【讨论】:

  • 注意,这适用于FormatDateTime(),不适用于DateTimeToStr()
  • 问题是关于一个字段。这就是为什么我提到了 DisplayFormat 属性,并且引用直接来自相应的文档:docwiki.embarcadero.com/Libraries/Rio/en/…
【解决方案2】:

感谢 Remy Lebeau 和 Uwe Raabe,我做了以下示例:

function GridDateTime: string;
var
  dt: TDateTime;
  fs: TFormatSettings;
begin
  dt := Now;
  fs := TFormatSettings.Create;
  fs.LongTimeFormat := 'HH:NN:SS';
  result := DateTimeToStr(dt, fs);
end;

在与@UweRaabe 的其他答案相关的 cmets 中,他们正在讨论格式字符串 'c' 以及它是否适用于 FormatDateTime()DateTimeToStr()

答案是:两者都适用!

这两个函数在内部调用DateTimeToString(),它有一个字符串参数FormatFormatDateTime()可以直接设置,DateTimeToString()不行。那里设置为空。那么当Format 是一个空字符串时,DateTimeToString() 是什么?它添加了一个“C”:

if Format '' then AppendFormat(Pointer(Format)) else AppendFormat('C');

因此,是否使用'C' 作为格式字符串并不重要。

注意:基于 Delphi 10.2.3 Tokyo!

【讨论】:

  • 这不是一个好方法。它受语言环境表示的影响,一般来说效率不是很高。如果您想这样做,请改用:var dt: TDateTime; begin dt := Now; if TimeOf(dt) < EncodeTime(0,0,1,0) then grid[x, y] := DateToStr(dt) else grid[x, y] := DateTimeToStr(dt); end;
  • 谢谢@RemyLebeau,我误解了关于午夜部分的问题。 OP 不希望文本“午夜”出现在他的网格中。
  • 如果这不能回答 OP 的问题,那么您应该使用其下方的 delete 链接将其删除。
  • @Jerry: 目前正在改进我的分析器
  • @MartynA:仅当 OP 因为DisplayFormat 而使用某些数据库组件时。如果我的新答案还是不好,那我就删了!
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2018-07-10
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多