3

入力Excel日付から計算/操作できるC++コードがあります(操作とは、入力日付を特定の増分で増減したり、他の計算を実行したりできることを意味します)。

コードで変数 time_t を使用します。msdn のドキュメントによると、time_t は 1970 年 1 月 1 日から経過した秒数です。そのため、入力日付が与えられた場合、最初に 1970 年 1 月 1 日からの経過秒数を計算し、それを time_t vcariable に格納し、後で他のすべての計算に localtime() を使用します。

入力日付が 1970 年 1 月 1 日以降である限り、コードは正常に動作しますが、それより前の日付では機能しません。

質問: 1970 年 1 月 1 日より前に使用できる他の変数または構造はありますか。または、1970 年 1 月 1 日より前になるように time_t 変数を操作する方法はありますか。

前もって感謝します

私は 1970 年 2 月 1 日から始めます。月を2つ減らしたい。最初に使用する

void localtime(int* py = 0, int* pm = 0, int* pd = 0, 
            int* ph = 0, int* pn = 0, int* ps = 0,
            int* pwday = 0, int* pyday = 0, int* pisdst = 0) const
{
    struct tm* ptm = ::localtime(&t_); 
    if (py) *py = ptm->tm_year + 1900;
    if (pm) *pm = ptm->tm_mon + 1;
    if (pd) *pd = ptm->tm_mday;
    if (ph) *ph = ptm->tm_hour;
    if (pn) *pn = ptm->tm_min;
    if (ps) *ps = ptm->tm_sec;
    if (pwday) *pwday = ptm->tm_wday;
    if (pyday) *pyday = ptm->tm_yday;
    if (pisdst) *pisdst = ptm->tm_isdst;
}

次に、次を使用します: maketime(y, m + count, d, h, n, s); ここで、y=1970、m=2、count=-2、d=1 (上記のコードの出力から。maketime() は次のとおりです。

void maketime(int y, int m, int d, int h = 0, int n = 0, int s = 0)
{
    struct tm t;
    t.tm_year = y - 1900;
    t.tm_mon  = m - 1;
    t.tm_mday = d;
    t.tm_hour = h;
    t.tm_min  = n;
    t.tm_sec  = s;
    t.tm_isdst = -1;

    t_ = ::mktime(&t);
}

これは t_ =-1 になります。

この結果で、 localtime() を再度呼び出し、

     struct tm* ptm = ::localtime(&t_);  

localtime() 内の最初の行は、t_ = -1 の場合に失敗します。

4

1 に答える 1

3

FILETIME同様に、この場合は 100 ナノ秒間隔の整数カウントに基づいており、1601 までさかのぼります。

tmあなたの編集を見た後、問題は単純に思えます:構造体のすべての要素が境界内にあることを確認する必要があります。月を足したり引いたりするときは、月の数が 0 ~ 11 になるまで調整する必要がありtime_tますFILETIME

while (m < 0)
{
    m += 12;
    y -= 1;
}
while (m > 11)
{
    m -= 12;
    y += 1;
}

たとえば、3 月 31 日から 1 か月を減算しようとすると、1 日が 1 か月の日数を超えるとどうなるかわかりません。

于 2012-11-20T20:27:12.510 に答える