c++11 - std::chrono::system_clock::time_point 的值可以根据时区更改吗?

标签 c++11

我一直在为我们的代码库中的一个类编写单元测试,该类基本上将日期、时间值从 std::string 转换为 std::chrono::time_point 并且反之亦然,对于不同类型的时间戳(yyyy-mm-dd、hh:mm:ss.ms 等)。

我尝试测试代码库中的函数返回的 std::chrono::system_clock::time_point 是否与单元测试中创建的函数返回的 std::chrono::system_clock::time_point 的一种方法是执行以下操作这个-

std::chrono::system_clock::time_point m_TimePoint{}; // == Clock's epoch
auto foo = convertToString(n_TimePoint); //foo is std::string
auto bar = getTimePoint(foo);
ASSERT_EQ(m_TimePoint, bar);

这是在 Ubuntu 上,现在构造函数应该返回一个时间点,为 UTC 1970 年 1 月 1 日 00:00:00。现在,当我使用 ctime() 来查看纪元的文本表示时,返回 1969 年 12 月 31 日 19:00:00。我很困惑并检查了 EST(我的系统时区)是否等于 UTC-5。

一旦我将对象创建为 -

std::chrono::duration d{0};
d += std::chrono::hours(5);
std::chrono::system_clock::time_point m_TimePoint{d}; //== clock epoch + 5 hours

一切正常。

我的问题是否可以根据系统时区调整系统时钟纪元?

最佳答案

这个问题有两个答案,我会尝试同时解决这两个问题。

system_clock 是在 C++11 中引入的,其纪元未指定。因此,您的问题的技术答案是:是的,system_clock 纪元可以根据系统时区进行调整。

但这并不是故事的结局。

system_clock 只有几个实现,并且全部型号 Unix TimeUnix Time是自 1970-01-01 00:00:00 UTC 以来持续时间的度量,不包括闰秒。它不依赖于系统时区。

C++20 规范标准化了这一现有实践。

因此,从实际角度来看,您的问题的答案是:不,system_clock纪元不可能根据系统时区进行调整。

有一点可能会让您感到困惑,system_clock 通常以比毫秒更精细的单位来计算时间。它因平台而异,您可以使用 system_clock::duration::period::numsystem_clock::duration::period::den 检查它是什么。这是两个编译时整数常量,它们形成一个分数,n/d,它描述了 system_clock 正在测量的时间长度(以秒为单位)。对于 Ubuntu,我的猜测是它形成分数 1/1'000'000'000,或 纳秒

您可以使用以下方法从 system_clock::time_point 中获取毫秒(或任何您想要的单位):

auto tp = time_point_cast<milliseconds>(system_clock::now());

关于c++11 - std::chrono::system_clock::time_point 的值可以根据时区更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034124/

相关文章:

c++ - 为什么 std::shared_ptr 没有 [] 运算符?

c++ - 了解DEFER和OBSTRUCT宏

c++ - 在编译器生成的复制构造函数上强制模板化构造函数

c++ - int main()的返回值存储在哪里?

C++11 递归可变参数模板

c++ - 我可以将 final 关键字应用于 C++11 中的 POD(标准布局)结构吗?我是不是该?

c++ - constexpr 与静态 const : Which one to prefer?

c++ - 如何定义采用相同参数类型五次的函数类型

c++11 - 初始化 constexpr 静态类成员时出现编译器错误

c++ - lambda 函数与仿函数