将长的 Unix 纪元时间戳转换为实际日期/时间

Posted

技术标签:

【中文标题】将长的 Unix 纪元时间戳转换为实际日期/时间【英文标题】:Convert Long of Unix Epoch Timestamp to Real Date/Time 【发布时间】:2021-02-19 20:32:38 【问题描述】:

我试图找到这个问题的答案,但我发现的来源没有正确转换时间。最初我有一个字符串中的时间戳,因为我从 .json 网络抓取程序获取时间戳,但想将其转换为可读的日期/时间。我最近进行转换的尝试是将字符串转换为 long 并将 long 转换为 time_t,然后使用 strftime() 但这不会产生正确的答案。

这是我将字符串转换为 long 然后转换为 time_t 然后使用 strftime() 的代码

std::string timeStampToRead(const time_t rawtime)

  struct tm *dt;
  char buffer [30];
  dt = localtime(&rawtime);
  strftime(buffer, sizeof(buffer), "%m%d %H%M", dt);
  return std::string(buffer);


int main()

  std::string epochT = "1604563859000";
  long e = atol(epochT.c_str());
  const time_t rawtime = (const time_t)e;
  std::string time = timeStamptToRead(rawtime);
  return 0;

这段代码的结果是0808 1703

我也尝试做与上面非常相似的事情,但将 timeStampToRead 更改为以下

std::string timeStampToRead(const time_t rawtime)

  struct tm *dt;
  char buffer [30];
  dt = localtime(&rawtime);
  return asctime(dt);

这返回 Mon Aug 8 17:03:20 这也是不正确的

正确的答案应该是 2020 年 11 月 5 日星期四 8:10:59 UTC 或 2020 年 11 月 5 日星期四 1:10:59(本地不一定是那种确切的格式,只是正确的月份、日期和时间是重要)

我已经测试了将字符串转换为 long 的结果并且工作正常,所以我认为错误是在将 long 转换为 time_t 或使用 time_t 获取时间的可读格式的过程中。在这两个选项中,我认为从 long 到 time_t 的转换更有可能是问题,但找不到另一种方法来进行转换。

我希望有一种简单的方法可以直接获取字符串并对其进行转换,但我无法在任何地方找到任何相关信息,因此我将字符串转换为 long 然后转换为 time_t。基本上,我不知道如何将字符串或长 unix 纪元时间戳转换为 time_t 以将其转换为可读格式,或者至少这是我假设错误所在的地方。如果有人能指出正确的方向以使此转换代码正常工作,我将不胜感激。

【问题讨论】:

【参考方案1】:

经过进一步挖掘,我发现了我的错误并确定了最佳路线

std::string epochT = "1604563859000";
long e atol(epochT.c_str());
const time_t rawtime = e/1000;
struct tm * dt;
dt = localtime(&rawtime);
std::string readable = asctime(dt);

此代码将在一个 for 循环中,该循环遍历字符串向量,因此 epochT 将取决于向量中的元素和当前元素,但这有效并输出 Thu Nov 5 01:10:59 的正确答案2020 当地时间。

【讨论】:

以上是关于将长的 Unix 纪元时间戳转换为实际日期/时间的主要内容,如果未能解决你的问题,请参考以下文章

将记录的日期时间转换为 UNIX 纪元时间戳的 Perl 脚本

Java将日期转换为纪元值会产生错误的输出

将 UNIX 纪元转换为日期对象

PostgreSQL:如何从 Unix 纪元转换为日期?

ini 精通v0.12将长纪元(毫秒)转换为日期时间字符串,精度为milleseconds

使用 PHP 将 mm/dd/yyyy 格式转换为纪元