使用 NodaTime,如何在当前文化中格式化 ZonedDateTime

With NodaTime, how do I format a ZonedDateTime in current culture

我有一个 ZonedDateTime,我想显示它,这样日期时间的格式是工作站上配置的短日期和短时间,后跟偏移量(类似于... 05/01/2005 02:30 下午 -05:00)。我预计这样的事情会奏效...

var patternDateTimeOffset = 
   ZonedDateTimePattern.CreateWithCurrentCulture("g o<m>", DateTimeZoneProviders.Tzdb);
lblOriginalDateTimeAndOffsetVal.Text = patternDateTimeOffset.Format(zonedDateTime);

但是,ZonedDateTimePattern 似乎不像 LocalDateTimePattern 那样支持 "g"。上面的代码抛出 NodaTime.Text.InvalidPatternException.

我可以将 "g" 替换为 "MM/dd/yyyy hh:mm",但它没有使用当前的文化。

我可以使用 LocalDateTimePattern 作为日期时间,然后使用 ZonedDateTimePattern 连接偏移量。这有效,但看起来很丑。

这似乎是一件很常见的事情。我是 NodaTime 的新手,所以我确定我遗漏了一些东西。我正在使用 NodaTime 1.3.1 并以 .net 4.0 为目标。感谢任何帮助。

g 作为标准模式说明符很好 - 但仅限于它自己;它不能是自定义模式的一部分,而这正是您在这里有效地尝试做的事情。你实际上是在尝试混合搭配,我们不支持:(

除了您已经概述的选项(我同意可以使用,但有点难看)之外,您还可以使用

var bclDateFormat = CultureInfo.CurrentCulture.DateTimeFormat;
var localDateTimePattern =
    bclDateFormat.ShortDatePattern + " " + bclDateFormat.ShortTimePattern;
var patternDateTimeOffset = ZonedDateTimePattern.CreateWithCurrentCulture(
    localDateTimePattern + " o<m>",
    DateTimeZoneProviders.Tzdb);

诚然,仍然不是很令人愉快——但这实际上是 g 所做的(使用两个现有的短模式,只是 space 将它们分开)。

正如 Matt 所说,请提交功能请求 - 我不确定最好的方法是什么,但我会考虑一下。