【问题标题】:Time math in DelphiDelphi中的时间数学
【发布时间】:2008-10-03 18:00:15
【问题描述】:

我有一个非常不寻常的问题(对我来说)。我正在编写一个应用程序,它允许用户通过明确的日期(将我的日期更改为 1955 年 6 月 3 日)或使用按钮递增(前进 1 个月)来向前或向后更改系统时间。

我写这篇文章是为了帮助我的一些用户测试一些需要像这样跳转的软件,以模拟计费系统的真实使用情况。

在 Delphi 中更改时间当然非常简单:

SetDateTime(2008,05,21,16,07,21,00);

但我不确定 Delphi (2006) 是否有任何内置的日期数学助手,这是我最不喜欢的东西之一 :)

对于处理此问题的最佳方法有什么建议吗?我宁愿保持原生,因为 winapi 日期时间调用很糟糕。

谢谢!

【问题讨论】:

    标签: delphi date time


    【解决方案1】:

    正如 gabr 和 mliesen 所提到的,看看 DateUtilsSysUtils 单位,有用的功能包括。

    【讨论】:

    • 这个答案比投票最高的答案要完整得多。
    • 对于那些寻找可以处理时间的东西的人,DaetUtils 还包含 IncHour、IncMinute、IncSecond、IncMilliSecond
    【解决方案2】:

    DateUtils 单元中有很多助手。

    【讨论】:

      【解决方案3】:

      如果当前月份的某天在您未来的月份中不存在,您希望发生什么?比如说,1 月 31 日 + 1 个月?如果您增加年份并且开始日期是闰年的 2 月 29 日,您会遇到同样的问题。所以不可能有一个通用的 IncMonth 或 IncYear 函数在所有日期都一致地工作。

      对于任何感兴趣的人,我衷心推荐 Julian Bucknall's article 了解此类计算所固有的复杂性 关于如何计算两个日期之间的月数和天数。

      以下是唯一可能不会将异常引入通用日期数学的通用日期增量函数。但它只能通过将责任转回给可能具有他/她正在编程的特定应用程序的确切要求的程序员来实现这一点。

      IncDay - 加或减天数。
      IncWeek - 加或减周数。

      但是,如果您必须使用内置函数,那么至少要确保它们执行您希望它们执行的操作。查看 DateUtils 和 SysUtils 单位。拥有这些函数的源代码是 Delphi 最酷的方面之一。话虽如此,以下是内置函数的完整列表:

      IncDay - 加或减天数。
      IncWeek - 加或减周数。
      IncMonth - 加或减月数。
      IncYear - 加或减年数。

      至于您问题的第二部分,如何使用 TDatetime 设置系统日期和时间,以下从另一个帖子中偷来的无耻代码就可以完成这项工作:

      procedure SetSystemDateTime(aDateTime: TDateTime);
      var
        lSystemTime: TSystemTime;
        lTimeZone: TTimeZoneInformation;
       begin
        GetTimeZoneInformation(lTimeZone);
        aDateTime := aDateTime + (lTimeZone.Bias / 1440);
        DateTimeToSystemTime(aDateTime, lSystemTime);
        setSystemTime(lSystemTime);
      end;
      

      【讨论】:

        【解决方案4】:

        VCL 具有双精度类型(TDate 和 TDateTime),您可以在算术运算中使用。

        另见 EncodeDate 和 DecodeDate

        【讨论】:

          【解决方案5】:

          SysUtils 单元中有很多助手(正如 gabr 指出的,在 DateUtils 中也是如此)。

          【讨论】:

            猜你喜欢
            • 2011-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-06
            • 1970-01-01
            相关资源
            最近更新 更多