是否有标准方法来指示 ISO8601 格式的时间戳中的无效值?

Posted

技术标签:

【中文标题】是否有标准方法来指示 ISO8601 格式的时间戳中的无效值?【英文标题】:Is there a standard way to indicate an invalid value in an ISO8601-formatted timestamp? 【发布时间】:2018-05-10 19:22:47 【问题描述】:

我有一些代码可以创建 ISO8601 格式的时间戳,但如果传入日期的格式无效,则转换失败。

我想知道是否有以这种格式表示无效时间戳的标准方法?

***提到 1583 年之前的几年没有在正常操作下处理,所以我的第一个想法是简单地将值设置为 0000-01-01T00:00:00Z 之类的值。如果有更标准的方法来指示无效值,我宁愿使用它。

【问题讨论】:

您想使用哪种编程语言? 如果有一种标准的方式来表示它,那它不是一个有效的时间戳吗? 我使用的是 C++,但它更多是我感兴趣的通用方法,而不是特定语言的细节。 【参考方案1】:

ISO 8601 未定义表示无效时间戳的字符串。它只定义了 valid 格式的字符串是什么样子的。

此外,ISO 8601 使用proleptic Gregorian calendar,这意味着所有正数年份都有效。它允许负年份(通过协议),但没有定义诸如 BC/BCE 之类的时代。换句话说,0001-01-01 的前一天将是预测公历中的0000-12-310000-01-01 的前一天是 -0001-12-31(第 0 年是闰年)。

至于您如何在您的代码中表示“无效”,这完全取决于语言和实现。在许多情况下,null 是合适的。如果您严格使用字符串,那么"" 可能会更好。没有更多上下文很难说。

【讨论】:

数据以 JSON 字符串的形式交换,因此空字符串对我来说是一种明智的做法。 null(不是字符串)在 JSON 中也有效。根据反序列化的内容,它可能更合适。例如,作为 .Net 开发人员,我可能会将该字段反序列化为 Nullable<DateTime>(又名。DateTime?),在这种情况下 null 会自动出现,但我必须使用空字符串尽我所能教解析器如何处理。 This answer 也可能对您的决策有用。 看起来不错。

以上是关于是否有标准方法来指示 ISO8601 格式的时间戳中的无效值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

iOS-时间格式ISO 8601

ISO 8601:时间和日期的表示标准

在Java中将ISO 8601时间戳字符串转换为纪元秒[重复]

如何使用 Shell 将 ISO 8601 时间戳转换为 Unix 时间戳?