我有ZonedDateTime值.我需要获得相应的UTC时间并将其格式化为ISO8601字符串(不带时区).这样做的"NodaTime方式"是什么?
据我所知,我可以使用ZonedDateTime.ToDateTimeUtc()方法来获取.Net DateTime类型的Utc.我应该这样做,然后才使用ToString()?
喜欢
var myresult = resZonedDateTime.ToDateTimeUtc().ToString("s")
Run Code Online (Sandbox Code Playgroud)
我真的应该在那里使用"s"吗?
有几种不同的方式,具体取决于您正在寻找什么.
首先,您需要决定是否需要类似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支持两者,您可以在用户指南中阅读.
基于BCL的API允许您使用您已经熟悉的方法,例如.ToString()和.ToString("some format", someCulture) :
string s = instant.ToString();
Run Code Online (Sandbox Code Playgroud)
要么
string s = ldt.ToString("s", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)基于模式的API将解析格式字符串的工作与执行实际格式分离,分为两步:
var pattern = InstantPattern.ExtendedIsoPattern;
var s = pattern.Format(instant);
Run Code Online (Sandbox Code Playgroud)
如果您要格式化许多项目,效率会更高.我通常在使用LINQ时使用它.例如:
var pattern = InstantPattern.GeneralPattern;
var strings = instants.Select(pattern.Format);
Run Code Online (Sandbox Code Playgroud)
要么
var pattern = LocalDateTimePattern.GeneralIsoPattern;
var strings = ldts.Select(pattern.Format);
Run Code Online (Sandbox Code Playgroud)最后,你需要考虑你想要的精度.在模式API中,"常规"格式精确到整秒."扩展"格式包括小数秒,最多7位小数.您还可以使用Create...各种模式类上的静态方法创建自己的模式.
如果您刚刚使用ToString,请记住,默认格式可能是您正在寻找的,也可能不是.同样,您可以传递格式字符串.对于Instant值,"g"精确到整秒,但"yyyy'-'MM'-'dd'T'HH':'mm':'ss;FFFFFFF'Z'"如果需要精度,则可以使用自定义字符串.对于LocalDateTime值,"s"精确到整秒,"o"精确到7位小数.
| 归档时间: |
|
| 查看次数: |
2721 次 |
| 最近记录: |