Как использовать NodaTime для форматирования строки с ShortDatePattern для культуры?

С С# DateTime и культурой я могу отформатировать строку с помощью:

DateTime exampleDate = DateTime.Now;
CultureInfo culture = new CultureInfo("fr-FR");
String datetimeFormat = exampleDate.ToString(culture.DateTimeFormat.ShortDatePattern));

Как мне добиться того же с помощью NodaTime? Я пробовал комбинации по строкам (не компилируется - ToString требует двух параметров с NodaTimef):

DateTimeZone timeZone = DateTimeZoneProviders.Tzdb["fr-FR"];
ZonedDateTime nowZonedDateTime = new ZonedDateTime(Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime()), timeZone);
String nodaFormat = nowZonedDateTime.LocalDateTime.ToString(culture.DateTimeFormat.ShortDatePattern));

Я также пробовал комбинации вокруг документации, которая указывает, что мне нужно использовать «d» для форматирования на короткую дату (это вызывает исключение):

String nodaFormat = nowZonedDateTime.LocalDateTime.ToString("d", culture));

Что мне не хватает?


person Jay Walks    schedule 27.12.2019    source источник
comment
Пожалуйста, отредактируйте вопрос, чтобы показать, какая ошибка времени компиляции возникает при вашей первой попытке, и какое исключение возникает при второй попытке. (Я также настоятельно рекомендую использовать IClock вместо DateTime.Now - с включенным ZonedClock это становится намного проще...)   -  person Jon Skeet    schedule 27.12.2019
comment
Спасибо, Джон, я обновил вопрос, надеюсь, он стал яснее. Я раньше не использовал IClock, посмотрю, смогу ли я найти какую-нибудь документацию. Спасибо! :-)   -  person Jay Walks    schedule 28.12.2019


Ответы (1)


Во-первых, в TZDB нет часового пояса с идентификатором fr-FR, вы имели в виду Europe/Paris?

Во-вторых, ToString фактически принимает 2 параметра - строку шаблона и IFormatProvider, который может быть вашим CultureInfo. Итак, вы почти у цели — вам просто нужно передать culture в качестве второго аргумента:

CultureInfo culture = new CultureInfo("fr-FR");
DateTimeZone timeZone = DateTimeZoneProviders.Tzdb["Europe/Paris"];
ZonedDateTime nowZonedDateTime = new ZonedDateTime(Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime()), timeZone);
String nodaFormat = nowZonedDateTime.LocalDateTime.ToString(culture.DateTimeFormat.ShortDatePattern, culture);
// nodaFormat would be "27/12/2019"
person Sweeper    schedule 27.12.2019