关于date库sys_info解析及DST转换日期判断的技术问询
关于date/tz.h的sys_info字段与时间转换问题解答
一、sys_info中[begin, end)范围的含义
begin和end字段表示对应时区和时间点的offset及abbrev生效范围为[begin, end)
这个区间是左闭右开的逻辑:
- 当时间点等于或晚于
begin时,当前的offset(时区偏移量)和abbrev(时区缩写,比如CST/EDT)正式生效 - 当时间点达到
end时,当前的offset和abbrev立刻失效,系统会切换到下一个sys_info条目对应的时区参数
举个实际场景:假设某时区夏令时生效的sys_info条目begin为3月12日2:00 UTC,end为11月5日2:00 UTC,那:
- 3月12日2:00及之后的时间,使用夏令时的偏移和缩写
- 11月5日2:00整及之后,切换回冬令时参数;11月5日1:59:59 UTC仍属于夏令时生效范围
二、将info.begin转换为broken time的实现方法
sys_info里的begin是std::chrono::sys_time类型的UTC时间点,要转成broken time(年、月、日、时、分、秒拆分的结构),可以用date库自带的工具实现,分两种场景:
1. 转换为UTC时区的broken time
如果需要和UTC时间对比,直接拆分UTC时间点即可:
#include <date/tz.h> #include <iostream> int main() { // 假设已获取目标sys_info对象info date::sys_info info = ...; // 拆分日期部分 auto utc_date = date::year_month_day{date::floor<date::days>(info.begin)}; // 拆分时分秒部分 auto utc_time = date::hh_mm_ss{info.begin - date::floor<date::days>(info.begin)}; // 输出拆分后的时间字段 std::cout << "UTC日期:" << utc_date.year() << "-" << utc_date.month() << "-" << utc_date.day() << "\n"; std::cout << "UTC时间:" << utc_time.hours() << ":" << utc_time.minutes() << ":" << utc_time.seconds() << "\n"; return 0; }
2. 转换为目标时区的本地broken time
如果要和命令行输入的本地日期对比,需要先把UTC时间转成对应时区的本地时间再拆分:
#include <date/tz.h> #include <iostream> #include <string> #include <sstream> int main() { // 指定目标时区,比如America/New_York auto tz = date::locate_zone("America/New_York"); // 获取目标时间点对应的sys_info date::sys_info info = tz->get_info(date::sys_days{date::March/12/2024}); // 将UTC时间转成对应时区的本地时间 auto local_t = date::make_zoned(tz, info.begin).get_local_time(); // 拆分成本地日期和时分秒 auto local_date = date::year_month_day{date::floor<date::days>(local_t)}; auto local_time = date::hh_mm_ss{local_t - date::floor<date::days>(local_t)}; // 与命令行输入的本地日期对比(示例输入为"2024-03-12") std::string input_date = "2024-03-12"; date::year_month_day input_ymd; std::istringstream iss(input_date); iss >> date::parse("%Y-%m-%d", input_ymd); if (local_date == input_ymd) { std::cout << "转换后的本地日期与输入日期匹配\n"; } else { std::cout << "日期不匹配\n"; } return 0; }
注意:命令行输入的日期如果是本地时间,必须确保转换时使用的时区和输入时区完全一致,避免时区偏差导致对比错误。
内容的提问来源于stack exchange,提问作者tech1978
相关产品推荐
相关产品推荐

