2013-10-11 2 views
2

Почему быDateTime.TryParseExact не возвращает правильный ответ

DateTime.TryParseExact("08/10/2013", "dd/MM/yyyy", null, DateTimeStyles.None, out dateValue) 

возвращение ложным?

+3

Потому что/ist заполнитель для конкретного сепаратора в текущей культуре. Если культура в настоящее время является немецкой/будет актуальной - и это не в дате. – Ralf

ответ

9

Использовать CultureInfo.InvariantCulture вместо null.

Он сообщает компилятору, что формат не зависит от культуры.

DateTime.TryParseExact("08/10/2013", 
         "dd/MM/yyyy", 
         CultureInfo.InvariantCulture, 
         DateTimeStyles.None, 
         out dateValue);` 

Если вы используете null, он выводится в CultureInfo.CurrentCulture (MSDN: «Если поставщик имеет нулевое значение, объект CultureInfo, который соответствует текущей культуре используется»). Кроме того, поскольку это не так понятно, проблема заключается в том, что/заменяется предоставленным датой сепаратором. Это имеет особое значение. http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx#dateSeparator

Вот пример работает

enter image description here

+1

Вы также должны указать, что 'null' совпадает с' CultureInfo.CurrentCulture' (msdn: _ "Если поставщик имеет значение null, объект CultureInfo, соответствующий текущей культуре, используется" _). Кроме того, поскольку это не так ясно, проблема в том, что '/' заменяется предоставленным датой-разделителем культуры. Это имеет особое значение. http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx#dateSeparator –

6

Потому что вы передали null для параметра IFormatProvider. Попробуйте Попутный CultureInfo.InvariantCulture вместо

EDIT Как уже упоминалось другие, реальная причина заключается в том, что / в строке разбора сама пересчитываются с использованием правил, предусмотренных IFormatProvider. Когда вы передаете null, используется значение по умолчанию CultureInfo.CurrentCulture.

+0

Следует упомянуть, что 'null' совпадает с' CultureInfo.CurrentCulture' (msdn: _ "Если поставщик имеет значение null, объект CultureInfo, соответствующий текущей культуре, используется" _). –

0

Мое решение:

общественности статической BOOL IsValidDateTime (строка sDateTime) { BOOL RET = ложь;

string[] formats = { 
     "dd/MM/yyyy HH:mm:ss", 
     "yyyy-MM-dd HH:mm:ss", 
     "yyyy-MM-ddTHH:mm:sszzz" 
    }; 

    try{ 
     DateTime.ParseExact(sDateTime, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); 
     ret = true; 
    } 
    catch{} 

    return ret; 
}  
Смежные вопросы