C++时区到解析时间的偏移量



我有一些代码使用Howard Hinnant的日期库来解析启用微秒的时间戳:

std::string time_test = "13:45:04.747334";
std::istringstream input(time_test);
std::chrono::microseconds current_time;
input >> date::parse("%T", current_time);

这产生了自午夜以来的微秒,但假设微秒。

现在,我需要将其添加到今天本地午夜的epoch后的微秒中,但库将本地时间设为std::chrono::system_clock::now()提供UTC时间。

如何将历元以来的时间计算为本地时间?

要处理本地时间,您需要安装"date/tz.h"库。这包括编译一个源文件:tz.cpp,然后允许自动下载IANA时区数据库,自己手动安装,或者使用操作系统的副本(如果可用(。

获取当前本地时间的最简单方法是将system_clock::now()current_zone()组合在一个名为zoned_time:的对象中

zoned_time zt{current_zone(), system_clock::now()};

current_zone()time_zone const*返回到表示计算机当前设置的本地时区的时区。从zoned_time您可以获得当地时间:

auto local_tp = zt.get_local_time();

local_tpchrono::time_point,但与system_clock::time_point的偏移量为您所在时区的当前UTC偏移量。然后,您可以像使用system_clock::time_point一样使用local_tp。例如,要获取一天中的本地时间:

auto tod = local_tp - floor<days>(local_tp);

CCD_ 14只是测量从当地午夜开始的时间的CCD_。

或者,如果你有这样一个持续时间,比如你在问题中解析的current_time,你可以将其添加到本地午夜:

auto tp = floor<days>(local_tp) + current_time;

这里,tp将具有类型local_time<microseconds>。而CCD_ 19只是CCD_ 20的一个类型别名。

如何将自epoch以来的时间计算为本地时间?

这是一个有点模棱两可的问题,所以我没有直接回答。不过,如果你能澄清这个问题,我很乐意尝试。历元为1970-01-01 00:00:00 UTC,自该时刻起的持续时间与任何时区无关。

为了进一步详细说明,给定当前本地时间(current_time(,并假设我们知道本地日期(例如2020-12-16(,我们可以形成一个zoned_time,它封装了本地时间和UTC等效值:

string time_test = "19:45:04.747334";
istringstream input(time_test);
chrono::microseconds current_time;
input >> date::parse("%T", current_time);
local_days today{2020_y/12/16};
zoned_time zt{current_zone(), today + current_time};
cout << format("%F %T %Zn", zt);
cout << format("%F %T %Zn", zt.get_sys_time());

输出:

2020-12-16 19:45:04.747334 EST
2020-12-17 00:45:04.747334 UTC

相关内容

  • 没有找到相关文章

最新更新