【问题标题】:Convert from local time to GMT (World Clock application using nodatime)从本地时间转换为 GMT(使用 nodatime 的世界时钟应用程序)
【发布时间】:2013-10-03 05:04:45
【问题描述】:

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

【问题讨论】:

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2013-10-29
      • 2014-01-11
      • 2012-08-28
      • 2016-07-11
      • 2010-09-15
      相关资源
      最近更新 更多