簡體   English   中英

在 C++Builder 2009 中為 TDateTime 添加大量秒數

[英]Add lots of seconds to TDateTime in C++Builder 2009

我正在使用 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 ,我得到的輸出是2020.09.30 08:32:21


話雖如此,在 XE 之前, DateUtils單元中的函數已知存在准確性問題,當這些問題得到修復時。 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);

我找到了一些解決方法。 我添加天數,然后添加剩余的秒數。 我認為這是 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM