簡體   English   中英

為什么使用 %z 格式的 std::put_time(std::gmtime 會為 UTC 返回 +0100?

[英]Why does std::put_time(std::gmtime with the %z format give back +0100 for UTC?

我在下面有這個小例子,它給了我不明白的結果。

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>

int main() {
    auto currentTime = std::time(nullptr);
    auto currentTime2 = std::time(nullptr);

    std::stringstream ss;
    std::stringstream ss2;

    ss << std::put_time(std::localtime(&currentTime), "%Y-%m-%dT%H:%M:%S %z %Z");
    ss2 << std::put_time(std::gmtime(&currentTime2), "%Y-%m-%dT%H:%M:%S %z %Z");
    std::cout << " time now local = " << ss.str() << std::endl;
    std::cout << " time now gm    = " << ss2.str() << std::endl;
}

在 Windows (VS2017) 上,這給了我:

 time now local = 2019-10-08T16:25:17 +0200 W. Europe Summer Time
 time now gm    = 2019-10-08T14:25:17 +0100 W. Europe Standard Time

在 Mac(XCode 10)上,這給了我:

 time now local = 2019-10-08T16:25:17 +0200 CEST
 time now gm    = 2019-10-08T14:25:17 +0100 UTC

有人可以向我解釋為什么 %z 為 UTC 輸出提供 +0100 而不是 +0000? 我缺少邏輯的哪一部分?

例如,在http://ideone.com/IspjpG上運行它總是給出 +0000。

std::gmtimestd::localtime返回的std::tm class 不包含時區信息,除了夏令時是否有效。 對於gmtime ,它永遠不會生效,對於localtime ,它取決於當前的語言環境和時間。

std::put_time%Z格式說明符使用當前語言環境來獲取時區信息。 當前活動的語言環境不受作為參數給出的std::tm object 的影響。

因此,在第一種情況下,您打印本地時間以及有關本地時區的信息(啟用 DST)。 在第二種情況下,您打印 UTC 時間以及有關本地時區的信息(禁用 DST)。

我們可以得出結論,使用%z%Z打印來自其他時區而不是當前本地時區的時間是不正確的。 坦率地說,我認為這是std::put_time接口(以及std::put_time包裝的std::strftime接口)中的一個缺陷,即無法將時區信息傳遞給 function,但可能會意外打印可能不相關的時區到正在打印的std::tm實例。

對於正確的 output,您應該使用:

ss2 << std::put_time(std::gmtime(&currentTime2),
    "%Y-%m-%dT%H:%M:%S +0000 UTC");

暫無
暫無

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

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