С помощью NodaTime, как отформатировать ZonedDateTime в текущей культуре

У меня есть ZonedDateTime, и я хочу отобразить его так, чтобы дата и время были отформатированы с короткой датой и коротким временем, настроенными на рабочей станции, за которым следует смещение (что-то вроде ... 05/01/2005 14:30 -05: 00 ). Я ожидал, что что-то вроде этого сработает ...

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

НО, похоже, что «g» не поддерживается в ZonedDateTimePattern так, как в LocalDateTimePattern. Приведенный выше код вызывает исключение NodaTime.Text.InvalidPatternException.

Я мог бы заменить «g» на «MM / dd / yyyy hh: mm», но тогда он не использует текущую культуру.

Я мог бы использовать LocalDateTimePattern для даты и времени, а затем объединить смещение, используя ZonedDateTimePattern. Это работает, но кажется некрасивым.

Это кажется довольно обычным делом. Я новичок в NodaTime, поэтому уверен, что что-то упустил. Я использую NodaTime 1.3.1 и нацелен на .net 4.0. Любая помощь приветствуется.


person Art L.    schedule 03.08.2015    source источник
comment
Не могли бы вы зарегистрировать это как запрос функции в системе отслеживания проблем Noda Time? Спасибо.   -  person Matt Johnson-Pint    schedule 03.08.2015


Ответы (1)


g хорош как стандартный описатель шаблона, но только сам по себе; он не может быть частью пользовательского шаблона, что вы фактически и пытаетесь сделать здесь. Вы эффективно пытаетесь смешивать и сочетать, что мы не поддерживаем :(

Помимо уже описанных вами вариантов (которые, я согласен, будут работать, но они несколько уродливы), вы можете использовать

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

По общему признанию, все еще не очень приятный - но фактически это то, что g делает в любом случае (использует два существующих коротких шаблона и просто разделяет их пробелом).

Как сказал Мэтт, отправьте запрос функции - я не уверен, какой здесь лучший подход, но я подумаю над этим.

person Jon Skeet    schedule 04.08.2015