【问题标题】:How do I convert a Unix timestamp string to time_t in C++11? [duplicate]如何在 C++11 中将 Unix 时间戳字符串转换为 time_t? [复制]
【发布时间】:2016-09-27 01:31:53
【问题描述】:

简短的问题,又名“TD;DR”。

我有一个“1464478647000”字符串,我猜它是一个 UNIX 时间戳。但它肯定是一个包含表示时间的数字的字符串,但不是人类可读的格式。如何将其转换为 time_t 类型,以便稍后将其格式化为格式化字符串,例如 C++11 中的“3 分钟前”?


长问题。

首先抱歉我的英语不好。

我完全不了解 C++11,甚至 C++;我刚刚学了一点 C,就像 10 年前一样,我几乎忘记了它是怎么回事。在业余时间,我正在尝试对Feednix(一个用 C++11 编写的 ncurses 程序,充当 Linux 控制台的 Feedly 客户端 - 看起来已经死了)做一个小分支,所以它看起来更多像一个列表(有点像ncmpcppmutt 的样子)。由于当前的 Feednix 实现没有显示任何帖子的时间,我认为让它显示它的发布时间会很好(就像 Feedly 的网络版本一样,在其“仅标题”演示文稿中)。

问题是,按照 Feednix 上实现的模型,我将“已发布”数据作为字符串对象提取(我不知道如何将其作为整数提取,或直接作为 @ 987654327@ 对象(似乎 Json 库不允许这样做)。Feedly API 文档说,“已发布”数据是“时间戳,以毫秒为单位,当这篇文章发表时,由 RSS 提要报告(通常不准确)。”例如“1452614967000”。

那么如何将该字符串转换为time_t 对象,以便稍后将其格式化为“3 分钟前”或“2 天前”之类的字符串?或者我可以做些什么来获得格式化的字符串(这更有可能)?任何帮助将不胜感激!

【问题讨论】:

  • 1452614967000 不能是 time_t 时间戳。否则它将是July 15, 48001, 01:30:00 -0400
  • @Sam,可能毫秒,如果你去掉结尾的“000”,你会得到今年 1 月 12 日的某个时间,而不是人类之后很久的某个时间种族很可能已经灭绝了:-)
  • “TD;DR”是什么意思?像“总结”这样的简单词发生了什么?
  • 太……笨蛋?该死的长?单调? ……没读? :-)
  • 实际上,刚刚注意到问题说明它以毫秒为单位,所以我的评论是多余的。我会把它留在那里作为我在吐出垃圾之前无法阅读的纪念碑:-)

标签: c++ unix c++11 time-t feedly


【解决方案1】:

首先,使用strtol将数字转换为long,然后转换为time_t

#include <cstdlib>
#include <ctime>

using namespace std; // to simplify answer

...
const char* timestr = "1464478647000";
time_t timenum = (time_t) strtol(timestr, NULL, 10); 

【讨论】:

  • 您似乎错过了“转换为 '3 分钟前'”这一步 :-) 尽管您确实确​​实说“首先,...”。另外,您还需要ctime 吗?
  • 不保证time_tlong 类型。在某些架构上,它可能是 32 位整数,您的强制转换会导致溢出。
  • 我认为你需要使用 mktime() ...见“重复”
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2017-01-18
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2019-10-29
相关资源
最近更新 更多