#.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
явно, но оно, ну, короче. (А также не могут быть случайно объединены с «неправильной» культурой.)