将ISO datetime转换为本地日期时间并以c ++提取时间

时间:2018-05-07 08:47:15

标签: c++ datetime

我从REST api返回iso日期:

2018-05-07T06:46:24.763Z

我希望将其转换为本地日期时间,比如在菲律宾,它是+8。所以应该是

2018-05-07T14:46:24.763Z

我想只抽出时间:

14:46

并将其转换为std :: string。

我该怎么办? 我是否需要指定本地时区,或者是否有自动获取时区,就像javascript在浏览器中的工作方式一样?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您想使用Howard Hinnant's free, open-source date/time library,可能会出现以下情况:

#include "date/tz.h"
#include <iostream>
#include <sstream>
#include <string>

std::string
time_in_philippines(const std::string& utc)
{
    using namespace std;
    using namespace std::chrono;
    using namespace date;
    istringstream in{utc};
    sys_time<milliseconds> tp;
    in >> parse("%FT%TZ", tp);
    auto zt = make_zoned("Asia/Manila", tp);
    return format("%H:%M", zt);
}

int
main()
{
    std::cout << time_in_philippines("2018-05-07T06:46:24.763Z") << '\n';
}

该程序输出:

14:46

sys_time<milliseconds>只是基于chrono::time_point的{​​{1}},但精度为chrono::system_clockmilliseconds函数将使用指示的解析标记解析istream中的parse

time_point隐式为UTC。要将其转换为time_point,请将UTC zoned_time<milliseconds>time_point(此示例中为“亚洲/马尼拉”)配对。如果您的计算机当前的当地时区已经是“亚洲/马尼拉”,那么还可以通过以下方式获取当前时区:

time_zone

接下来只需使用所需的标志格式化 auto zt = make_zoned(current_zone(), tp); ,在这种情况下为“%H:%M”。 zoned_time会返回format

有些installation is required用于处理时区库。