2015-02-03 3 views
0

Я пытаюсь проанализировать строку в DateTime, используя метод ParseExact().Разбор пользовательской строки DateTime

string input = "Wednesday, March 4, 2015 - 9:00 AM PST"; 
string format = @"dddd, MMMM d, yyyy - h:mm tt \P\S\T"; 

Разбор этого ввода с этим форматом не удался, но я не понимаю, почему это неправильно.

Если я

Console.WriteLine(DateTime.Now.ToString(format)); 

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

Цените свои мысли - Saqib

+2

обрабатывает штрафы для меня, используя '\\ P \\ S \\ T' – Plutonix

+1

Почему вы используете '\\' до P, S и T? Он не компилируется, когда используется обратная косая черта. Если обратная косая черта удалена, все работает нормально – dotnetom

+0

@dotnetom - OP использует '@" ... ", поэтому он компилирует ok," \ "будет сохранен и использован' ParseExact' как "обрабатывать следующий символ явно". Как мой ответ показывает, что «все работает отлично», пока ваш язык/страна «en-US» (или «en-» с вариантами форматирования, близкими к «en-US»), для других мест он не удастся. –

ответ

4

Текущий выпуск локаль (или более конкретно день недели/месяц перевода):

var ok = DateTime.ParseExact(
    "Wednesday, March 4, 2015 - 9:00 AM PST", "dddd, MMMM d, yyyy - h:mm tt PST", 
     new CultureInfo("en-us")) 
var failed = DateTime.ParseExact(
    "Wednesday, March 4, 2015 - 9:00 AM PST", "dddd, MMMM d, yyyy - h:mm tt PST", 
     new CultureInfo("de-de")) 
+1

+1, но «или, что конкретно, день недели/месяц перевода» - это не единственная потенциальная проблема «h: mm» будет ожидать специфического для культуры TimeSeparator, который может быть чем-то иным, чем двоеточие. ОП должен указать CultureInfo.InvariantCulture. – Joe

+0

@Joe - хорошая точка (а также 'tt' тоже отличается ...) - прямое указание правильной (возможно, инвариантной) культуры является решением. –

0

Как можно заметить, ваш пример кода не будет компилироваться, как побег char '\' необходимо сбежать. Или вы можете префикс строки форматирования с помощью '@', чтобы сделать ее буквой.

Следующие работы;

string input = "Wednesday, March 4, 2015 - 9:00 AM PST"; 
string format = @"dddd, MMMM d, yyyy - h:mm tt \P\S\T"; 
DateTime dt = DateTime.ParseExact(input, format, null, DateTimeStyles.AssumeLocal); 

Однако, вы должны знать, что экземпляр DateTime не содержит никакой информации временной зоны, поэтому результат будет считаться локальным время (именно поэтому я явно указать, что в вызове ParseExact), и «PST» в любом случае не признается часовым поясом, даже если бы вы использовали тип DateTimeOffset (который содержит данные TimeZone)

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