【问题标题】:Get UTC offset from TimeZoneInfo.Local.StandardName从 TimeZoneInfo.Local.StandardName 获取 UTC 偏移量
【发布时间】:2018-10-02 22:05:24
【问题描述】:

我正在使用 Xamarin 为 ios 制作应用程序,该应用程序已在世界各地(目前为美国、欧洲和非洲)使用。

本应用将注册数据发送到服务器,用户想查看数据本地化到注册的时间。

所以我想我会将 DateTime.UtcNow 和时区名称一起存储在数据库中,所以我使用了 TimeZoneInfo.Local.StandardName,并认为我会使用这两个字段来显示本地化的 utc 日期时间时区,但我遇到了一些问题。

如何从这个“StandardName”获得时区偏移,这些是我在 iOS 上从 Xamarin 获得的一些值:“CET”、“WAT”(我认为是刚果)、“EST”和“+0545” (这是什么???)

或者,我是否应该存储偏移量,我认为它应该很容易在每个设备上获取?

【问题讨论】:

    标签: c# ios xamarin


    【解决方案1】:

    如果您需要存储时区 ID,请存储 TimeZoneInfo.Id,而不是 StandardName。我希望任何基于 Unix 的系统上的时区 ID 看起来像“欧洲/伦敦”等。(这是IANA time zone ID 格式。)

    然后您应该能够使用TimeZoneInfo.FindSystemTimeZoneById 再次恢复时区。但请注意,如果您尝试在 Windows 上通过 IANA ID 获取时区,或在 Unix 上通过 Windows ID 获取时区,则将不起作用。如果这是一个问题,您可能需要考虑在任何地方使用一致的时区数据库,可能会使用我的Noda Time project,它附带了一个包含在其中的 IANA 数据库。然后你可以在 Unix 和 Windows 机器上使用它。

    如果用于当前或过去的事件,则可以存储偏移量。为 future 事件存储它是有风险的,因为这意味着如果时区规则发生变化,您将无法采取行动。即使在此处存储 UTC 值和时区 ID 也可能存在风险:如果您想表示“2025 年 2 月 1 日在巴黎上午 9 点”,那么您可能希望完全存储该信息,而不是“The我目前预测的 UTC 时刻将映射到巴黎上午 9 点”。

    【讨论】:

    • 谢谢!我将日期存储为 UTC,并为 UTC 偏移量存储一个单独的列(我猜是整数保持分钟),因为这完全是过去的事件。我可能还会存储时区 ID,并与“本地时间”一起显示。
    • 只是对“TimeZoneInfo.Id”的评论,对于在 iPad 上运行 Xamarin 的“TimeZoneInfo.Local.Id”,这是“本地”,所以没有多大用处......我不得不使用 iOS像这样获取 IANA 字符串的 TimeZone 对象:NSTimeZone.LocalTimeZone.Name。我想我应该将此报告为 xamarin 错误...
    • @Tompi:是的,我现在记得有些 Xamarin 环境对于 TimeZoneInfo.Local 来说非常糟糕。在 Noda Time 中,我们尝试根据其在近期历史不同点的偏移量来计算时区。
    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2013-10-15
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2011-07-29
    相关资源
    最近更新 更多