Значения даты для инвариантных строк

#.net #date

#.net #Дата

Вопрос:

У меня есть строка, содержащая дату в немецком формате (дд.ММ.гггг), поэтому разделителем даты является точка.

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

Мне нужно преобразовать эту строку даты в инвариантную строку даты (гггг / ММ / дд).

И вот мои проблемы:

Если я делаю очевидное, например

 Convert.ToDateTime(value, CultureInfo.GetCultureInfo("de-DE"))
       .ToString(CultureInfo.InvariantCulture)
  

Я получаю строку в инвариантной культуре, но она также содержит нежелательную временную часть, поэтому я получаю, например, «2020/11/09 00:00:00».

Итак, я подумал про себя, я расскажу.NET, что я просто хочу ShortDataPattern , чтобы подобное

 Convert.ToDateTime(value, CultureInfo.GetCultureInfo("de-DE"))
       .ToString(CultureInfo.InvariantCulture.DataTimeFormats.ShortDatePattern)
  

Но поскольку ShortDatePattern инвариантная культура есть yyyy/MM/dd , и я нахожусь на немецком компьютере, где разделителем дат является точка, я получаю «2020.11.09».

Единственные другие способы, о которых я могу думать, — это своего рода хакерские, например, использование первого способа и сокращение временной части с помощью строковых операций. Или вместо использования CultureInfo.InvariantCulture.DataTimeFormats.ShortDatePattern using yyyy/MM/dd (маскирование косых черт для использования в качестве литералов).

Существуют ли какие-либо другие способы, которые не являются хакерскими, чтобы получить строку даты без времени в инвариантном формате, независимо от культуры компьютера, на котором я нахожусь?

Комментарии:

1. Просто сделайте value.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture) . Обратите внимание, что это не собственный формат инвариантной культуры; это было бы value.ToString("d", CultureInfo.InvariantCulture) и дает 11/09/2020 (дд / ММ / гггг). Инвариант ! = глобальный стандарт, если вам нужны даты ISO 8601, я бы рекомендовал придерживаться yyyy-MM-dd .

2. Спасибо за толчок в правильном направлении. Я хочу избежать предоставления какой-либо пользовательской информации о форматировании, поэтому я использую Convert.ToDateTime(value, CultureInfo.GetCultureInfo("de-DE")).ToString(CultureInfo.InvariantCulture.DateTimeFormat.ShortDatePattern, CultureInfo.InvariantCulture)

3. … или yyyyMMdd (который является другим вариантом ISO8601)

4. Я знаю о форматах ISO, но наш клиент ожидает строк с инвариантными значениями, поэтому я должен придерживаться их.

5. Технически "d" это не пользовательское форматирование, это одна из стандартных строк форматирования . Это имеет точно такой же эффект, как и использование ShortDatePattern явно, но оно, ну, короче. (А также не могут быть случайно объединены с «неправильной» культурой.)