2013-05-29 3 views
1

У меня есть следующий код:Не удается получить DateTime.TryParseExact работать

string[] format = { "yyyy/MM/dd", "MM/dd/yyyy" }; 
DateTime valueDate; 
value = value.Replace("-", "/"); 
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out valueDate)) 
{ 
    value = "TO_DATE(" + valueDate + ", 'yyyy-mm-dd')"; 
} 
else 
{ 
    throw new Exception("Could not parse incoming date: " + valueDate); 
} 

Так что теперь у меня есть тестовый пример. И значение = '2013/01/21' после оператора замены, заменяющего «-» на «/».

Это должно соответствовать первому формату в массиве строк формата. Но TryParseExact не работает и всегда идет по пути else. У кого-нибудь есть ошибки в этом коде?

+6

Почему бы не добавить еще два формата в массив? – Oded

+2

@ SonerGönül Текущая культура не имеет значения, когда OP проходит «CultureInfo.InvariantCulture». – James

+3

Ох. И с точки зрения вещей вы объединяете SQL. Было бы лучше использовать параметризованный запрос и перейти непосредственно к 'DateTime'. – Oded

ответ

4

Это не TryParseExact Это проблема, это значение вашей строки. Я говорю, что из-за этого маленького scriptcs сценария:

using System.Globalization; 

string[] format = { "yyyy/MM/dd", "MM/dd/yyyy" }; 
DateTime valueDate; 
var value = "2013/01/21"; 
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out valueDate)) 
{ 
    Console.WriteLine("Success!"); 
} 
else 
{ 
    Console.WriteLine("Failure!"); 
} 

Success! печатает. То есть, другими словами, это утверждение:

И значение = '2013/01/21' после замены заявления замены "-" с "/".

не может быть правильным.

Как указано Джеймсом, очень вероятно, что в фактическом значении строки есть пробелы. Есть несколько решений: удалить пробел или разрешить пробелы. Чтобы разрешить пробелы, вы можете использовать DateTimeStyles.AllowWhiteSpaces, а не DateTimeStyles.None.

+0

это может быть правильно, там, вероятно, есть только некоторые лишние пробелы. – James

+0

@James, я дам вам это, но это также означает, что это * неверно *, потому что '' 2013/01/21 ''это не то же самое **, как' '2013/01/21'', особенно при использовании 'TryParseExact' и' DateTimeStyles.None'. –

+0

Что я имел в виду, так это то, что OP видит обновленную дату, чтобы использовать '/' вместо '-', но не обязательно реализуя лишние пробелы, это может быть довольно тонким. – James

0

Не знаю, является ли это вашей проблемой, но при использовании форматов даты вы всегда избегаете своих косых черт. А символ / - это не буквальная косая черта, а ваша локальная система date separator (обычно это косая черта, но не всегда).

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

DateTime.ParseExact("2012/12/31", "yyyy\\/MM\\/dd", null); 
// or 
DateTime.ParseExact("2012/12/31", @"yyyy\/MM\/dd", null); 
Смежные вопросы