Надежная библиотека синтаксического анализатора DateTime для .NET - PullRequest
7 голосов
/ 31 марта 2010

Я пишу приложение для чтения 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.

Есть ли что-нибудь подобное?

Обновление Казалось бы, я неясно в своем запросе. Я ищу библиотеку, которая знает множество этих строк формата wild . DateTime.Parse / DateTime.TryParse знают только пару форматов, и они, конечно, не понимают часовые пояса (вы можете видеть, что я уже использую его). Мне нужно что-то более мощное, чем DateTime.Parse / DateTime.TryParse.

Обновление 2 Все говорили о том, что я использовал Parse вместо TryParse. Я поменял код. Но это все еще неправильно и неполно.

Ответы [ 6 ]

3 голосов
/ 31 марта 2010

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

2 голосов
/ 31 марта 2010

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

1 голос
/ 05 апреля 2010

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

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

1 голос
/ 01 апреля 2010

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

C #: анализ даты и времени с помощью TimeZone
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

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

BarDev

1 голос
/ 31 марта 2010

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

DateTime.TryParse()

вместо

DateTime.Parse()

вместо попытки / улова

0 голосов
/ 31 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...