【问题标题】:Parsing a datetime string that may or may not have an offset解析可能有也可能没有偏移的日期时间字符串
【发布时间】:2018-02-03 00:02:06
【问题描述】:

我正在解析一个 HL7 TimeStamp 字段,其格式是...

YYYYMMDD[HHMM[SS[.SSSS]]][+/ -ZZZZ]

...表示偏移量是可选的。如果未提供偏移量,您需要假设日期/时间值是发送数据的系统本地的,这可能与解析数据的消费系统处于不同的时区。如果提供了偏移量,则应将其作为时间戳的一部分保留。

所以我要么使用 DateTime.ParseExact 要么使用 DateTimeOffset.ParseExact,但是这两种数据类型似乎都不适合这两种用例,因为如果提供了时区偏移量,DateTime 将不会捕获它,但如果没有提供它,DateTimeOffset可以假设我的本地偏移量,而不是不正确的来源或通用。

我认为我需要某种方式在同一数据类型中具有偏移量或没有偏移量。有什么建议吗?

【问题讨论】:

  • DateTime.Kind 已经应该涵盖绝对/相对...
  • DateTimeOffset 可以捕捉世界时,没有什么阻碍您手动设置系统发送数据的时区。
  • 我想我可以提供一个可以接受的答案,但有一个问题:您声明如果未提供偏移量,则假设该值对于发送数据的系统而言是本地的。你怎么知道系统在哪个时区?是分开寄的吗?是静态的吗?它是否以特定格式提供,您能举个例子吗?谢谢。

标签: c# .net datetime datetimeoffset


【解决方案1】:

DateTime.TryParseExact 将考虑时区(如果它存在于字符串中):

来自文档 (https://msdn.microsoft.com/en-us/library/ms131044(v=vs.110).aspx):

如果 s 包含时区信息,则根据需要将时间转换为本地时间,并将返回的 DateTime 对象的 Kind 属性设置为 DateTimeKind.Local。

但我认为真正的问题是没有提供时区。那么消费者就无法知道发送者的时区,因此它不能默认为该值。

【讨论】:

  • 问题还在于,通过“时间转换为本地时间”,您会丢失原始时区,这违反了他“您应该将 [时区] 作为时间戳的一部分”的要求。跨度>
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
相关资源
最近更新 更多