2

エポックの日付/時刻を 0000 年 1 月 1 日に手動で設定することはできますか?

私は次のことを試しました:

#include <iostream>
#include <chrono>
#include <ctime>

int main(int argc, char*argv[])
{
    std::tm epochStart = {};
    epochStart.tm_sec = 0;
    epochStart.tm_min = 0;
    epochStart.tm_hour = 0;
    epochStart.tm_mday = 0;
    epochStart.tm_mon = 0;
    epochStart.tm_year = -1900;
    epochStart.tm_wday = 0;
    epochStart.tm_yday = 0;
    epochStart.tm_isdst = -1;

    std::time_t base = std::mktime(&epochStart);

    std::chrono::system_clock::time_point baseTp=
        std::chrono::system_clock::from_time_t(base);
    std::time_t btp = std::chrono::system_clock::to_time_t(baseTp);
    std::cout << "time: " << std::ctime(&btp);

}

しかし、これは私に与えます

time: Thu Jan  1 00:59:59 1970
4

3 に答える 3

3

あなたが与えたコード(小さな修正を差し引いて、でtm_mday始まる1)が得られる可能性があります:

Sat Jan  1 00:00:00 0

実際の例

本当の問題は、32 ビットと 64 ビットのどちらを使用しているかということです。32 ビット システムでtime_tは、これも 32 ビットのみであり、1970 年 +/- 68 年に制限されます。

64 ビット システムでは、制限はstd::mktimeとによって与えられますstd::strftime。自分のコードでは、これらの文字列と対応する値の単体テストを行います。

"-2147481748-01-01 00:00:00" maps to -67768040609740800
"2147483647-12-31 23:59:59" maps to 67767976233532799

基盤となる OS 機能にバグがあるため、上記の方法が機能しないシステムがあることにも言及する必要があります。記録のために:私はLinuxを使用しています。

于 2014-01-04T16:47:48.350 に答える