2015-05-29 2 views
2

Я пытаюсь преобразовать время из строки Моих струны, как это «11:45» или «03:19 PM» и я используюКак конвертировать во времени?

dateTime = DateTime.ParseExact("11:45 AM", "H:mm tt", 
           System.Globalization.CultureInfo.InvariantCulture); 

Затем он становится конвертируется, но когда я передаю

DateTime.ParseExact("3:19 PM", "H:mm tt", 
        System.Globalization.CultureInfo.InvariantCulture).ToString(); 

Получение ошибки в

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

Я не могу понять, почему это происходит какой-либо один есть идея, то пожалуйста, помогите мне

ответ

4

Я хотел бы использовать h вместо H. H для 24 часов от, h для формата 12 часов.

DateTime.ParseExact("9:45 PM", "h:mm tt", System.Globalization.CultureInfo.InvariantCulture) 

Полный список вариантов формата here.

+0

yes, Ned ,, Но проблема в том, что мне нужно преобразовать формат 12 hr в формат 24 часа –

+1

@SreerejithSS формат, который вы передаете, должен быть форматом ввода. Формат ввода - 12-часовой формат, поэтому строка формата должна использовать «h», а не «H». Результат преобразования не имеет формата; это значение DateTime. Вы можете дать ему 24-часовой формат, когда вы конвертируете его обратно в строку где-то еще. – phoog

+0

@Ned Спасибо За вашу помощь, теперь я понимаю, где я ошибся –

-1

Инвариантная культура требует двузначные часов.

+0

H работает на «AM» уже пытался «HH», но не работает для «PM» –

+2

код отправленный Sachin работает нормально с InvariantCulture: о – AmatuerDev

+0

Это работает, но мне нужно, чтобы получить время в 24-формате час –

3

Как вы хотите, чтобы разобрать формат 12 ч и конвертировать его в формат 24 ч, то вы можете просто использовать этот

string dt = DateTime.ParseExact("3:19 PM", "h:mm tt",CultureInfo.InvariantCulture).ToString("HH:mm");; 
+0

ваш код работает, но я хочу получить 24-часовой формат, который вам дал« H » –

+0

@SreerejithSS обновил сообщение. Пожалуйста, используйте обновленный код и дайте мне знать, если он решает вашу проблему. – Sachin

+0

Он отлично работает. Спасибо за вашу ценную помощь. –

1

К сожалению, ни один из ответов не является полностью правильным.

Ante meridiem и post meridiem относятся к формату 12-hour clock. Вот почему вы должны использовать 24-hour clock спецификаторы формата, если ваша строка содержит один из них.

Вот почему вы должны использовать h или hh спецификаторов неH или HH. Поскольку ваша часовая часть может быть с ведущими нулями, использование hh specifier - лучший вариант для обоих типов строк.

Используя формат hh:mm tt, вы сможете успешно проанализировать свои строки.

string s = "03:19 PM"; 
DateTime dt; 
if(DateTime.TryParseExact(s, "hh:mm tt", CultureInfo.InvariantCulture, 
          DateTimeStyles.None, out dt)) 
{ 
    dt.Dump(); // 29.05.2015 15:19:00 
} 

и

string s = "11:45 AM"; 
DateTime dt; 
if(DateTime.TryParseExact(s, "hh:mm tt", CultureInfo.InvariantCulture, 
          DateTimeStyles.None, out dt)) 
{ 
    dt.Dump(); // 29.05.2015 11:45:00 
} 

Кроме того, вы упомянули 3:19 PM строку в вашем примере кода. Поскольку часовая часть представляет собой одну цифру, в этом случае вам необходимо использовать формат h:mm tt.

+0

Ваш последний абзац, который является правильным, противоречит третьему абзацу, который неверен. – phoog

+0

@phoog Нет, это не так. ОП упоминается в его объяснении, поскольку его/ее строки - «11:45 AM» и «03:19 PM». Но его/ее использовали строку '3:19 PM' в его втором примере кода. В первых двух строках наилучшим вариантом является использование спецификатора формата 'hh', но этот спецификатор не работает для строки« 3:19 PM », потому что его часовая часть не имеет начального нуля. Если есть третья другая форматированная строка _kind_, с использованием ['DateTime.ParseExact' перегрузки] (https://msdn.microsoft.com/en-us/library/332de853%28v=vs.110%29.aspx), которая принимает строку массив как параметр - лучший вариант. Но ОП никогда не упоминал об этом. –

+0

Спецификатор 'hh' работает только для двухзначных часов. Спецификатор «h» работает для одноразрядных и двухзначных часов. Поэтому нет необходимости использовать перегрузку, которая принимает строковый массив; спецификатор должен быть просто 'h: mm tt'. – phoog

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