2013-09-27 38 views
1

我想使用Nodatime编程世界时钟,并且我已经在网上搜索了关于如何使用该库的示例,并且我已阅读文档,说Instant类只是一些“滴答滴答”,因为一些任意时代的Unix纪元,对应于1970年1月1日午夜的UTC。那么,我凭经验猜测,如果我使用GMT作为即时值,那么我可以用它计算每个时区的时间值(创建世界时钟),并且它可以工作。我有的问题是,我不知道从当地时间计算GMT时间(或GMT时间)的简单方法,我的时区是“America/Mexico_City”,所以我的问题是,有没有捷径已经在Nodatime中定义从当地时间获得GMT时间,或者另一方面,是否有一种简单的方法来实现“即时GetInstantGMT()”功能(该功能必须计算日光节约时间问题) ?从本地时间转换为格林尼治标准时间(使用nodatime的世界时钟应用程序)

回答

1

如果你只是在寻找的“当前”的瞬间,例如代表现在,然后使用:

Instant now = SystemClock.Instance.Now; 

称它是“GMT瞬间”是多余的,因为Instant类型是代表通用时刻不考虑时区。它(大部分)等同于UTC - 与GMT基本相同。换句话说,您无法创建Instant,即不是 GMT。

另一种方式来思考一个Instant是因为如果它是一个DateTime.Kind财产被永久固定DateTimeKind.Utc并不能代表任何东西。

而且,这依赖于你的应用程序如何构建,你可能会发现使用IClock接口来代替:

IClock clock = SystemClock.Instance; 
Instant now = clock.Now; 

这将使你的单元测试过程中更换系统时钟用假时钟。

关于如何从一个特定的本地时间去一个Instant,你会做这样的事情:

LocalDateTime ldt = new LocalDateTime(2013, 1, 1, 0, 0, 0); 
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Mexico_City"]; 
ZonedDateTime zdt = ldt.InZoneLeniently(tz); 
Instant instant = zdt.ToInstant(); 

注意,我在转换中使用InZoneLeniently。这使得关于如何从当地时间进行翻译的某些假设可能无效或模糊,因为daylight saving time。这可能是可以接受的,或者你可能更喜欢使用InZoneStrictly这会抛出异常,或者InZone,它允许你传递一个解析器的功能,所以你可以提供你自己的逻辑。

相关问题