【问题标题】:Access Current System Time Zone访问当前系统时区
【发布时间】:2016-09-11 06:10:45
【问题描述】:

基本上我可以使用以下代码检测系统时区列表:

foreach(TimeZoneInfo info in tz)
    Debug.Log("time zone id : " + info.Id + " display name : " + info.DisplayName);

运行此代码,我在控制台中有以下输出。

在这个列表中,我想知道,我当前的系统在关注哪一个? 因为我想要关于那个时区的具体信息。就像下面的代码一样,我写得很清楚“亚洲/加尔各答”。

TimeZoneInfo infos = System.TimeZoneInfo.FindSystemTimeZoneById("Asia/Kolkata");

通过运行哪个代码,我可以获得“Asia/Kolkata”作为输出?

编辑:我已经在这里使用了 NodaTime 并为此目的运行代码。

  // Create a NodaTime DateTimeZoneSource object for IANA time zone names
    var dateTimeZoneSource = TzdbDateTimeZoneSource.Default;

    // Get the Windows time zone by name (or use TimeZoneInfo.Local)
    var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");

    // Convert between Windows and IANA time zone names
    var tzdbTimeZoneInfo = dateTimeZoneSource.MapTimeZoneId(timeZoneInfo);

    Console.WriteLine(tzdbTimeZoneInfo);

但在这方面,我得到了例外,

引发了“System.TimeZoneNotFoundException”类型的异常。

我使用 Mac 系统和编辑器作为 Mono Develop - Unity,我的目标设备是 iPhone。

【问题讨论】:

    标签: c# unity3d timezone system monodevelop


    【解决方案1】:
    【解决方案2】:

    使用下面的代码可以获取本地 TimeZoneInfo 对象。

    TimeZoneInfo infos = TimeZoneInfo.Local;
    

    【讨论】:

    • 使用这个,我得到“本地”的输出,我想要“亚洲/加尔各答”的输出。
    • 使用 infos.DisplayName 属性从 TimeZoneInfo 对象中获取显示名称。
    • 关闭。使用Id,而不是DisplayName
    • @MattJohnson,它没有像那样显示亚洲/加尔各答。
    • @Siddharth - TimeZoneInfo.Local.Id 确实是正确的 API。它在 Unity 中返回什么?有an open bug related to TimeZoneInfo in Unity - 尽管关于问题的不同部分。不过,这可能是相关的。另请参阅this question
    【解决方案3】:

    使用这个

    TimeZoneInfo infos = TimeZoneInfo.FindSystemTimeZoneById(
                 { "Asia/Kolkata", "India Standard Time" }); 
    

    您可以查看 TimeZoneIds 的此链接

    http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html

    【讨论】:

    • 在这个 FindSystemTimeZoneById("India Standard Time") 不起作用,我已经在我的问题中给出了例外。
    • 以上代码存在语法错误,无法运行
    • 好的,通过搜索我找到了一个链接,通过实现帮助函数解决了你的问题,你可以看到这个链接:stackoverflow.com/questions/5996320/…
    • 尝试使用这个TimeZoneInfo infos = System.TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"); Console.WriteLine(infos);你会发现这个属性可以帮助你infos.infos.Idinfos.DisplayNameinfos.BaseUtcOffset
    • @Muhmmad Hassan, TimeZoneInfo infos = System.TimeZoneInfo.FindSystemTimeZoneById("印度标准时间");正在为我产生异常。我已经提到了问题。
    【解决方案4】:

    在 Unity5.1.3 编辑器窗口中,TimeZoneInfo.GetSystemTimeZones() 返回空列表。 TimeZoneInfo.FindSystemTimeZoneById() 和 TimeZoneInfo.CreateCustomTimeZone() 都会引发 System.TimeZoneNotFoundException。 但它在安卓设备上运行良好。

    private static DateTime ToSeoulTime(DateTime dateUtc, bool ignoreUnspecified = false)
    {
        if (ignoreUnspecified == false && dateUtc.Kind == DateTimeKind.Unspecified)
        {
            if (UnityEngine.Application.isEditor)
            {
                throw new Exception("dateUtc.Kind == DateTimeKind.Unspecified");
            }
            else
            {
                UnityEngine.Debug.LogWarning("dateUtc.Kind == DateTimeKind.Unspecified");
            }
        }
        try
        {
            var seoulTimezone = TimeZoneInfo.FindSystemTimeZoneById("Korea Standard Time");
            return TimeZoneInfo.ConvertTime(dateUtc, seoulTimezone);
        }
        catch (System.TimeZoneNotFoundException e)
        {
            return new DateTime(dateUtc.AddHours(9).Ticks, DateTimeKind.Unspecified);
        }
    }
    

    【讨论】:

    • 基本上我的目标平台是 iPhone 所以我可以运行这条线, var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
    • 在 Unity 编辑器中,我遇到了上面我在问题中提到的异常。
    • 使用这种方式,我可以映射多少个时区?因为我想覆盖所有时区。
    • 我也收到异常“TimeZoneInfo.ConvertTime”,我修改了答案,
    【解决方案5】:

    更新您的播放器设置以使用 .NET 4.6

    【讨论】:

      【解决方案6】:

      将您的 .NET API 兼容性设置为 4.6。以下是我的 iOS 设备上的测试结果:

      TimeZoneInfo.Local.Id
      Editor: Local
      iOS Device: Local
      
      TimeZoneInfo.Local.DisplayName
      Editor: Local
      iOS Device: (GMT+03:30) Local Time
      
      TimeZoneInfo.Local.StandardName
      Editor: +0330
      iOS Device: +0330
      
      TimeZoneInfo.Local.DaylightName
      Editor: +0430
      iOS Device: +0430
      
      TimeZoneInfo.Local.BaseUtcOffset.Hours + ":" + TimeZoneInfo.Local.BaseUtcOffset.Minutes);
      Editor: 3:30
      iOS Device: 3:30
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-14
        • 2011-07-02
        • 2012-04-10
        • 2020-09-28
        • 2011-01-09
        • 1970-01-01
        相关资源
        最近更新 更多