значение datetime.Проблема TryParse с датами формата гггг-ДД-ММ


У меня есть следующая дата в строковом формате "2011-29-01 12:00 am" . Теперь я пытаюсь преобразовать это в формат datetime со следующим кодом:

DateTime.TryParse(dateTime, out dt); 

но я всегда получаю dt как {1/1/0001 12: 00: 00 AM}, не могли бы вы сказать мне, почему ? и как я могу преобразовать эту строку в дату.

EDIT: я только что видел, что все упоминали, чтобы использовать аргумент формата. Я упомяну теперь, что я не могу использовать параметр format, поскольку у меня есть некоторые настройки для выбора пользовательского dateformat, что хочет пользователь, и на основе этого пользователь может получить дату в текстовом поле в этом формате автоматически через jQuery datepicker.

7 59

7 ответов:

Это должно работать на основе вашего примера "2011-29-01 12: 00 am"

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);

вы должны использовать ParseExact метод. Это принимает строку в качестве второго аргумента, который определяет формат datetime, например:

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

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

если вероятно, что ввод будет неправильным (например, пользовательский ввод), было бы лучше использовать TryParseExact вместо исключений для обработки случая ошибки:

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

лучшей альтернативой может быть не предоставьте пользователю выбор форматов дат, но используйте перегрузка, которая принимает массив форматов:

// A list of possible American date formats - swap M and d for European formats
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                   "MM/d/yyyy HH:mm:ss.ffffff" };
string dateString; // The string the date gets read into

try
{
    dateValue = DateTime.ParseExact(dateString, formats, 
                                    new CultureInfo("en-US"), 
                                    DateTimeStyles.None);
    Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
    Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}                                               

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

С DateTime на msdn:

Тип: System.Датавремя% при возвращении данного метода содержит даты значение, эквивалентное дате и времени, содержащимся в S, Если преобразование успешно, или MinValue, если преобразование не удалось. Этот преобразование не выполняется, если параметр s равен null, является пустой строкой (""), или не содержит допустимого строкового представления даты и времени. Этот параметр передается неинициализированный.

используйте parseexact со строкой формата .

работает:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

попробуйте использовать безопасный метод TryParseExact

DateTime temp;
string   date = "2011-29-01 12:00 am";

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

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

Если вы позволите пользователю сделать дизайн свободного формата формата даты / времени, то вам придется создать соответствующий DateTime форматирование строк во время выполнения.