DateTime.TryParse випуск із датами формату рррр-дд-ММ


84

У мене така дата у рядковому форматі "2011-29-01 00:00". Зараз я намагаюся перетворити це у формат datetime із таким кодом:

DateTime.TryParse(dateTime, out dt); 

Але я завжди отримую dt як {1/1/0001 00:00:00 AM}. Скажіть, будь ласка, чому? і як я можу перетворити цей рядок на сьогоднішній день.

EDIT: Я щойно бачив, як усі згадані користувались аргументом формату. Зараз я згадаю, що я не можу використовувати параметр формату, оскільки у мене є певні налаштування для вибору власного формату дати, який бажає користувач, і на основі цього користувач може автоматично отримувати дату в текстовому полі у цьому форматі через jQuery datepicker.


4
До речі, ви можете визначити, чи не вдалося перетворити, перевіривши повернене значення TryParse. Тобто bool success = DateTime.TryParse(...);.
Jim Mischel

Відповіді:


188

Це має працювати на основі вашого прикладу "2011-29-01 00:00"

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

8
Побий мене. Якщо ви знаєте формат вхідного рядка, вам практично завжди слід використовувати методи TryParseExact / ParseExact.
Euro Micelli,

Гаразд, тому мій формат дати подібний до прикладу, але якщо значення дня або місяця одноцифрове, то синтаксичний аналізатор DateTime видасть помилку, оскільки шукав дві цифри, коли є лише одна. Що б ви запропонували у цьому сценарії?
Ciaran Gallagher

11
Щоб відповісти на моє власне запитання, у цьому випадку, якщо ви використовуєте один символ у форматі, він працює як для одинарного, так і для подвійного символу. напр. д / м / рррр працює 13/11/2012
Ciaran Gallagher

@BrokenGlass це у мене не працює. Чи можете ви допомогти мені в цьому
Міна

2
@CiaranGallagher Лише невелике зауваження, у даті у вашому коментарі має бути велике М (д / м / рррр)
Юсріл Маулідан Раджі

14

Вам потрібно скористатися ParseExactметодом . Це приймає рядок як другий аргумент, який вказує формат, в якому знаходиться час, наприклад:

// 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);
}                                               

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


5

Спробуйте використати безпечний метод 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);

4

З DateTime на msdn:

Тип: System.DateTime% Коли цей метод повертається, містить значення DateTime, еквівалентне даті та часу, що містяться в s, якщо перетворення вдалося, або MinValue, якщо перетворення не вдалося . Перетворення не вдається, якщо параметр s дорівнює нулю, є порожнім рядком ("") або не містить дійсного подання рядка дати та часу. Цей параметр передається неініціалізованим.

Замість цього використовуйте parseexact із рядком формату "yyyy-dd-MM hh:mm tt".


3

Це працює:

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


0

Якщо ви надаєте користувачеві можливість змінити формат дати / часу, тоді вам доведеться створити відповідний рядок формату, який використовуватиметься для аналізу. Якщо ви знаєте можливі формати дат (тобто користувач повинен вибрати зі списку), то це набагато простіше, оскільки ви можете створювати ці рядки формату під час компіляції.

Якщо ви дозволите користувачеві виконати дизайн у форматі дати / часу у вільному форматі, тоді вам доведеться створювати відповідні DateTimeрядки формату під час виконання.


Правильно, джим Якщо ви дозволите користувачеві виконати дизайн вільного формату формату дати / часу, то вам доведеться створити відповідні рядки формату DateTime під час виконання.
Піналь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.