#c# #datetime
#c# #datetime
Вопрос:
Сейчас мое приложение тратит время, форматирует его в строку и анализирует его обратно до допустимого значения DateTime с помощью ParseExact. Подробнее см. Ниже:
DateTime dt = DateTime.Now;
DateTime timeNow = DateTime.Now;
string timeStamp = dt.ToString("MM/dd/yyyy HH:mm:ss");
// To match different countries
if (timeStamp.IndexOf("/") > -1)
{
timeNow = DateTime.ParseExact(timeStamp, "MM/dd/yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
}
else if (timeStamp.IndexOf(".") > -1)
{
timeNow = DateTime.ParseExact(timeStamp, "MM.dd.yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
}
Разные страны используют разные форматы дат. Есть ли способ заставить мое приложение автоматически учитывать разные форматы, вместо того, чтобы создавать условие для каждого появляющегося?
Спасибо за любую помощь,
Эван
Комментарии:
1. Как насчет 1/2/2011? США будут анализировать это как январь, Испания будет анализировать это как февраль.
2. Это то, о чем я так беспокоюсь…
3. Да, я думаю, вам нужно «нормализовать» все даты в какой-то общий формат, чтобы все было на одном уровне. Переосмыслите дизайн своего приложения, если это невозможно. Вы могли бы просто хранить все внутри, как дни с 1 января 1980 года или что-то в этом роде, а затем использовать класс DateTime для анализа и отображения дат.
Ответ №1:
Если ваше приложение использует строковое представление для дат внутри, я бы предложил использовать спецификатор сортируемого формата при его выводе. Таким образом, вы всегда знаете, что можете прочитать его обратно, используя ParseExact
"s"
спецификатор формата и .
Единственный раз, когда вы должны выводить даты в любом другом формате, — это когда вам нужно отобразить их для пользователя или когда какая-либо другая программа требует их в определенном формате.
Как указал @Mike Christensen в своем комментарии, разные языки будут интерпретировать даты по-разному. Вывод по умолчанию для многих европейских стран — ДД / ММ / ГГГГ, тогда как в США обычно это ММ / ДД / ГГГГ. Если вы принимаете во внимание разные локали, тогда возникнет двусмысленность.
Ответ №2:
Вы можете передать массив спецификаторов формата с таким количеством форматов, которые вы хотите поддерживать.
string[] formats = new [] { "MM/dd/yyyy HH:mm:ss", "MM.dd.yyyy HH:mm:ss" };
DateTime d = DateTime.ParseExact
(
timestamp, formats,
CultureInfo.InvariantCulture,
DateTimeStyles.None);
Однако, поскольку вы говорите, что сами генерируете строки, почему бы вам просто не убедиться, что вы всегда форматируете их, используя InvariantCulture:
string timestamp = dt.ToString("MM/dd/yyyy HH:mm:ss",
CultureInfo.InvariantCulture);
Комментарии:
1. Мне нравятся обе ваши идеи. Я попробую их, когда у меня будет такая возможность.