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

使用Howard Hinnant date库转换zoned_time至local_time时遇歧义错误

问题分析与解决方案

错误原因

你构造zoned_time时指定choose::latest确实处理了歧义时间,但后续执行zt = zt.get_local_time();时出现了问题:

  • get_local_time()返回的是存在歧义的local_time对象
  • 将该local_time赋值给zoned_time时,相当于重新调用构造函数,但这次没有显式指定choose参数,触发了ambiguous_local_time异常

官方文档说明(翻译)

当尝试将歧义本地时间转换为系统时间且未指定choose::earliest或choose::latest时,会抛出ambiguous_local_time异常。

修复方案

方案1:移除多余的赋值操作

构造zoned_time时已经通过choose::latest解决了歧义,直接输出即可:

#include "date/tz.h"
#include "date/date.h"
#include <iostream>
#include <string>

int main() 
{
using namespace date;
using namespace std;
using namespace chrono;
auto tz = locate_zone("America/New_York");
zoned_time zt{tz, local_days{November/7/2021} + 1h + 30min, choose::latest};
cout << " local time Original time: " << zt << endl;
return 0;
}

方案2:赋值时显式指定choose策略

如果确实需要基于local_time重新构造zoned_time,必须再次指定choose参数:

#include "date/tz.h"
#include "date/date.h"
#include <iostream>
#include <string>

int main() 
{
using namespace date;
using namespace std;
using namespace chrono;
auto tz = locate_zone("America/New_York");
zoned_time zt{tz, local_days{November/7/2021} + 1h + 30min, choose::latest};
// 赋值时显式指定choose策略
zt = zoned_time{tz, zt.get_local_time(), choose::latest};
cout << " local time Original time: " << zt << endl;
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.17 20:57:40