【问题标题】:Unable to validate a date string in ISO 8601 date format无法验证 ISO 8601 日期格式的日期字符串
【发布时间】:2018-06-26 07:16:21
【问题描述】:

在asp.net Date.Now 生成完整的日期字符串: 例如"2018-01-17T11:12:42.0544453+00:00"

我无法使用以下格式验证此日期字符串。 谁能推荐一个合适的验证格式?

Dim formats() As String = {
  "yyyy-MM-dd",
  "yyyy-MM-ddTHH:mm:ss",
  "yyyy-MM-ddTHH:mm:ss.fff",
  "yyyy-mm-ddThh:mm:ss.ffffff",
  "yyyy-mm-ddThh:mm:ss.fffffffZ",
  "yyyy-mm-ddThh:mm:ss.nnnnnnn",
  "yyyy-mm-ddThh:mm:ss.nnnnnnnZ",
  "yyyy-mm-ddThh:mm:ss.nnnnnnn+|-hh:mm"
}
If Date.TryParseExact("2018-01-17T11:12:42.0544453+00:00", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, dt) Then
  //Success
End If

【问题讨论】:

  • 即使Date.TryParse 也会成功,不需要使用ParseExact
  • @TimSchmelter 我使用 Parse exact 因为检查了许多不同的字符串,这只是一个失败的例子,我很好奇为什么。
  • 如果您正在检查它是否有效,那么TryParse 就足够了。如果您确保它符合给定的格式,您只需要TryParseExact。你真正的目标是什么?
  • @TimSchmelter 我想确保日期是有效的 ISO 8601 日期格式。即使省略时间/分数/时区也是如此。

标签: .net vb.net date datetime iso8601


【解决方案1】:

我想确保日期是有效的 ISO 8601 日期格式。这可以是 即使省略时间/分数/时区也是如此。

您可以使用"O"(Round-trip) format specifier

Dim time = "2018-01-17T11:12:42.0544453+00:00"
Dim validDate = Date.TryParseExact(time, "O", CultureInfo.InvariantCulture, DateTimeStyles.None, dt)

“O”或“o”标准格式说明符表示自定义日期和 使用保留时区的模式的时间格式字符串 信息并发出符合 ISO 8601 的结果字符串。为了 DateTime 值,此格式说明符旨在保留日期 和时间值以及文本中的DateTime.Kind 属性。 ...

旁注:对我来说Date.Now.ToString 不会返回这种格式的字符串。也许你用过:

Dim time = Date.UtcNow.ToString("o", System.Globalization.CultureInfo.InvariantCulture)

【讨论】:

  • 感谢蒂姆。这只会验证时区是否存在还是比显式格式更宽容?它是否需要是一个额外的格式字符串,还是会涵盖上面提到的几个?
  • @Obsidian:它也成功解析了"2018-01-17T11:12:42.0544453"。但请阅读我链接的文档。尤其是 " 部分利用了 ISO 8601 表示时区信息的三种方式:..." 第三点还提到,如果 " 日期和时间值,它会解析它没有时区信息”
  • 这就是魔法。谢谢你。我知道o 并且有点尴尬我没有尝试它。我陷入了sz 的困境。遗憾的是,没有一个适用于所有 ISO 格式的通用验证器。
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2021-01-17
  • 2016-02-20
  • 2018-02-22
相关资源
最近更新 更多