【发布时间】: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"));
}
- LogCat 给了我
- 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。
-
好的,谢谢!节点时间对我有用。我使用了 NodaTime.2.4.13。 Jon Skeet 让 3.x 也可以工作,我现在才没有...github.com/nodatime/nodatime/issues/1525 这个周末我会做更多的测试。我还将尝试让您的 TZConvert 在 Unity 中再次工作。正如您所指出的,在统一 atm 中存在一个错误,在我的 android 构建 TimeZoneInfo.GetSystemTimeZones() 中返回一个空集合。
标签: c# android unity3d timezone