获取和格式化与NodaTime ZonedDateTime值对应的UTC时间?

vke*_*man 2 c# utc nodatime

我有ZonedDateTime值.我需要获得相应的UTC时间并将其格式化为ISO8601字符串(不带时区).这样做的"NodaTime方式"是什么?

据我所知,我可以使用ZonedDateTime.ToDateTimeUtc()方法来获取.Net DateTime类型的Utc.我应该这样做,然后才使用ToString()

喜欢

var myresult = resZonedDateTime.ToDateTimeUtc().ToString("s")  
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*int 7

有几种不同的方式,具体取决于您正在寻找什么.

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

  • 如果你想要Z,那么使用方法将你转换ZonedDateTime成一个.Instant.ToInstant()

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

    LocalDateTime ldt = zdt.WithZone(DateTimeZone.Utc).LocalDateTime;
    
    Run Code Online (Sandbox Code Playgroud)

接下来,您需要决定是否要使用基于BCL的API内联字符串,或者是否要使用基于模式的API.Noda Time支持两者,您可以在用户指南中阅读.

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

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

同样,所有这些都在用户指南"文本"章节中,我建议您阅读.