从区域创建 std::chrono::zoned_time,从函数参数创建时间

Create std::chrono::zoned_time from zone and time from function parameters

提问人:Miro Kropacek 提问时间:11/13/2023 更新时间:11/13/2023 访问量:41

问:

我正要问最初的问题(从区域和时间创建 std::chrono::zoned_time),幸运的是我没花很长时间就找到了它。

这个公认的答案近乎完美,但是,即使经过一个小时的盯着 cppreference.com 和谷歌搜索,我也无法找到一个简单的例子来做到这一点,但以编程方式,即类似

std::chrono::zoned_time get_zt(const std::string& location, int year, int month, int day, int hour, int minutes, int seconds);

我也会接受

std::chrono::zoned_time get_zt(const std::string& location, const std::string& time_str);

如果它不使用 OR(它们似乎在我的 G++ 中仍然缺失)。std::chrono::parsestd::chrono::from_stream

目标仍然是一样的——能够指定非本地时区时间,然后使用它(例如,“如果他们的本地时间是酒吧,那么自纪元以来在时区 foo 中经过了多少秒?

C ++20 C ++-Chrono

评论


答:

3赞 Ted Lyngmo 11/13/2023 #1

我认为这就是你所追求的:

auto get_zt(const std::string& location, int year, int month, int day, int hour,
            int minutes, int seconds) {
    
    auto ymd = std::chrono::year(year) / std::chrono::month(month) /
               std::chrono::day(day);

    auto ld = std::chrono::local_days{ymd} + std::chrono::hours(hour) +
              std::chrono::minutes(minutes) + std::chrono::seconds(seconds);
    
    std::chrono::zoned_time zt{location, ld};
    
    return zt;
}

用法示例:

int main() {
    auto lzt = get_zt("Europe/Stockholm", 2023, 11, 12, 22, 19, 44);

    std::cout << lzt << '\n';
}

输出:

2023-11-12 22:19:44 CET

评论

1赞 Miro Kropacek 11/14/2023
确实,工作是一种享受。就像我所希望的那样简单。