簡體   English   中英

如何將 system_clock::now() 與 c++20 中的本地時間進行比較?

[英]How can I compare system_clock::now() to a local time in c++20?

我正在測試如下庫:

std::chrono::system_clock::time_point FromDateTime(const DateTime& dateTime)
{
    std::tm tm{};
    tm.tm_year = dateTime.Year - 1900;
    tm.tm_mon = dateTime.Month - 1;
    tm.tm_mday = dateTime.Day;
    tm.tm_hour = dateTime.Hour;
    tm.tm_min = dateTime.Minute;
    tm.tm_sec = dateTime.Second;

    const auto& time = std::mktime(&tm);
    const auto& timePoint = std::chrono::system_clock::from_time_t(time);

    return timePoint;
}

TEST_F(MyLibraryFixture, GetDateTime)
{
    // Arrange
    const auto& now = std::chrono::system_clock::now();

    // Act
    const auto& actual = _testee->GetDateTime();

    // Assert
    const auto& timeDiscrepanceInSec = std::chrono::duration_cast<std::chrono::seconds>(FromDateTime(actual) - now);
    ASSERT_TRUE(timeDiscrepanceInSec.count() < 10);
}

DateTime類型只是具有上述使用字段的原始結構。 通話

_testee->GetDateTime();

返回一個DateTime結構,日期時間實際上是本地時間 由於我正在測試的庫固有的某種原因,我需要將本地時間現在的時間進行比較。 我上面的代碼似乎工作正常,我“希望”當我們回到夏季時它仍然可以工作。

現在,c++20 公開了很多日期時間實用程序。 我瀏覽了文檔,嘗試了一些東西,但我無法找到上述代碼段的可靠對應物。 有沒有可能(我的意思是,不使用std::mktime和奇怪的std::tm )?

我能來的最接近的是這個,但它仍然是錯誤的(我得到一個小時的差異):

std::chrono::time_point<std::chrono::local_t, std::chrono::seconds> FromDateTime(const DateTime& dateTime)
{
    const auto& d = std::chrono::year_month_day(std::chrono::year(dateTime.Year), std::chrono::month(dateTime.Month), std::chrono::day(dateTime.Day));
    const auto& t = std::chrono::hours(dateTime.Hour) + std::chrono::minutes(dateTime.Minute) + std::chrono::seconds(dateTime.Second);
    const auto& dt = std::chrono::local_days(d) + t;

    return dt;
}

TEST_F(MyLibraryFixture, GetDateTime)
{
    // Arrange
    const auto& now = std::chrono::utc_clock::now();

    // Act
    const auto& actual = _testee->GetDateTime();

    // Assert
    const auto& timeDiscrepanceInSec = std::chrono::duration_cast<std::chrono::seconds>(FromDateTime(actual).time_since_epoch() - now.time_since_epoch());
    ASSERT_TRUE(timeDiscrepanceInSec.count() < 10);
}

這是第一個版本的FromDateTime的等效 C++20 代碼:

std::chrono::system_clock::time_point
FromDateTime(const DateTime& dateTime)
{
    using namespace std::chrono;
    auto local_tp = local_days{year{dateTime.Year}/dateTime.Month/dateTime.Day} +
        hours{dateTime.Hour} + minutes{dateTime.Minute} + seconds{dateTime.Second};
    zoned_time zt{current_zone(), local_tp};
    return zt.get_sys_time();
}

您使用local_days創建local_time是正確的。

無需顯式命名year_month_day類型。 這是使用/表示法為您生成的。

獲得本地時間后,您可以通過使用current_zone()local_time構造zoned_time將其與計算機的本地時區相關聯。

然后您可以從sys_time中提取zoned_time sys_timetime_point<system_clock, seconds> (秒精度system_clock::time_point ),即 UTC(不包括閏秒)。 這隱式轉換為返回類型: system_clock::time_point

如果需要,您可以根據其他時區而不是計算機的本地時區來解釋local_time 例如:

    zoned_time zt{"America/New_York", local_tp};

通常, zoned_time是一種方便的類型,用於在local_timesys_time之間進行轉換。

暫無
暫無

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

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