【问题标题】:Requiring timezone information when deserialising DateTimeOffset反序列化 DateTimeOffset 时需要时区信息
【发布时间】:2019-07-22 15:43:41
【问题描述】:

我正在尝试验证从 API 端点获得的数据。用户应该能够发送DateTimeOffset。目前我正在使用我自己的JsonConverter 实现来验证DateTimeOffset 的正确格式。我尝试了多种日期时间格式,但没有一个能像我想要的那样工作。

"yyyy-MM-ddTHH:mm:ss.fffK"

这适用于:

2010-01-01T01:01:01.000
2010-01-01T01:01:01.000Z
2010-01-01T01:01:01.000+01:00

问题是,它没有强制指定时间偏移或 Z,如上例所示,除此之外它工作得很好。

"yyyy-MM-ddTHH:mm:ss.fffzzz"

这仅适用于:

2010-01-01T01:01:01.000+01:00

它不接受 Z 作为时间偏移量。是否有 DateTimeOffset 格式,我可以指定它只接受以下内容:

2010-01-01T01:01:01.000Z
2010-01-01T01:01:01.000+01:00

【问题讨论】:

  • 您真的需要 DateTimeOffset 吗?在读取包含时区的数据时,包含偏移量没有任何意义。时区是偏移量。
  • 你的第一个例子一旦用 "yyyy-MM-ddTHH:mm:ss.fffK" 解析将有一个 DateTime.KindUnspecified 与其他两个不同,所以你可以使用该属性来拒绝输入。
  • @steve16351 这是一个很好的解决方案。你能把它作为答案吗?

标签: c# json datetime .net-core


【解决方案1】:

使用"K" 格式说明符,该部分的空字符串等同于DateTime.KindUnspecified

所以,这就是为什么它仍然可以正确解析的原因,但是在解析后的DateTime 中,我们可以通过检查DateTime.Kind 属性来区分差异,如果未指定则拒绝输入。例如:

var date = DateTime.ParseExact("2010-01-01T01:01:01.000", "yyyy-MM-ddTHH:mm:ss.fffK", null);
if (date.Kind == DateTimeKind.Unspecified)
    throw new ArgumentException("You must specify a time offset");

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多