我正在尝试使用Nodatime编写一个世界时钟,我在网上搜索了如何使用该库的示例,我已经阅读了文档,并且它说Instant类只是一些“滴答声”因为一些任意时代的Unix时代,它对应于1970年1月1日午夜UTC。好吧,我凭经验猜测,如果我使用即时GMT值,那么我可以用它来计算每个时区的时间值(创建世界时钟),并且它有效。我遇到的问题是,我不知道从当地时间计算GMT时间(或GMT时刻)的简单方法,我的时区是“America / Mexico_City”,所以我的问题是,有没有捷径已经在Nodatime中定义以从当地时间获得GMT时间,或者另一方面,是否有一种简单的方法来实现“Instant GetInstantGMT()”功能(该功能必须考虑到白天节省时间的问题) ?
答案 0 :(得分:1)
如果你只是在寻找"当前"即时,这样代表现在,然后使用:
Instant now = SystemClock.Instance.Now;
将其称为" GMT即时"是多余的,因为Instant
类型代表了一个不受时区影响的普遍时刻。它(大部分)等同于UTC - 与GMT基本相同。换句话说,您无法创建不是 GMT的Instant
。
考虑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
允许您传递解析器函数以便提供自己的逻辑。