【问题标题】:c# handling cross country DateTime timezonec# 处理跨国DateTime时区
【发布时间】:2021-07-19 12:24:42
【问题描述】:

我正在为营养师开发一个应用程序。在这个应用程序中,营养师可以为世界各地的客户设置饮食。现在我面临一个关于营养师设置的MealTime 的问题。让我们考虑以下示例。

如果营养师在印度并将早餐用餐时间设置为28/04/2021 09:00:00 AM(IST)。我将此值以 GMT 格式 (28/04/2021 03:30:00 AM) 存储到 sql database。客户在迪拜,然后他看到早餐时间到28/04/2021 07:30:00 AM,而不是09:00:00 AM

处理这种情况的最佳方法是什么?

【问题讨论】:

  • 我建议在设置进餐时间时获取营养师的时区信息(从客户端获取时区并将其存储在数据库中)。然后使用该时区信息来操纵时间,同时将其显示给其他人
  • C# 对时区的支持很差。这就是为什么大多数开发者使用 NodaTime 而不是 DateTime/DateTimeOffset
  • 感谢您的回复。我已将营养师 Noda 时区存储到 db。喜欢Asia/Kolkata
  • @Ajay 不存储datetime。不要发送您只认为是 UTC 的内容。如果时区很重要,请使用正确的类型。这在 C# 和数据库中都是DateTimeOffset至少。以 ISO8601 格式发送日期,包括来自客户端的偏移量或时区。
  • @Ajay UTC 不是解决方案。夏季会发生什么?如果两个国家有不同的 DST 规则会怎样?下次埃及或俄罗斯决定在短时间内更改 DST 规则时会发生什么?

标签: c# sql-server timezone


【解决方案1】:

如果您改为使用DateTimeOffset 将时间存储在数据库中在您的业务域逻辑中,则时区信息在您需要时可用,而无需加入主参考识别正确的时区。

在涉及跨多个时区的查询和比较的大多数应用程序设计中,DateTimeOffset 可以显着简化查询并减少查找逻辑以解析正确的时区。主要需要注意的是,您的 UI 层应通过原始客户端数据时区,或者您的数据摄取应在写入数据时对其进行清理或转换。

在 SQL 和 C# 中,在需要时将值转换为不同的时区是很简单的,并且这些值将在本机上正确排序和过滤,而无需将它们转换为特定的时区。

由于 SQL Server 2008 DateTimeOffset 一直是有关如何管理跨多个时区的应用程序数据的指南,因此在 2021 年它不应再成为您的首选。

【讨论】:

    【解决方案2】:

    据我了解,您可以直接保存日期时间。

    例如。如果您将28/04/2021 09:00:00 AM 保存在数据库中,您的客户无论身在何处都可以看到相同的时间。

    【讨论】:

    • 感谢您的回复。但我将所有日期时间存储到GMT 时区的数据库中。
    • @Ajay 这意味着您丢失了所需的时区信息。使用 UTC 时间没有帮助。如果您关心时区,则使用 datetimeoffset 是绝对最低要求。分开存储本地时间和 IANA 时区名称要好得多。
    • 28/04/2021 09:00:00 AM 是以本地化格式存储的本地日期文字。如果不知道它所指的 country 是什么,就无法判断它所代表的实际时间。甚至不清楚这种格式指的是哪个月份:07/04/2021 09:00:00 AM 在美国表示 7 月 4 日,在英国表示 4 月 7 日。在日期分隔符为 . 的俄罗斯和德国根本不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多