2016-02-15 2 views
0

В настоящее время я пытаюсь разобрать временную метку, которая может быть в любом языке, и мне трудно получить TryParseExact для работы. К сожалению, нет способа проверить, что язык где-либо еще в моих данных, поэтому нет возможности легко проанализировать это (что я знаю). Я давно искал эту тему и не могу найти никого с аналогичной проблемой или полезным решением.Синхронизация DateTime неопределенного языка

дата Пример: Lunes, 16 de febrero de 2015 a las 18:49 UTC-05

Формат У меня до сих пор, глядя на https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.90).aspx: dddd, d 'de' MMMM 'de' yyyy 'a las' HH:mm 'UTC'zz *

Мой тестовый код: http://ideone.com/o1yknShttp://ideone.com/bZOD4H

Почему это не разобрать правильно? И как я могу найти элегантное решение?

* Моя проблема в том, что я не знаю, как избавиться от «a las» и «de» в строке. Они могут быть не всегда одинаковой длины или даже в одном и том же положении, поэтому я не могу просто использовать подстроки. На данный момент я просто использую эту строку для тестирования.

+1

Это неинвариантная культура. Вы можете просто пройти через набор культур и передать их в 'DateTime.TryParse' до тех пор, пока не сработаете. На другом примечании, почему вы получаете строки даты в разных культурах? Это ты настоящая проблема. – juharr

+0

Я пытаюсь разобрать дампы данных facebook, поэтому у меня действительно нет контроля над языками, в которых я получаю эти данные. Спасибо за предложение, я попробую. – Charlotte

+0

это отобразит культуры https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.getcultures(v=vs.110).aspx, которые вы, вероятно, захотите попробовать в порядке, скорее всего. И если это все цифры, вы не будете знать mm/dd/yy от dd/mm/yy - поэтому даты, соответствующие обеим, являются quess. – Paparazzi

ответ

1

Ваш dateTimeFormat работает нормально, однако вы делаете ToLower(), поэтому он не находит UTC.

Так что либо удалите ToLower(), либо измените строку dateTimeFormat, чтобы использовать utc, а не UTC.

Я раздвоенный свой Ideone фрагмент кода и просто удалены ToLower() на строку даты и времени и d1 получает разобран прекрасно: http://ideone.com/Wstxaz

Скопировал код здесь, только в случае, если связь идет вниз:

// Removed `ToLower()` at the end 
string date = "Lunes, 16 de febrero de 2015 a las 18:49 UTC-05"; 
string dateTimeFormat = "dddd, d 'de' MMMM 'de' yyyy 'a las' HH:mm UTCzz"; 
DateTime d1; 
DateTime.TryParseExact(date, 
         dateTimeFormat, 
         CultureInfo.GetCultureInfo("es-ES"), 
         DateTimeStyles.None, 
         out d1); 

Теперь для вашей проблемы: если вы не знаете формат (ы), вы получите строку, это невозможно разобрать. Вам нужен формат (или список форматов), чтобы иметь возможность анализировать дату и время в строке. Слишком много, возможно, двусмысленных цифр в дате & временной строки, чтобы просто понять ее однозначно.

+0

Спасибо! Хорошее место на вещи ToLower, не могу поверить, что ошибка была такой простой! Я закончил создание файла с парами форматов/локалей, поэтому я перейду и попытаюсь найти язык из этого. – Charlotte

+0

@goshcharlotte это разумно, если вы убедитесь, что все возможные форматы недвусмысленны ('mm/dd/yy' будет неоднозначным для' dd/mm/yy', например, если нет других различий) – Jcl

0

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

string dateTimeFormat = @"dddd, d \de MMMM \de yyyy a la\s HH:mm UTCzz"; 
DateTime d1; 
DateTime.TryParseExact(date, dateTimeFormat, CultureInfo.GetCultureInfo("es-ES"), DateTimeStyles.None, out d1); 

Примечания сбежавшим «D» и «S» символами, чч для 24-часовой формат времени и zz без переднего фронта. Также обратите внимание, что информация испанской культуры требуется для анализа испанских имен дней и месяцев.

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