c++ - 在 C++Builder 2009 中为 TDateTime 添加大量秒数
问题描述
我正在使用 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
?
解决方案
您的代码没有任何问题。实际上,使用您显示的值,我无法重现您描述的问题。2020.09.30 08:32:21
正如预期的那样,我得到的输出是。
话虽如此,当这些问题得到修复时,已知该单元中的功能在DateUtils
XE 之前存在准确性问题。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);
推荐阅读
- python - 有没有更优雅的方式在 Python 中引发错误?[具体案例]
- c++ - 实现 Gossip 协议:发送成员表会导致收到垃圾值
- r - 在 R 中构建时间戳数据的月度快照
- mysql - 按 DISTINCT 列的子查询组
- c++ - 在 VS Code 中包含单独根目录的 includePath 属性
- python - 训练一个基本的神经网络,接收一系列帧/数字对,并在获得新的帧序列后生成新的数字
- angular - Angular10 DevOps 扩展 RestApi
- github - 如何进行 github PR 请求审查整个文件?
- python - Selenium:从中获取变量数据