c# - 获取并格式化与 NodaTime ZonedDateTime 值对应的 UTC 时间?

标签 c# utc nodatime

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

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

喜欢

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

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

最佳答案

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

首先,您需要决定是否需要像 2014-10-30T16:46:49 这样的值或类似2014-10-30T16:46:49Z .两者都是 ISO8601 允许的,但尾随 Z末尾是专门为UTC时使用的。如果您将字符串发送到别处,接收方将不必猜测该值的基础是什么。

  • 如果你想要 Z , 然后转换你的 ZonedDateTimeInstant使用 .ToInstant()方法。

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

    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 中,我鼓励您阅读。

关于c# - 获取并格式化与 NodaTime ZonedDateTime 值对应的 UTC 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638510/

相关文章:

django - 如何在 Web 应用程序中管理时区?

c++ - C++ 中的当前 UTC 时间点

c# - 如何解析xs :date with NodaTime?

c# - 当我创建一个新类的实例时,我该如何做到这一点,它必须获得一个参数?

C#、WPF、Visual Studio 4 : irregular shape color filling

sqlite - SQLite 中的 UTC 时间错误

c# - 在 PostgreSQL 中存储基于 NodaTime 的值的最佳方法是什么?

c# - 如何在较低的执行级别运行部分代码

c# - C#中如何在非静态方法中调用静态方法

msbuild - 错误创建应用程序包(UWP,Appx) - fatal error CMF1106 : failed to open input PDB file for reading