我第一次使用 time_point 。我想從字串中決議日期時間,并在從 1 小時回傳字串時發現了差異。
std::chrono::system_clock::time_point timePoint;
std::stringstream ss("2021-01-01 00:00:09 01");
std::chrono::from_stream(ss, "%F %T%z", timePoint);
// timePoint == {_MyDur={_MyRep=16094556090000000 } }
std::string timePointStr = std::format("{:%Y/%m/%d %T}", floor<std::chrono::seconds>(timePoint));
// timePointStr = "2020/12/31 23:00:09"
我不知道出了什么問題:時間點和決議或格式化為字串?如何獲得與決議的格式相同的格式?
uj5u.com熱心網友回復:
這是預期的行為。
解釋:
system_clock::time_point,更一般地說,所有time_point基于 的 s都具有Unix Timesystem_clock的語意。這是自 1970-01-01 00:00:00 UTC 以來的時間計數,不包括閏秒。
所以當“2021-01-01 00:00:09 01”被決議為asystem_clock::time_point時,“2021-01-01 00:00:09”被解釋為本地時間,“ 01”被用來轉換將當地時間轉換為 UTC。格式化后,沒有相應的轉換回本地時間(盡管可以使用附加語法1)。格式陳述句只是列印出 UTC 時間(提前一小時)。
如果您希望在不轉換為 UTC 的情況下決議“2021-01-01 00:00:09 01”,則可以通過決議為std::chrono::local_time您想要的任何精度來完成。例如:
std::chrono::local_seconds timePoint;
std::stringstream ss("2021-01-01 00:00:09 01");
from_stream(ss, "%F %T%z", timePoint);
...
現在,當您將其列印出來時,您將得到“2021/01/01 00:00:09”。但是,rep現在的值是 1609459209(3600 秒后)。
1要將 at 格式化sys_time為local_timeUTC 偏移量為 1h 的 a ,必須至少在您正在格式化的 UTC 時間選擇time_zoneUTC 偏移量為 1h的 a 。例如,“Etc/GMT-1”的 IANA 時區始終具有 1h 的偏移量……是的,偏移量的符號是相反的。使用它將 2020-12-31 23:00:09 UTC 轉換回 2021-01-01 00:00:09 看起來像:
std::chrono::sys_seconds timePoint;
std::stringstream ss("2021-01-01 00:00:09 01");
std::chrono::from_stream(ss, "%F %T%z", timePoint);
// timePoint == 2020-12-31 23:00:09 UTC
std::string timePointStr = std::format("{:%Y/%m/%d %T}",
std::chrono::zoned_time{"Etc/GMT-1", timePoint});
cout << timePointStr << '\n'; // 2021/01/01 00:00:09
免責宣告: 我目前無法驗證 MSVC 是否支持 "Etc/GMT-1" std::chrono::time_zone。
Fwiw,使用“Africa/Algiers”或“Europe/Amsterdam”代替“Etc/GMT-1”應該會為這個特定的時間戳給出相同的結果。如果您的計算機將其本地時區設定為該時間戳的 1 小時 UTC 偏移量,那么std::chrono::current_zone()代替“Etc/GMT-1”也會給出相同的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472613.html
