Я пишу RSS и Почтовое приложение для средства чтения в C# (технически MonoTouch).
Я столкнулся с проблемой парсинга DateTime
s. Я вижу большое различие в том, как даты представлены в дикой природе и начали писать функцию как это:
static string[] DateTimeFormats = new string[] {
"ddd, d MMM yyyy H:mm:ss \"GMT+00:00\"",
"d MMM yyyy H:mm:ss \"EST\"",
"yyyy-MM-dd\"T\"HH:mm:ss\"Z\"",
"ddd MMM d HH:mm:ss \"+0000\" yyyy",
};
public static DateTime ParseTime(string timeStr) {
var r = DateTime.MinValue;
var styles = DateTimeStyles.AdjustToUniversal |
DateTimeStyles.AllowWhiteSpaces;
if (DateTime.TryParse(timeStr,
CultureInfo.InvariantCulture,
styles,
out r)) {
return r;
}
else {
if (DateTime.TryParseExact(timeStr,
DateTimeFormats,
CultureInfo.InvariantCulture,
styles,
out r)) {
return r; // BUGGY! Ignores time zone!!
}
}
Console.WriteLine ("BAAAAAAAAAAAAD");
return DateTime.MinValue;
}
Это, ну, в общем, вызывает у меня отвращение. Две точки. (1) Глупо из меня думать, что я могу на самом деле собрать список форматов, который будет касаться всего там. (2) Это неправильно! Заметьте, что я рассматриваю время даты EST как UTC (так как.NET кажется не обращающей внимания на часовые пояса).
Я ищу существующую библиотеку (источник только), который, как известно, обрабатывает набор этих форматов.
Кроме того, я хотел бы продолжать использовать UTC DateTimes всюду по своему коду так независимо от того, что библиотеке предлагают, должен смочь произвести DateTimes.
Есть ли что-нибудь там как это?
Обновление казалось бы, что я был неясен в своем запросе. Я ищу библиотеку, которая знает много этих диких строк формата. DateTime. Синтаксический анализ/Дата и время. TryParse только знают пару форматов, и они, конечно, не понимают часовые пояса (Вы видите, что я уже использую ее). Мне нужно что-то более мощное, чем DateTime. Синтаксический анализ/Дата и время. TryParse.
Обновите 2, Все останавливались на том, что я использовал Синтаксический анализ вместо TryParse. Я переключил код. Но это все еще неправильно и неполно.
У меня была такая же проблема с rss-лентами, которые включали даты с названием часовых поясов, а не со смещением. Я подумал о создании собственного парсера DateTime для этой ситуации, но решил, что кто-то, вероятно, уже создал его. После нескольких часов поиска я нашел следующее
C#: Parsing DateTime with TimeZone
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/
В настоящее время я использую этот код из предыдущего url в проекте. Несмотря на то, что проект не перешел на prod, код, похоже, работает.
BarDev
Я разработал библиотеку (NaturalDate) для анализа дат, но это может быть не то, что вы ищете, поскольку она ориентирована на формы ввода, вводимые человеком, а не на формы, созданные компьютером. IIRC он может даже не анализировать формы, которые вы показали выше. Кроме того, сайт временно не работает (это единственное, что есть на этом сервере).
Если у меня будет время (вероятно, поскольку мне могут даже заплатить за это), я попытаюсь воскресить его как активно поддерживаемый проект.
Пробовали ли вы просто использовать DateTime.TryParse? Эта функция уже обрабатывает большинство форматов.
Вы можете использовать:
DateTime.TryParse()
вместо
DateTime.Parse()
, а не try / catch
Фрэнк, для анализа часовых поясов вы хотите использовать zz или zzz.
Будущие версии MonoTouch также будут поддерживать новый модификатор «K» (который является псевдонимом для zzz)
В дополнение к TryParse
в DateTime, .Net также предоставляет структуру DateTimeOffset
, которая предлагает доступ к смещение UTC в качестве другого свойства структуры, что позволяет хранить информацию о часовом поясе и информацию о дате и времени вместе.