我正在构建一个 Windows 商店时钟应用程序来显示用户的当前时间以及世界各地不同城市的时间。
最初,我计划完全使用谷歌等的时区网络服务来完成这项工作,但在查看了免费帐户中允许的请求数量以及获得付费帐户所涉及的成本之后,我觉得最好找到一个替代方案无需抵押房屋即可解决。
环顾四周,我发现了 John Skeet 和团队的优秀 NodaTime 库。在翻阅文档并在此处查看 stackoverflow 之后,我的脑海中仍然嗡嗡作响所有与日期时间和时区相关的术语和转换方法。无论如何,我认为我可以通过 2 个选项来做到这一点:
选项 1:使用 DateTime.Now 获取当前系统时间,然后使用 nodatime 获取其他区域的时间,如下所示(基于 Matt Johnson 回复关于 SO 的另一个问题时提供的代码):
DateTimeZone homeZone = DateTimeZoneProviders.Tzdb["Asia/Colombo"];
LocalDateTime homeTime = LocalDateTime.FromDateTime(DateTime.Now);
ZonedDateTime homeTimeInZone = homeTime.InZoneStrictly(homeZone);
TbTime1.Text = "Home time is: " + homeTimeInZone.ToDateTimeOffset();
DateTimeZone timeZone1 = DateTimeZoneProviders.Tzdb["Australia/Perth"];
ZonedDateTime timeZone1Time = homeTimeInZone.WithZone(timeZone1);
TbTime2.Text = "Timezone 1 time is: " + timeZone1Time.ToDateTimeOffset();
选项 2:经过进一步研究,我找到了这个解决方案,并且觉得它也可以像这样很好地工作:
public ZonedDateTime GetTimeInTimeZone(string timeZone)
{
// Timezone is olson timezone e.g. "Asia/Colombo"
Instant now = SystemClock.Instance.Now;
var zone = DateTimeZoneProviders.Tzdb[timeZone];
ZonedDateTime zonedDateTime = now.InZone(zone);
return zonedDateTime;
}
现在让我尝试解决这个问题:在上述两个选项中,依赖于DateTime.Now或SystemClock.Instance.Now以首先识别用户的系统时间,然后将其转换为所需时区的城市时间。但是如果用户的系统没有设置正确的时间会怎样呢?我相信(如果错了,请纠正我) DateTime.Now 和 SystemClock.Instance.Now 都使用系统时钟来获取当前时间?假设系统时间设置不正确,那么由于我们对用户系统时间的依赖,任何时区转换都会简单地显示其他城市的错误时间。
在这种情况下,如何在不依赖系统时钟的情况下确定用户的当前时间?我应该恢复使用网络服务来使用 lat/long 获取用户的当前时区,还是有更好的选择使用可以离线工作的 NodaTime 等?谢谢。