2012-04-12 2 views
3

Я пытаюсь преобразовать строку в datetime, но каждый раз, когда я получаю:Строка не была признана действительной DateTime?

Строка не был признан действительным DateTime.

Кодекс:

string format = "dd/MM/yyyy"; 

obj.TransDate = DateTime.ParseExact(lbl_TransDate.Text.Split('/')[0] + "/" + lbl_TransDate.Text.Split('/')[1] + "/" + lbl_TransDate.Text.Split('/')[2], format, CultureInfo.InvariantCulture); 

Когда я отлаживать дату, которую я пытаюсь разобрать это: 12/4/2012

+2

из простого любопытства, почему не просто ' DateTime.ParseExact (lbl_TransDate.Text, format, CultureInfo.InvariantCulture) '? – Vlad

+0

:) это не мой код, просто я тестирую эту часть –

+0

Вы проверили его с помощью этого кода 'DateTime dt; строка Temp1 = «Ваша дата»; if (DateTime.TryParse (Temp1, out dt)) { // Если это действительная дата string date = dt.ToShortDateString(); string time = dt.ToShortTimeString(); } ' – Pankaj

ответ

9

Требуемый формат

string format = "dd/M/yyyy"; 

Я не понимаю но почему-то разделите строку на конкатенацию, так как вы получите то же самое?

Если вход 12/4/2012, после раскола по '/', вы получите 12, 4, 2012, а затем объединить их обратно, чтобы получить "12/4/2012". Почему это?

Кроме того, если вам действительно нужно это разделение, вы можете хранить в в массив, так что вам не нужно разделить его 3 раза:

var splits = lbl_TransDate.Text.Split('/'); 
DateTime.ParseExact(splits[0] + "/" + splits[1] + "/" + splits[2], ...); 

Если вы не доверяете вход, шпагат массив не может быть Length = 3, и его больше, вы можете использовать DateTime.TryParseExact

EDIT вы можете использовать перегрузку с несколькими форматами Таким образом, если входной сигнал может быть 12/4/2012 или 12/04/2012, вы можете дать оба формата

var formats = new[] {"dd/M/yyyy","dd/MM/yyyy"}; 
var date = DateTime.ParseExact("12/4/2012", formats, 
             System.Globalization.CultureInfo.InvariantCulture, 
             System.Globalization.DateTimeStyles.AssumeLocal); 
+0

' informix' date "dd/MM/yyyy". –

+0

'DateTime, представленный строкой, не поддерживается в календаре System.Globalization.GregorianCalendar.', когда я попробую. –

+0

Последнее редактирование работает со мной. –

1

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

Следующий код демонстрирует это как dd и MM проложенный по желанию

string format = "dd/MM/yyyy"; 
string mydate = "12/4/2012"; 
DateTime t = DateTime.ParseExact(mydate.Split('/')[0].PadLeft(2,'0') + "/" + 
           mydate.Split('/')[1].PadLeft(2,'0') + "/" + 
           mydate.Split('/')[2], format, CultureInfo.InvariantCulture); 

Выход есть:

12/04/2012 00:00:00 
2

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

var convertedDay = DateTime.Parse("12/04/2010", new CultureInfo("en-GB").DateTimeFormat); 
1

Убедитесь, что вы добавить следующее в вашем веб-конфигурации

<system.web> 
<globalization culture="en-AU"/>... 

Смотрите следующие за кодом правильной культуры страны

http://sharpertutorials.com/list-of-culture-codes/

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