Узнайте формат даты и времени строки даты в С#

Я делаю заявку. Приложение использует формат даты, такой как "2012-11-21 15:22:35".
Я уже знаю, что это формат "yyyy-MM-dd HH:mm:ss". Но как я могу программно найти формат даты и времени произвольной входной строки? Есть какой-либо способ сделать это?


person Dany    schedule 22.11.2012    source источник
comment
Если я понимаю вопрос, то никак. Потому что вы не можете точно определить, какая дата 2012-11-12, 11 декабря или 12 ноября.   -  person Hamlet Hakobyan    schedule 22.11.2012
comment
Поскольку это строка, в ней нет встроенной информации о том, что это такое. Таким образом, даже тот факт, что эта строка состоит из даты и времени, является вашим предварительным знанием. Таким образом, без предварительных знаний единственный вариант для вас — попытаться угадать формат. Но работать безотказно не получится. Я считаю, что 1 января одинаково представлено в формате дд-мм-гггг и мм-дд-гггг. Так что нет, нет надежных методов   -  person J0HN    schedule 22.11.2012
comment
Ваше приложение генерирует дату? Если да, вы можете получить его культуру и получить точный формат даты и времени. Если вы получаете дату из внешнего источника уже в виде строки, вам может потребоваться запросить этот источник для его локальной культуры (обычно данные даты и времени хранятся в одной локали) или, по крайней мере, попробовать datetime.TryParse()   -  person Nogard    schedule 22.11.2012


Ответы (4)


Это может вам помочь.. (в массиве добавьте больше форматов для проверки)

string[] formats = {"M/d/yyyy", "MM/dd/yyyy",                                    
                            "d/M/yyyy", "dd/MM/yyyy", 
                            "yyyy/M/d", "yyyy/MM/dd",
                            "M-d-yyyy", "MM-dd-yyyy",                                    
                            "d-M-yyyy", "dd-MM-yyyy", 
                            "yyyy-M-d", "yyyy-MM-dd",
                            "M.d.yyyy", "MM.dd.yyyy",                                    
                            "d.M.yyyy", "dd.MM.yyyy", 
                            "yyyy.M.d", "yyyy.MM.dd",
                            "M,d,yyyy", "MM,dd,yyyy",                                    
                            "d,M,yyyy", "dd,MM,yyyy", 
                            "yyyy,M,d", "yyyy,MM,dd",
                            "M d yyyy", "MM dd yyyy",                                    
                            "d M yyyy", "dd MM yyyy", 
                            "yyyy M d", "yyyy MM dd"
                           };

        DateTime dateValue;

        foreach (string dateStringFormat in formats)
        {
            if (DateTime.TryParseExact(strDateTime, dateStringFormat,
                                       CultureInfo.InvariantCulture,
                                       DateTimeStyles.None,
                                       out dateValue))
                //Console.WriteLine("Converted '{0}' to {1}.", dateStringFormat, dateValue.ToString("yyyy-MM-dd"));                
                Console.WriteLine( dateStringFormat);
        }
person Rohit    schedule 12.02.2014

Я думаю, вы столкнетесь с проблемами со строками даты, где значение месяца равно ‹= 12, так как это означает, что формат этой строки может быть "yyyy-MM-dd" или "yyyy-dd-MM".

Невозможно узнать, какой из них правильный, если только вы не отдадите предпочтение своему синтаксическому анализатору.

Например: 2012/08/07 - "это может быть июль или август?"

Вы можете просто переборщить и надеяться, что культурная информация соответствует формату.

 var datestring = "2012-10-05 12:00:03";
 DateTime time;
 var matchingCulture = CultureInfo.GetCultures(CultureTypes.AllCultures).FirstOrDefault(ci => DateTime.TryParse(datestring, ci, DateTimeStyles.None, out time))
person Christian Westman    schedule 22.11.2012

Если вы хотите распознать формат, сделать это со 100% уверенностью практически невозможно. Однако вы можете просмотреть все форматы, поддерживаемые данными CultureInfo и TryParse ими. К сожалению, это может привести к неправильным результатам, так как невозможно сказать, что такое год, месяц и день, примерно так:

10/11/12

В зависимости от ваших культурных предубеждений вы можете интерпретировать это как 11 октября 2012 года; 10 ноября 2012 г. или 12 ноября 2010 г.

Вы не упомянули, что вы хотите сделать с датой, поэтому я дам вам только обычные рекомендации:

  1. Если вы хотите передавать даты между разными модулями приложения, используйте инвариантный формат даты.
  2. Если вам нужно отформатировать дату и время, используйте формат даты по умолчанию для данной культуры.
  3. Говоря о формате даты по умолчанию, если вы хотите принять дату, введенную конечным пользователем, вы можете проанализировать ввод в свободной форме в формате по умолчанию для культуры или создать (или использовать уже существующие) элементы управления выбором даты и времени. Последний способ предпочтительнее.

Объявление 1. Чтобы преобразовать в неизменный формат даты и времени, используйте:

DateTime now = DateTime.UtcNow;
string formatted = now.ToUniversalTime.ToString(CultureInfo.InvariantCulture);

или (для преобразования в формат, подобный ISO8601):

string formatted = now.ToString("u");

Точно так же вы можете анализировать DateTime из инвариантного формата:

DateTime result;
string source = "11/20/2012 11:22:33";
if (DateTime.TryParse(source, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out result))
{
  // do something with result
}

или (универсальный формат не требует CultureInfo):

DateTime result;
string source = "2012-11-20 11:22:33Z";
if (DateTime.TryParse(source, out result))
{
  // do something
}

Объявление 2 и 3. Форматирование и анализ для определенного языка и региональных параметров аналогичны форматированию и анализу инвариантных дат, но вам нужно заменить InvariantCulture обнаруженным конкретным экземпляром, скажем, CultureInfo.CurrentCulture.

В зависимости от типа вашего приложения вы можете захотеть использовать специальный элемент управления календарем, например датчик пользовательского интерфейса jQuery.

person Paweł Dyda    schedule 22.11.2012

Используйте приведенный ниже код:

строка sysFormat = CultureInfo.CurrentCulture.DateTimeFormat;

person Rakesh_HBK    schedule 22.11.2012
comment
Спасибо, но это дает текущий системный формат даты и времени, но не этой строки. :П - person Dany; 22.11.2012