解析时间的 C++ 时区偏移量
C++ timezone offset to parsed time
我有一些代码使用 Howard Hinnant's date Library 解析启用微秒的时间戳:
std::string time_test = "13:45:04.747334";
std::istringstream input(time_test);
std::chrono::microseconds current_time;
input >> date::parse("%T", current_time);
这会产生自午夜以来的微秒数,但假设是微秒数。
现在我需要将它添加到自今天当地午夜的纪元以来的微秒数,但图书馆假定 std::chrono::system_clock::now()
提供 UTC 时间的本地时间。
如何将纪元以来的时间计算为本地时间?
要处理当地时间,您需要 install the "date/tz.h"
library。这涉及编译一个源文件:tz.cpp 并允许自动下载 IANA 时区数据库,您自己手动安装,或使用您的 OS 的副本(如果可用)。
获取当前本地时间的最简单方法是将 system_clock::now()
与 current_zone()
组合在一个名为 zoned_time
:
的对象中
zoned_time zt{current_zone(), system_clock::now()};
current_zone()
returns a time_zone const*
到代表您计算机当前设置的本地时区的时区。从 zoned_time
你可以得到你的本地时间:
auto local_tp = zt.get_local_time();
local_tp
是 chrono::time_point
,但与 system_clock::time_point
的偏移量为您所在时区的当前 UTC 偏移量。然后您可以像使用 system_clock::time_point
一样使用 local_tp
。例如,获取当地时间:
auto tod = local_tp - floor<days>(local_tp);
tod
只是一个 chrono::duration
测量自当地午夜以来的时间。
或者如果您有这样的持续时间,例如您在问题中解析的 current_time
,您可以将其添加到当地午夜:
auto tp = floor<days>(local_tp) + current_time;
在这里,tp
的类型是 local_time<microseconds>
。 local_time<duration>
只是 chrono::time_point<local_t, duration>
.
的类型别名
How do get time since epoch calculated as local time?
这个问题有点模棱两可,所以我没有直接回答。但是,如果您能澄清问题,我很乐意尝试。纪元是 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 %Z\n", zt);
cout << format("%F %T %Z\n", zt.get_sys_time());
输出:
2020-12-16 19:45:04.747334 EST
2020-12-17 00:45:04.747334 UTC
我有一些代码使用 Howard Hinnant's date Library 解析启用微秒的时间戳:
std::string time_test = "13:45:04.747334";
std::istringstream input(time_test);
std::chrono::microseconds current_time;
input >> date::parse("%T", current_time);
这会产生自午夜以来的微秒数,但假设是微秒数。
现在我需要将它添加到自今天当地午夜的纪元以来的微秒数,但图书馆假定 std::chrono::system_clock::now()
提供 UTC 时间的本地时间。
如何将纪元以来的时间计算为本地时间?
要处理当地时间,您需要 install the "date/tz.h"
library。这涉及编译一个源文件:tz.cpp 并允许自动下载 IANA 时区数据库,您自己手动安装,或使用您的 OS 的副本(如果可用)。
获取当前本地时间的最简单方法是将 system_clock::now()
与 current_zone()
组合在一个名为 zoned_time
:
zoned_time zt{current_zone(), system_clock::now()};
current_zone()
returns a time_zone const*
到代表您计算机当前设置的本地时区的时区。从 zoned_time
你可以得到你的本地时间:
auto local_tp = zt.get_local_time();
local_tp
是 chrono::time_point
,但与 system_clock::time_point
的偏移量为您所在时区的当前 UTC 偏移量。然后您可以像使用 system_clock::time_point
一样使用 local_tp
。例如,获取当地时间:
auto tod = local_tp - floor<days>(local_tp);
tod
只是一个 chrono::duration
测量自当地午夜以来的时间。
或者如果您有这样的持续时间,例如您在问题中解析的 current_time
,您可以将其添加到当地午夜:
auto tp = floor<days>(local_tp) + current_time;
在这里,tp
的类型是 local_time<microseconds>
。 local_time<duration>
只是 chrono::time_point<local_t, duration>
.
How do get time since epoch calculated as local time?
这个问题有点模棱两可,所以我没有直接回答。但是,如果您能澄清问题,我很乐意尝试。纪元是 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 %Z\n", zt);
cout << format("%F %T %Z\n", zt.get_sys_time());
输出:
2020-12-16 19:45:04.747334 EST
2020-12-17 00:45:04.747334 UTC