【问题标题】:Get and format UTC Time corresponding to NodaTime ZonedDateTime value?获取并格式化与 NodaTime ZonedDateTime 值对应的 UTC 时间?
【发布时间】:2014-10-29 19:00:18
【问题描述】:

我有 ZonedDateTime 值。我需要获取相应的 UTC 时间并将其格式化为 ISO8601 字符串(无时区)。 什么是正确的“NodaTime 方式”?

我知道我可以使用ZonedDateTime.ToDateTimeUtc() 方法来获取.Net DateTime Kind of Utc。我应该这样做然后只使用ToString()吗?

喜欢

var myresult = resZonedDateTime.ToDateTimeUtc().ToString("s")  

我真的应该在那里使用“s”吗?

【问题讨论】:

    标签: c# utc nodatime


    【解决方案1】:

    有几种不同的方法,具体取决于您要查找的内容。

    首先,您需要决定是需要2014-10-30T16:46:49 之类的值还是2014-10-30T16:46:49Z 之类的值。 ISO8601 允许这两种方法,但末尾的 Z 在值为 UTC 时专门使用。如果您将字符串发送到其他地方,接收方将不必猜测该值的基础是什么。

    • 如果您想要Z,则使用.ToInstant() 方法将您的ZonedDateTime 转换为Instant

      Instant instant = zdt.ToInstant();
      
    • 如果您想要 Z,但仍希望该值反映 UTC,则将您的 ZonedDateTime 调整为 UTC,然后将其剥离为 LocalDateTime 使用它.LocalDateTime 属性。

      LocalDateTime ldt = zdt.WithZone(DateTimeZone.Utc).LocalDateTime;
      

    接下来,您需要决定是使用基于 BCL 的 API 内联格式化字符串,还是使用基于模式的 API。 Noda Time 两者都支持,你可以阅读in the user guide

    • 基于 BCL 的 API 允许您使用您已经熟悉的方法,例如 .ToString().ToString("some format", someCulture) 例如:

      string s = instant.ToString();
      

      string s = ldt.ToString("s", CultureInfo.InvariantCulture);
      
    • 基于模式的 API 将解析格式字符串的工作与进行实际格式化的工作分开,分为两个步骤:

       var pattern = InstantPattern.ExtendedIsoPattern;
       var s = pattern.Format(instant);
      

      如果要格式化许多项目,效率会更高。我通常在使用 LINQ 时使用它。例如:

      var pattern = InstantPattern.GeneralPattern;
      var strings = instants.Select(pattern.Format);
      

      var pattern = LocalDateTimePattern.GeneralIsoPattern;
      var strings = ldts.Select(pattern.Format);
      

    最后,您需要考虑您想要的精度。在模式 API 中,“通用”格式精确到整秒。 “扩展”格式包括最多 7 个小数位的小数秒。您还可以在各种模式类上使用 Create... 静态方法创建自己的模式。

    如果您只是使用ToString,请记住默认格式可能是也可能不是您要查找的格式。同样,您可以传递格式字符串。对于 Instant 值,"g" 精确到整秒,但如果您需要精度,您可以使用自定义字符串 "yyyy'-'MM'-'dd'T'HH':'mm':'ss;FFFFFFF'Z'"。对于LocalDateTime 值,"s" 精确到整秒,"o" 精确到小数点后 7 位。

    同样,所有这些都在"Text" chapter of the user guide 中,我鼓励您阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2020-06-26
      • 2020-03-09
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多