【问题标题】:unable to get fraction of seconds using strptime()无法使用 strptime() 获得几分之一秒
【发布时间】:2014-08-06 07:06:26
【问题描述】:

我收到 YYYY-MM-DDThh:mm:ss[.S+][Z|+-hh:mm] 这种格式的日期时间。我正在尝试使用strptime 复制该值,如下所示

struct tm time = {0};
char *pEnd = strptime(datetime, "%Y-%m-%dT%H:%M:%S%Z", &time);

但我无法复制秒的分数,因为 strptime 在 C++ 中不支持它。

那我该怎么办?

我找到了使用gettimeofday() 的解决方案。但我已经在“日期时间”中获取日期和时间,所以请帮我找到解决方案……我也可以使用 poco。但即使是他们,我们也采用当地时间。

【问题讨论】:

  • 你可以在char数组中计算偏移量并制作一个子字符串。
  • 由于 struct tm 没有 [毫秒](cplusplus.com/reference/ctime/tm) 的字段,因此 strptime 在 C 中也不支持秒的小数部分。

标签: c++


【解决方案1】:

您可以在使用strptime 解析之前从字符串中删除“S”组件,然后在以后随意使用它(它不适合标准struct tm 中的任何地方 - 没有亚秒字段)。只需 datetime.find('.') 并从那里开始,或者如果您愿意,也可以使用 regexp - 既乏味又不是火箭科学。

【讨论】:

  • 谢谢托尼。但我的问题是我将使用 ->time_t t = mktime ( &time ) 将 &time 中的所有内容转换为自纪元以来的秒数。所以如果我删除 S,我以后应该如何添加它?请帮助我
  • @user3913114 好吧,这取决于你想用你的time_t t做什么......如果你想获得这些值之间的亚秒级差异,你可以更改为double t = mktime(&time) + s;uint64_t t_ms = mktime(&time) * 1000 + s;或创建一个struct T { time_t t; int ms; }; 然后您可以比较和计算这些值的增量。如果您想稍后以某种格式打印时间,请根据您的输出函数将微秒重新注入到适当的位置。如果您还有其他需求,但仍不知道如何满足,请告诉我们....
  • 使用 time_t t,我将返回 (t*1000000000L) 到函数。100000000L 是将其转换为纳秒。
  • @user3913114: 好吧,那么一切都很简单……只要根据 S 拥有的数字进行适当缩放……
  • 非常感谢。我在你的帮助下解决了我的问题。
【解决方案2】:

在 C++11 中,您可以使用 <chrono> 中的高精度计时对象,请参阅此 question 的答案。

【讨论】:

  • 感谢您的回复。但我的问题是我不能占用系统时间或本地时间。我已经得到了我要表示的日期时间并将其发送到 *pEnd,如上面的代码所示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多