1

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

4

1 回答 1

1

如果您只是在寻找“当前”瞬间,例如代表now,那么使用:

Instant now = SystemClock.Instance.Now;

将其称为“GMT 瞬间”是多余的,因为该Instant类型代表一个通用时刻,而与时区无关。它(大部分)等同于 UTC - 与 GMT 基本相同。换句话说,你不能创建一个Instant不是GMT的。

考虑 an 的另一种方式Instant是,就好像它是一个DateTime.Kind属性永久固定DateTimeKind.Utc且不能代表其他任何东西的 a。

此外,根据您的应用程序的架构方式,您可能会发现改用该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在转换中使用了。这对如何从由于夏令时而可能无效或不明确的本地时间进行转换做出了某些假设。这可能是可以接受的,或者您可能更喜欢使用InZoneStrictly哪个会抛出异常,或者InZone允许您传递解析器函数以便您可以提供自己的逻辑。

于 2013-10-02T19:07:18.667 回答