Устойчивая библиотека синтаксического анализатора DateTime для.NET

Я пишу RSS и Почтовое приложение для средства чтения в C# (технически MonoTouch).

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

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. Я переключил код. Но это все еще неправильно и неполно.

7
задан Frank Krueger 31 March 2010 в 19:15
поделиться

6 ответов

У меня была такая же проблема с rss-лентами, которые включали даты с названием часовых поясов, а не со смещением. Я подумал о создании собственного парсера DateTime для этой ситуации, но решил, что кто-то, вероятно, уже создал его. После нескольких часов поиска я нашел следующее

C#: Parsing DateTime with TimeZone
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

В настоящее время я использую этот код из предыдущего url в проекте. Несмотря на то, что проект не перешел на prod, код, похоже, работает.

BarDev

1
ответ дан 7 December 2019 в 05:20
поделиться

Я разработал библиотеку (NaturalDate) для анализа дат, но это может быть не то, что вы ищете, поскольку она ориентирована на формы ввода, вводимые человеком, а не на формы, созданные компьютером. IIRC он может даже не анализировать формы, которые вы показали выше. Кроме того, сайт временно не работает (это единственное, что есть на этом сервере).

Если у меня будет время (вероятно, поскольку мне могут даже заплатить за это), я попытаюсь воскресить его как активно поддерживаемый проект.

0
ответ дан 7 December 2019 в 05:20
поделиться

Пробовали ли вы просто использовать DateTime.TryParse? Эта функция уже обрабатывает большинство форматов.

2
ответ дан 7 December 2019 в 05:20
поделиться

Вы можете использовать:

DateTime.TryParse()

вместо

DateTime.Parse()

, а не try / catch

1
ответ дан 7 December 2019 в 05:20
поделиться

Фрэнк, для анализа часовых поясов вы хотите использовать zz или zzz.

Будущие версии MonoTouch также будут поддерживать новый модификатор «K» (который является псевдонимом для zzz)

1
ответ дан 7 December 2019 в 05:20
поделиться

В дополнение к TryParse в DateTime, .Net также предоставляет структуру DateTimeOffset , которая предлагает доступ к смещение UTC в качестве другого свойства структуры, что позволяет хранить информацию о часовом поясе и информацию о дате и времени вместе.

3
ответ дан 7 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: