最初,我计划完全使用来自Google等的时区Web服务来完成此操作,但在查看免费帐户中允许的请求数量以及获取付费帐户所涉及的成本后,我认为最好找到一种替代方案,而无需抵押房子。
在搜索周围时,我发现了由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();
第二种选择:经过进一步研究,我发现了这个解决方案,并且感觉它也可以很好地使用:
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都使用系统时钟来获取当前时间?假设系统时间没有设置正确,那么任何时区转换都将由于我们依赖于用户的系统时间而显示其他城市的错误时间。
在这种情况下,如何确定用户的当前时间而不依赖于他们的系统时钟?我应该使用一个Web服务来获取用户的当前时区(使用lat/long),还是有更好的选择,例如NodaTime等可以离线工作的工具?谢谢。