【发布时间】:2013-09-18 12:25:33
【问题描述】:
我正在构建一个 Windows 商店时钟应用程序来显示用户的当前时间以及世界各地不同城市的时间。
最初,我计划完全使用 Google 等提供的时区网络服务,但在查看了免费帐户中允许的请求数量以及获得付费帐户所涉及的成本之后,我觉得最好无需抵押房屋即可找到替代解决方案。
四处搜索,我找到了 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:进一步查看后,我找到了this solution,感觉它也可以像这样很好地工作:
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 等?谢谢。
【问题讨论】:
-
如果用户时间错误,那么他们可能不需要时间完全准确(或无效的窗口副本)。您可以随时将他们的时间与网络时钟进行一次比较。
-
@Sayse 作为一个时钟应用程序,即使系统设置不正确,用户也会希望它显示正确的时间。我收到了足够多的支持请求,存在这个问题,因此这个问题。与网络时钟比较是一种选择,但只是想知道是否有另一种方法。
标签: c# windows datetime windows-store-apps nodatime