【问题标题】:How to get TimeZoneInfo on Android, using Unity 2020.3.0f1?如何使用 Unity 2020.3.0f1 在 Android 上获取 TimeZoneInfo?
【发布时间】:2021-03-27 17:55:25
【问题描述】:

由于 Google Play 排行榜服务位于太平洋标准时区,我想获取那里的当地时间来更新日历,从而解锁每日关卡。一旦玩家真正启动了一个关卡,我就会从服务器获取时间。但是在应用程序启动时,我已经想为日历设置时间。但是我似乎无法获得任何 TimeZoneInfo。

        public static DateTime GetDatePacificStandardTime(this DateTime value)
    {
#if UNITY_ANDROID && !UNITY_EDITOR

        try
        {
            AndroidJavaClass Java = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

            AndroidJavaObject AndroidActivity = Java.GetStatic<AndroidJavaObject>("currentActivity");
            TimeZone timeZone = AndroidActivity.Call<TimeZone>("getTimeZone", "America/Los_Angeles");

            TimeSpan difference = timeZone.GetUtcOffset(value);

            return value.Add(difference);
        }
        catch(Exception exception)
        {
            Debug.Log("AndroidActivity.Call failed: " + exception);
        }

        try
        {
            return TimeZoneInfo.ConvertTimeFromUtc(value, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
        }
        catch (Exception exception)
        {
            Debug.Log("TimeZoneInfo.FindSystemTimeZoneById Pacific Standard Time failed: " + exception);
        }

        try
        {
            return TimeZoneInfo.ConvertTimeFromUtc(value, TimeZoneInfo.FindSystemTimeZoneById("Central Pacific Standard Time"));
        }
        catch (Exception exception)
        {
            Debug.Log("TimeZoneInfo.FindSystemTimeZoneById Central Pacific Standard Time failed: " + exception);
        }

        try
        {
            return TimeZoneInfo.ConvertTimeFromUtc(value, TimeZoneInfo.FindSystemTimeZoneById("PST"));
        }
        catch (Exception exception)
        {
            Debug.Log("TimeZoneInfo.FindSystemTimeZoneById PST failed: " + exception);
        }

        try
        {
            return TimeZoneInfo.ConvertTimeFromUtc(value, TZConvert.GetTimeZoneInfo("PST"));
        }
        catch (Exception exception)
        {
            Debug.Log("TZConvert.GetTimeZoneInfo PST failed: " + exception);
        }

        try
        {
            return TimeZoneInfo.ConvertTimeFromUtc(value, TZConvert.GetTimeZoneInfo("Pacific Standard Time"));
        }
        catch (Exception exception)
        {
            Debug.Log("TZConvert.GetTimeZoneInfo Pacific Standard Time failed: " + exception);
        }

        try
        {
            return TimeZoneInfo.ConvertTimeFromUtc(value, TZConvert.GetTimeZoneInfo("Central Pacific Standard Time"));
        }
        catch (Exception exception)
        {
            Debug.Log("TZConvert.GetTimeZoneInfo Central Pacific Standard Time failed: " + exception);
        }

        return value;
#endif
        return TimeZoneInfo.ConvertTimeFromUtc(value, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));

    }
  1. Lo​​gCat 给了我
    • 03-27 18:44:58.362:I/Unity(25251):AndroidActivity.Call 失败:System.Exception:JNI:“System.TimeZone”类型的未知签名(obj = System.TimeZone)等于
    • 03-27 18:44:58.362:I/Unity(25251):AndroidActivity.Call 失败:System.Exception:JNI:“System.TimeZone”类型的未知签名(obj = System.TimeZone)等于
    • 03-27 18:44:58.365:I/Unity(25251):TimeZoneInfo.FindSystemTimeZoneById 太平洋标准时间失败:System.TimeZoneNotFoundException:无法读取时区文件 /usr/share/zoneinfo/太平洋标准时间 -- -> System.IO.DirectoryNotFoundException: 找不到路径“/usr/share/zoneinfo/Pacific Standard Time”的一部分。
    • 03-27 18:44:58.367:I/Unity(25251):TimeZoneInfo.FindSystemTimeZoneById 中太平洋标准时间失败:System.TimeZoneNotFoundException:无法读取时区文件 /usr/share/zoneinfo/中太平洋标准时间---> System.IO.DirectoryNotFoundException: 找不到路径“/usr/share/zoneinfo/Central Pacific Standard Time”的一部分。
    • 03-27 18:44:58.370:I/Unity(25251):TimeZoneInfo.FindSystemTimeZoneById PST 失败:System.TimeZoneNotFoundException:无法读取时区文件 /usr/share/zoneinfo/PST ---> 系统。 IO.DirectoryNotFoundException:找不到路径“/usr/share/zoneinfo/PST”的一部分。
    • 03-27 18:44:58.371:I/Unity(25251):TZConvert.GetTimeZoneInfo PST 失败:System.TimeZoneNotFoundException:引发了“System.TimeZoneNotFoundException”类型的异常。
    • 03-27 18:44:58.372:I/Unity(25251):TZConvert.GetTimeZoneInfo 太平洋标准时间失败:System.TimeZoneNotFoundException:引发了“System.TimeZoneNotFoundException”类型的异常。
    • 03-27 18:44:58.373:I/Unity(25251):TZConvert.GetTimeZoneInfo 中太平洋标准时间失败:System.TimeZoneNotFoundException:引发了“System.TimeZoneNotFoundException”类型的异常。

【问题讨论】:

  • 我得调查一下。但是在您在这里展示的内容中,只有TZConvert.GetTimeZoneInfo("Pacific Standard Time") 应该可以工作(假设它正在使用我的 TimeZoneConverter 库)。你也可以试试TZConvert.GetTimeZoneInfo("America/Los_Angeles") 或者只是TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angles")(没有TimeZoneConverter)。您能否提供有关特定 Android 版本和设备的任何详细信息?它可能只是缺少时区数据。
  • 另外,您需要调用哪个特定的 Google API 需要太平洋时间?请链接到参考文档。
  • 请记住,“中太平洋标准时间”适用于太平洋中的一些岛屿,例如新喀里多尼亚 (UTC+11),这可能不是您感兴趣的。另外,“PST " 不是有效的时区 ID。
  • 您可能希望查看 this bug 并使用带有内置 TZDB 提供程序的 Noda Time 进行调查。但是,我仍然认为可能有其他方法可以解决这个问题。
  • 好的,谢谢!节点时间对我有用。我使用了 NodaTime.2.4.13。 Jon Skeet 让 3.x 也可以工作,我现在才没有...github.com/nodatime/nodatime/issues/1525 这个周末我会做更多的测试。我还将尝试让您的 TZConvert 在 Unity 中再次工作。正如您所指出的,在统一 atm 中存在一个错误,在我的 android 构建 TimeZoneInfo.GetSystemTimeZones() 中返回一个空集合。

标签: c# android unity3d timezone


【解决方案1】:

第一个解决方案:

您可以使用TimeZoneInfo.DisplayName

this post 中,您可以看到其他TimeZoneInfo 变量的输出。

第二种解决方案:

第一次打开应用时,您可以通过System.DateTime.Now获取手机当地时间,并且您知道Google Play排行榜服务时区,因此您可以保存PlayerPrefs.SetFloat("timeDifarence", Value);的时差

然后,当您需要它时,只需使用PlayerPrefs.GetFloat("timeDifarence"); 并计算机器上的时间。

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多