【问题标题】:How to convert a datetime string with milliseconds to UNIX timestamp如何将毫秒的日期时间字符串转换为 UNIX 时间戳
【发布时间】:2018-04-07 22:59:58
【问题描述】:

我有以下字符串

2013-04-12 16:00:15.041

将这个字符串转换为 64 位 UNIX 时间戳的 C++ 方法是什么?这里的大多数问题只处理直到秒的时间戳,但在我的情况下,我还需要包括毫秒。

【问题讨论】:

  • 秒 * 1000 + 毫秒。
  • Unix 时间戳是“自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的 数”。它没有 毫秒 精度,因此无论您如何转换字符串,都会丢失毫秒。
  • 该字符串是代表 UTC 还是特定的本地时间?
  • UnixTime to readable date的可能重复

标签: c++ unix-timestamp


【解决方案1】:

将字符串解析为其组件并构造一个std::chrono::time_point。在 C++20 中,您将在 <chrono> 中拥有 utc_clock,即 utc_time,否则 std::chrono::local_t。在 C++11 及更高版本中,您拥有 std::chrono::system_clock

不过,在将分解的时间转换为 STL 时间对象时,存在一种先有鸡还是先有蛋的问题:通常,这样做只用 C 库就可以得到答案。如有必要,您可以在istringstream 上使用std::get_time() 将字符串转换为tm,并使用C 标准库函数mktime()tm 转换为time_t,然后您可以将其传递到 std::chrono::system_clock::from_time_t() 转换为 std::chrono::time_point——除了在 UNIX/Linux 上,time_t 已经是 UNIX 时间戳!

您的示例没有指定时区,因此您可能需要也可能不需要进行时区转换。

utc_clock 使用 1970 年 1 月 1 日的same Epoch as POSIX,所以utc_time/time_point 的成员函数time_since_epoch()std::chrono::duration 的形式给出答案。如果您改用 system_clock,则 Epoch 是实现定义的(但也几乎总是相同的 Epoch),因此您需要找到 1970 年 1 月 1 日凌晨 12:00 的 time_point,并将其减去time_point 你计算得到一个持续时间。您可以使用std::chrono::seconds(moment).count() 将此持续时间(称为moment)转换为秒。然后,如果您想确保具有精确的 64 位值,则可以转换为 int64_tuint64_t(来自 <cstdint>)。

有一个few different UNIX time formats,但如果您想将您的时间(以毫秒为单位)转换为以纳秒为单位的 C/POSIX timespec,而不是<sys/time.h> 中的过时格式,请将.tv_nsec 设置为毫秒数乘以一百万,或从std::chrono::milliseconds 转换为std::chrono::nanoseconds

如果这样做的目的是使用文件系统时间戳,您可能需要std::filesystem::file_time_type

【讨论】:

  • "如果您在 UNIX 或 Linux 上,您可以使用 getdate() 将您的字符串转换为 tm" - C++11 及更高版本有 @987654329 @ 将格式化的日期/时间字符串从 std::istream 读取到 tm。您可以将std::istringstream 用于该流,并且std::get_time()gettime() 更灵活
  • @RemyLebeau 谢谢!将添加。
猜你喜欢
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多