лучше DateTime.Parse там? - PullRequest
       10

лучше DateTime.Parse там?

4 голосов
/ 12 февраля 2010

Кто-нибудь знает библиотеку (платную или нет), которая способна обрабатывать более распространенные форматы даты и времени, чем DateTime.Parse? То, что может обрабатывать несколько языков и сокращений в течение дней / месяцев, было бы очень хорошо.

Например: «1 сентября 2009 г.» не работает с Datetime.Parse.

Ответы [ 6 ]

4 голосов
/ 12 февраля 2010

В прошлом я использовал код, подобный следующему (где expectedDateTimeFormats - строки, соответствующие правилам для Строки пользовательского формата даты и времени ):

// Or use custom DateTimeFormatInfo objects
string[] expectedDateTimeFormats = new string[] {
    "customFormat1",
    "customFormat2",
    "customFormatN",
};

// You could offer several overloads here, to accept other DateTimeStyles,
// InvariantCulture, CurrentUICulture, etc. - perhaps even a collection of
// CultureInfo objects to try
public DateTime TryParseDateString(string dateString, CultureInfo culture) {
    try {
        // first, try to parse given the specified culture's formats
        return DateTime.Parse(dateString, culture);
    }
    catch (FormatException) {
        // if that fails, try your custom formats
        return DateTime.ParseExact(dateString, 
                                   expectedDateTimeFormats, 
                                   culture,
                                   DateTimeStyles.None);
    }
}

Если вы имеете дело с нестандартными сокращениями (например, «1 сентября 2009 года», как вы упомянули в комментарии), вам, возможно, придется создать пользовательский CultureInfo или DateTimeFormatInfo и определить их самостоятельно.

Я не знаю действительно хорошего списка «стандартных» пользовательских форматов (и / или связанных с ними DateTimeFormatInfo определений) - если кто-то может найти тот, который он, безусловно, заслуживает того, чтобы быть принятым ответом. У меня больше нет доступа к тому, что использовала моя старая команда (и у меня все равно не было бы разрешения поделиться им :().

2 голосов
/ 12 февраля 2010

Я также должен указать, что существуют методы DateTime.TryParse и DateTIme.TryParseExact. Я думаю, что это невероятно грубо, что вам нужно беспокоиться об исключениях из попытки преобразования строки в DateTime или <insert object type here>.

1 голос
/ 12 февраля 2010

Чтобы разобрать даты с нестандартными сокращениями, вам нужно создать собственную культуру.

Например: (проверено)

var culture = new CultureInfo("en-US");
culture.DateTimeFormat.AbbreviatedMonthNames = new string[] { 
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec", "" 
};

DateTime.Parse("Sept 1, 2009", culture);
1 голос
/ 12 февраля 2010

Я не могу ответить на ваш вопрос. Рассмотрите DateTime.ParseExact, если вы не получили ответ, который вам нравится.

1 голос
/ 12 февраля 2010

Для обработки нескольких языков вы можете вызвать DateTime.Parse с разными культурами.

DateTime.Parse будет обрабатывать сокращения из коробки.

Если вам нужно обработать нестандартные комбинации, звоните DateTime.ParseExact.

0 голосов
/ 12 февраля 2010

Не знаю, есть ли у него "лучшие" парсеры, но вы можете проверить Проект Skeet OS, Noda Time

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