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

如何将date::year_month_day转换为std::chrono::system_clock::time_point?

将date::year_month_day转为UTC时区的std::chrono::system_clock::time_point

需求是把Howard Hinnant date库中的date::year_month_day转换为std::chrono::system_clock::time_point,并基于UTC时区获取time_since_epoch().count()的正确值。你当前的代码要么结果错误,要么返回的是本地时区的时间戳,以下是问题分析和正确解法:

现有代码问题分析

现代C++写法的错误

你手动构造time_point时,错误地将sys_days包装成了以std::chrono::days为周期的time_point,但system_clock::time_point的默认周期通常是微秒或纳秒(取决于编译器实现),类型不匹配导致结果完全错误。

经典C++写法的错误

  1. tm_mon赋值错误:tm结构体中tm_mon的取值范围是0-11(对应1-12月),你直接传入月份的原始值(比如11月传11),导致月份多算了1个月。
  2. mktime基于本地时区:该函数会将传入的tm结构解析为本地时区的时间,最终得到的时间戳并非UTC时区的。

基于date库的正确实现

date库本身提供了直接的转换方式,sys_days是date库中表示UTC时区下从epoch(1970-01-01)开始的天数类型,它可以直接隐式转换为system_clock::time_point,因为两者的epoch是一致的。

#include "date/date.h"
#include <chrono>
#include <iostream>

int main()
{
    date::year_month_day ymd = date::year{2023}/11/9; // 2023年11月9日

    // 直接将UTC下的日期转换为system_clock的时间点
    std::chrono::system_clock::time_point tp = date::sys_days{ymd};

    // 获取UTC时区下的原始计数值(单位取决于system_clock周期,如纳秒/微秒)
    auto raw_count = tp.time_since_epoch().count();
    std::cout << "UTC 原始时间戳计数值: " << raw_count << "\n";

    // 若需要秒级的UTC时间戳,可做时长转换
    auto seconds_count = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count();
    std::cout << "UTC 秒级时间戳: " << seconds_count << "\n";
}

运行这段代码会得到2023年11月9日00:00:00 UTC对应的正确时间戳,比如秒级数值应为1699488000。

内容的提问来源于stack exchange,提问作者shashashamti2008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:25