0

我正在使用 C++Builder 2009。我有一个开始日期2000/01/01和从这个时间戳开始的秒数。我想TDateTime用这个日期创建一个。我创建一个起点TDateTime并添加秒数。

  TDateTime dt(2000,1,1,0,0,0,0);
  AnsiString sdt = "";
  DateTimeToString(sdt, "yyyy/mm/dd hh:nn:ss", dt);
  closeDateTime = dt;
  closeDateTime = IncSecond(closeDateTime,footer->secondsFromZeroDateOfFinishDocument);
  DateTimeToString(sdt, "yyyy/mm/dd hh:nn:ss", closeDateTime);

增加超过 650M 秒后,TDateTime只增加了 23 天,但应该增加了 20 年以上。请参阅下面的屏幕截图。

如何将此秒数添加到TDateTime

图片

图片

图片

4

2 回答 2

1

您的代码没有任何问题。实际上,使用您显示的值,我无法重现您描述的问题。2020.09.30 08:32:21正如预期的那样,我得到的输出是。


话虽如此,当这些问题得到修复时,已知该单元中的功能在DateUtilsXE 之前存在准确性问题。C++Builder 2009 早于 XE。因此,如果您无法升级到最新版本,您至少可以应用在更高版本中使用的相同修复:

#include <SysUtils.hpp>

namespace fixed {
    TDateTime __fastcall IncSecond(const TDateTime AValue, const __int64 ANumberOfSeconds = 1)
    {
        TTimeStamp TS = DateTimeToTimeStamp(AValue);
        double TempTime = TimeStampToMSecs(TS);
        // if the above call to TimeStampToMSecs() proves to be inaccurate (it did
        // in my test in C++, but worked fine in Delphi), you can use this instead:
        // double TempTime = (double(TS.Date) * double(MSecsPerDay)) + double(TS.Time);
        TempTime = TempTime + (ANumberOfSeconds * MSecsPerSec);
        TS = MSecsToTimeStamp(TempTime);
        return TimeStampToDateTime(TS);
    }
}

TDateTime dt(2000,1,1,0,0,0,0);
AnsiString sdt = "";
DateTimeToString(sdt, "yyyy/mm/dd hh:nn:ss", dt);
closeDateTime = dt;
closeDateTime = fixed::IncSecond(closeDateTime,footer->secondsFromZeroDateOfFinishDocument);
DateTimeToString(sdt, "yyyy/mm/dd hh:nn:ss", closeDateTime);
于 2020-10-02T00:50:34.573 回答
0

我找到了一些解决方法。我添加天数,然后添加剩余的秒数。我认为这是 RTL 中的错误,但我无法升级此代码库。

  TDateTime dt(2000,1,1,0,0,0,0);
  AnsiString sdt = "";
  DateTimeToString(sdt, "yyyy/mm/dd hh:nn:ss", dt);
  closeDateTime = dt;
  int seconds = footer->secondsFromZeroDateOfFinis775hDocument;
  int days = seconds / 86400;
  int restOfSeconds = seconds - days*86400;
  closeDateTime = IncDay(closeDateTime,days);
  closeDateTime = IncSecond(closeDateTime,restOfSeconds);
  DateTimeToString(sdt, "yyyy/mm/dd hh:nn:ss", closeDateTime);
于 2020-09-30T10:10:11.277 回答