[英]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(¤tTime), "%Y-%m-%dT%H:%M:%S %z %Z");
ss2 << std::put_time(std::gmtime(¤tTime2), "%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::gmtime
和std::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(¤tTime2),
"%Y-%m-%dT%H:%M:%S +0000 UTC");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.