【问题标题】:ISO 8601 to time_t conversion in C or vice versaISO 8601 到 C 中的 time_t 转换,反之亦然
【发布时间】:2011-09-30 21:06:14
【问题描述】:

根据ISO 8601,可以用不同的格式指定时间。

我的程序不知道将指定哪种确切的 ISO 8601 格式。

在这种情况下,如何将其转换为 time_t?

strptime 要求您指定格式(在我的情况下我事先不知道)。

最终目标:比较 2 个 time_t 时间戳。

编辑 0:因为我的目标是比较 2 个时间戳,所以 time_t 到 ISO 8601 的转换也可以。

【问题讨论】:

  • 为 ISO 8601 日期编写解析器听起来并不难 :)
  • 当我需要这个时,我必须做一个自定义解析器。不幸的是,我不能发布它 - 抱歉。但就像 pmg 说的,这不是火箭科学。

标签: c iso8601 time-t


【解决方案1】:

如果您在类似 UNIX 的机器上,请尝试getdate。界面很时髦,但效果很好。

可识别的格式是 由命名的文件控制 环境变量 DATEMSK。这 文件应包含有效行 可以传递的格式字符串 到 strptime。

【讨论】:

  • 太棒了。有时我真的希望我能给出一个以上的 +1。
  • @sarnold 这叫做赏金;)
  • @Hexa,好点——可惜花了这么长时间才能发帖。 现在让我印象深刻。 :)
  • @Byron:非常感谢。看来getdate 正在解决问题:)
【解决方案2】:

您说您最终需要比较两个time_t 值。但是您如何获得这些值?如果它们作为字符串发送,那么如果您的机器支持getdate(),那么Byron Whitlockanswer 是合理的。如果它们已经是time_t,那么您可以比较时间值。如果您需要将本地生成的time_t 与远程生成的字符串进行比较,那么您将陷入困境;您必须以某种方式知道发送数据时使用了哪种 ISO 8601 样式。

请注意,ISO 8601 期望交换信息的两个系统将就它们将使用的符号达成一致,尤其是它们将就可以省略哪些字段(如果有)以及标点符号是否将这些字段分开达成一致.如果您知道(单一)格式,或者可以配置您的系统,以便对于每个数据源,您现在将使用 ISO 8601 格式,那么 POSIX strptime() 函数可以处理几乎所有事情 - 尽管您需要知道您的代码将如何处理任何未定义的字段。

标准的完整标题是:“ISO 8601:2004 数据元素和交换 格式——信息交换—— 日期和时间的表示”。其§3.7 相互协议部分说:

本国际标准中确定的某些表述仅在双方同意的情况下才允许使用 信息交换的合作伙伴。此类协议应确保代表的领域 不允许有其他不能明确区分的表示 同意的代表。

【讨论】:

  • 可以尝试使用strptime 的格式字符串序列,直到找到成功的字符串...
  • @R..: 畏缩 - 是的,但你不能得到误报吗?你能确定一切都被转换消耗了吗?通过足够的工作,您可能可以使用它,但我认为最好知道您应该处理什么(并且标准同意)。
  • 非常感谢,乔纳森。这很有教育意义。让我再工作一点,会在这里更新。
  • @JonathanLeffler,我认为您是在断章取义地引用标准,ISO 8601:2004 使用基本和扩展两种格式定义了三种日期表示。 3.7 是指扩展的表示和降低的准确性。 ISO 8601:2004 标准的大部分部分无需事先同意即可实施,并且在 4.3.2 和 4.3.2 等几个部分中也有明确记录。
  • @chansen:好吧,因为这只是标准的一部分,我当然是在没有上下文的情况下引用它。尽管如此,我不认为它歪曲了标准所说的或意味着什么。该标准定义了多种格式;各方当然可以同意使用这些标准格式,这样可以最大限度地减少混淆的风险和工作量。这是明智的做法。但即便如此,也需要双方同意。它还认识到,如果某些公司需要不同的格式,他们可以自己组织,这几乎没有必要说,但无论如何都会说出来。
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 2012-06-27
  • 2015-01-23
  • 1970-01-01
相关资源
最近更新 更多