2014-12-17 4 views
2

У меня есть проблема с разбором времени и дат из строки Here DOT NET FIDDLE вот моего синтаксического кодСтранно DateTime разбор ошибка

var DateOfBirth2 = DateTime.Parse(string.Format("{0}-{1}-{2}", "1924", "10", "19"));   
Console.WriteLine(DateOfBirth2); 
var DateOfBirth = DateTime.Parse(string.Format("{0}-{1}-{2}", "19", "10", "1924")); 
Console.WriteLine(DateOfBirth); 

Проблема DateofBirth2 может быть проанализирована успешно, но DateofBirth нет, и может бросать строки исключения

System.FormatException: String не был признан действительным DateTime

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

Каков наилучший способ разобрать, в чем причина ошибки?

+0

Что вы 'CurrentCulture'? –

+0

Это работает на моем компьютере, но это, вероятно, ваша 'CultureInfo'. –

+0

Я принял вызов соннеров, tesekkurler sorun culture mis –

ответ

5

DateTime.Parse использует настройки CurrentCulture по умолчанию.

Это означает, что у вашего CurrentCulture есть yyyy-MM-dd в качестве стандартного формата даты и времени, но он не имеет формата dd-MM-yyyy.

В таком случае вы можете использовать собственный синтаксический анализ даты и времени с DateTime.TryParseExact;

string s = "19-10-1924"; 
DateTime dt; 
if(DateTime.TryParseExact(s, "dd-MM-yyyy", CultureInfo.GetCultureInfo("tr-TR"), 
          DateTimeStyles.None, out dt)) 
{ 
    Console.WriteLine(dt); 
} 

Поскольку вы из Турции, я полагаю, ваш CurrentCulture является tr-TR (как я), вы можете найти весь стандартный формат дату и время вашей культуры, как;

foreach(var format in CultureInfo.GetCultureInfo("tr-TR").DateTimeFormat. 
         GetAllDateTimePatterns()) 
{ 
    Console.WriteLine(format); 
} 

Выход будет;

dd.MM.yyyy 
dd.MM.yy 
yyyy-MM-dd 
dd MMMM yyyy dddd 
dd MMMM yyyy 
dd MMMM yyyy dddd HH:mm 
dd MMMM yyyy HH:mm 
dd MMMM yyyy dddd HH:mm:ss 
dd MMMM yyyy HH:mm:ss 
dd.MM.yyyy HH:mm 
dd.MM.yy HH:mm 
yyyy-MM-dd HH:mm 
dd.MM.yyyy HH:mm:ss 
dd.MM.yy HH:mm:ss 
yyyy-MM-dd HH:mm:ss 
dd MMMM 
dd MMMM 
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK 
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK 
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' 
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' 
yyyy'-'MM'-'dd'T'HH':'mm':'ss 
HH:mm 
HH:mm:ss 
yyyy'-'MM'-'dd HH':'mm':'ss'Z' 
dd MMMM yyyy dddd HH:mm:ss 
dd MMMM yyyy HH:mm:ss 
MMMM yyyy 
MMMM yyyy 

Как видно из вывода, yyyy-MM-dd стандартный формат даты и времени для tr-TR культуры, но не dd-MM-yyyy или MM-dd-yyyy форматы.

+0

Будьте осторожны с использованием CurrentCulture для анализа чего-то из внешних источников. Пользователь может переопределить свои настройки CurrentCulture и разорвать ваш код – DrKoch

+1

@DrKoch Да, поэтому я использовал 'CultureInfo.GetCultureInfo (« tr-TR »)' вместо 'CulfureInfo.CurrentCulture' _even_, если я в этом уверен. –

1

Для разбора строки в определенном формате даты вы не должны полагаться на формат по умолчанию, используемый DateTime.Parse(), который изменяется в текущей культуре, культуре ui и т. Д. Пользователь может даже переопределить текущую культуру, делая ваш код ненадежным.

Использование DateTime.ParseExact (s, формат, поставщик) как так:

string s1 = string.Format("{0}-{1}-{2}", "1924", "10", "19"); 
string s2 = string.Format("{0}-{1}-{2}", "19", "10", "1924"); 

DateTime dateOfBirth1 = DateTime.ParseExact("yyyy-MM-dd", s1, CultureInfo.InvariantCulture); 
DateTime dateOfBirth2 = DateTime.ParseExact("dd-MM-yyyy", s2, CultureInfo.InvariantCulture); 
+0

В гридеровом календаре нет «19» в месяц. –

+0

Я исправил образец кода – DrKoch

Смежные вопросы