You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:55:08