【问题标题】:TimeZoneInfo on MonoTouch and .NET do not matchMonoTouch 和 .NET 上的 TimeZoneInfo 不匹配
【发布时间】:2012-04-27 18:57:02
【问题描述】:

在 MonoTouch 上使用TimeZoneInfo.Local.Id 时,我得到CET(中欧时间)。在 ASP.NET 上,我得到 Central Europe Standard Time

我需要将时区从 iOS 设备 (MonoTouch) 传输到我的 ASP.NET Web 服务。仅传输时区差异 (UTC +1) 是不够的,因为这不遵守特定国家/地区的夏令时设置。

将 iPhone 的时区获取到我的网络服务的最佳方式是什么?

【问题讨论】:

    标签: asp.net .net ios xamarin.ios timezone


    【解决方案1】:

    MonoTouch 中的时区数据源不止一个。

    一个来自 .NET 基类库 (BCL),System.TimeZoneInfo,它旨在与 Microsoft .NET 实现兼容(它是结构,而不是数据)。它有两个缺点。

    • 不是 100% 兼容 MS 数据(使用了不同的数据源);

    • 如果不使用更新后的 MonoTouch 重新构建您的应用程序,则无法更新它;

    另一个是MonoTouch.Foundation.NSTimeZone 绑定到iOS API。 API 有点不同,但它返回的数据与其他 iOS 应用程序将使用的数据相匹配,并且会更新(使用 iOS 更新)。

    将 iPhone 的时区获取到我的网络服务的最佳方式是什么?

    IMO MonoTouch.Foundation.NSTimeZone 更适合上述原因。

    仅传输时区差异 (UTC +1) 是不够的,因为这不符合特定国家/地区的夏令时设置。

    至于您与 UTC 的偏移量,您可以通过以下方式获得特定于日光的偏移量(以秒为单位):

    var dlo = NSTimeZone.LocalTimeZone.DaylightSavingTimeOffset (NSDate.Now);
    

    【讨论】:

    • 谢谢,我要试试 NSTimeZone 类。关于 DST,仅捕获 current DST 偏移量对我来说是不够的,我需要完整的时区。否则我无法计算用户将来的 DST 偏移量,因为 DST 切换日期会有所不同。
    • NSTimeZone 有更多可用的 API,请参阅:api.xamarin.com/?link=T%3aMonoTouch.Foundation.NSTimeZone
    【解决方案2】:

    由于设备不同 - 我会考虑导出两者之间的映射。

    您的 Monotouch 应用程序可能应该这样做 - 对于可用时区中列出的每个 TimeZoneInfo Id,将映射存储到服务器上相同 TimeZoneInfo 的 Id。

    另外,请注意服务器上的时区是由 Windows 更新驱动的,并且可能不一定在每个 Web 服务器上都相同(如果你有一个场) - 正如我前几天在我的一个服务器上发现的那样让我很烦恼网络应用程序。更多信息:http://support.microsoft.com/gp/cp_dst

    【讨论】:

      【解决方案3】:

      TimeZoneInfo 在 Windows 上使用 Windows 时区 ID - 而在 MonoTouch 上,它可能会使用任何 iOS ID(虽然我有点惊讶你得到 CET 而不是 zoneinfo 名称)。

      即使您在两者之间进行映射,我也不总是期望得到相同的结果。 Windows 将在不同时间将时区信息更新到 iOS。您应该或者在单个系统上执行所有时区计算,在两个地方使用您自己的“嵌入式”时区实现以确保一致性。我的Noda Time 项目可能在这里工作,但我从未尝试在 MonoTouch 中使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 2011-11-15
        • 1970-01-01
        相关资源
        最近更新 更多