DateTime — Как я могу учитывать разные символы-разделители

#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. Мне нравятся обе ваши идеи. Я попробую их, когда у меня будет такая возможность.