从当地时间转换为GMT(使用nodatime的世界时钟应用程序)

时间:2013-09-27 02:09:42

标签: c# .net datetime data-conversion nodatime

我正在尝试使用Nodatime编写一个世界时钟,我在网上搜索了如何使用该库的示例,我已经阅读了文档,并且它说Instant类只是一些“滴答声”因为一些任意时代的Unix时代,它对应于1970年1月1日午夜UTC。好吧,我凭经验猜测,如果我使用即时GMT值,那么我可以用它来计算每个时区的时间值(创建世界时钟),并且它有效。我遇到的问题是,我不知道从当地时间计算GMT时间(或GMT时刻)的简单方法,我的时区是“America / Mexico_City”,所以我的问题是,有没有捷径已经在Nodatime中定义以从当地时间获得GMT时间,或者另一方面,是否有一种简单的方法来实现“Instant GetInstantGMT()”功能(该功能必须考虑到白天节省时间的问题) ?

1 个答案:

答案 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允许您传递解析器函数以便提供自己的逻辑。