【问题标题】:ISO 8601 string to C# datetime: lost time zoneISO 8601 字符串到 C# 日期时间:丢失时区
【发布时间】:2020-02-09 09:06:53
【问题描述】:

在数据库中,我有一列数据类型为Date。 我使用 ORM 来映射这个 DB,因此,在适当的 C# 类中,我有一个 DateTime 数据类型的字段。 从 FHIR 客户端,我收到一个 JSON 文档,其日期格式为 ISO 8601,其中包含时区。 当我使用从字符串到 DateTime 的转换时,我丢失了一个时区,并且在数据库中,我存储了一个没有时区的日期。 当 FHIR 客户端向我询问它已经发送给我的一些数据时,我读取了数据库,当然,返回原始日期但是(!!!)没有时区。

是否有任何解决方法可以存储原始 FHIR 请求中的时区?
我无法修改现有数据库,因为它是一个成熟的旧项目并且使用了很多这些表等。

【问题讨论】:

  • 时区真的有必要吗?您的客户可以改为接受 UTC 吗?
  • 请提供更多详细信息 - 您使用的是什么数据库?数据库中的字段类型是什么?请注意,DateTime 不包含偏移量 - 您是否尝试过使用 DateTimeOffset? (还值得注意的是,尽管在 ISO-8601 中进行了命名,但 ISO-8601 中没有实际包含时区标识符的格式 - 只有一个 UTC 偏移量。不幸的是,该标准混淆了两者。)但从根本上说,如果你将数据重新存储在不包含偏移量的数据库字段中,原始信息就消失了。
  • 不幸的是,无法从DateTime 获取时区。 '因为Datetime 不存储时区信息。
  • 如果您的数据库不支持使用 DateTime 类型的列存储时区,您有两种选择。 1)将您的 TimeZone 存储在另一列中,主列以 UTC 存储数据 2)将 DateTime 存储在字符串中。
  • Oracle 数据库,列“IDENTIFIER_PERIOD_START”类型:DATE,“IDENTIFIER_PERIOD_END”类型:DATE 等

标签: c# datetime timezone iso8601 hl7-fhir


【解决方案1】:

FHIR 类型是偏移量,而不是时区。

因此,基本上,如果您没有将偏移量存储到数据库中的选项,您将需要对该值的内部进行假设,并让您的代码处理它,并在需要时添加偏移值。 FHIR 客户端中的仅日期类型不需要时间(或区域),但我假设您指的是 datetime fhir 属性。

在 DateTime 和 DateTimeOffset c# 类中有一些扩展方法可以帮助您在 (.ToFhirDate() 和 .ToFhirDateTime(offset)) 中编写这些假设

https://github.com/FirelyTeam/fhir-net-api/blob/355c8ece1bdc81cd6354dd7c7f01381a5d99725d/src/Hl7.Fhir.Core/Support/DateExtensions.cs#L32

将所有值强制为 UTC 是一种方法,但如果您的数据库不期望这样,那么您将进一步混淆事情。

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2019-02-27
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多