Разбор даты и времени из строки во многих комбинациях - PullRequest
0 голосов
/ 16 сентября 2010

Мне нужно проанализировать даты и время из строк.Проблема в том, что строки могут иметь любой возможный формат.Но я также получаю строки формата.

Итак, я получаю:

Date = "9/15/2010"
Time = "16:12:45"
DateFormat = "M/dd/yyyy"
TimeFormat = "h:mm:ss"
TimeZone = "+2:00:00"  // +/- and time in TimeFormat

Но у меня есть некоторые проблемы при разборе этих строк.

Я не могу разобрать время

DateTime.ParseExact("16:12:45","h:mm:ss",null,DateTimeStyles.None);

не работает и вызывает исключение FormatException.Что не так с этим звонком?

Если DateFormat содержит косые черты, мне нужно экранировать их @"M\/dd\/yyyy".Существуют ли другие символы, которые нужно экранировать?

Могу ли я проанализировать весь DateTime в одном?Что-то вроде:

DateTime.ParseExact(Date+' '+Time+' '+TimeZone,DateFormat+' '+TimeFormat+' +'+TimeFormat,null,DateTimeStyles.None);

Ответы [ 4 ]

2 голосов
/ 16 сентября 2010

Что не так с этим вызовом?

В строке формата "h: mm: ss" предполагается, что элемент часов имеет 12-часовой формат (h);Часы в вашей строке представлены в 24-часовом формате, поэтому вам нужно использовать H вместо:

DateTime.ParseExact("16:12:45", "H:mm:ss", null, DateTimeStyles.None);

Есть ли другие символы, которые нужно экранировать?

Любой буквенный символ в вашей строке, который конфликтует с спецификатором формата , необходимо экранировать.Например, / является разделителем даты, но \/ означает буквальный символ /;: - это разделитель времени, но \: означает буквальный символ :;y является одним из спецификаторов года, но \y является буквальным символом y.

Могу ли я проанализировать весь DateTime в одном?

Да.

0 голосов
/ 16 сентября 2010

Как насчет этого?

var @return = (DateTime?)null;
if (source != null)
{
    source = source.Trim();
    if (source.Length > 0)
    {
        var fs = new string[]
        {
            "d MMMM yyyy h:mm tt",
            "d MMMM yyyy h:mm:ss tt",
            "d MMMM yyyy HH:mm",
            "d MMMM yyyy HH:mm:ss",
            "d MMMM yyyy",
            "d/M/yy h:mm tt",
            "d/M/yy h:mm:ss tt",
            "d/M/yy HH:mm",
            "d/M/yy HH:mm:ss",
            "d/M/yy",
            "d/M/yyyy HH:mm",
            "d/M/yyyy HH:mm:ss",
            "d/M/yyyy h:mm:ss tt",
            "d/M/yyyy",
            "d/M/yyyy h:mm tt",
            "d-MMMM-yy HH:mm",
            "d-MMMM-yyyy h:mm tt",
            "d-MMMM-yyyy h:mm:ss tt",
            "d-MMMM-yyyy HH:mm",
            "d-MMMM-yyyy HH:mm:ss",
            "d-MMMM-yyyy",
            "d-MMM-yy",
            "d-MMM-yy h:mm tt",
            "d-MMM-yy h:mm:ss tt",
            "d-MMM-yy HH:mm",
            "d-MMM-yy HH:mm:ss",
            "d-MMM-yyyy",
            "d-M-yy h:mm tt",
            "d-M-yy h:mm:ss tt",
            "d-M-yy HH:mm",
            "d-M-yy HH:mm:ss",
            "d-M-yy",
            "d-M-yyyy",
            "yyyy/M/d h:mm tt",
            "yyyy/M/d h:mm:ss tt",
            "yyyy/M/d HH:mm",
            "yyyy/M/d HH:mm:ss",
            "yyyy/M/d",
            "yyyy-M-d h:mm tt",
            "yyyy-M-d h:mm:ss tt",
            "yyyy-M-d HH:mm",
            "yyyy-M-d HH:mm:ss",
            "yyyy-M-d",
            "yyyy-MM-ddTHH:mm:ss",
        };
        @return = DateTime.ParseExact(source, fs,
            System.Globalization.CultureInfo.CurrentCulture,
            System.Globalization.DateTimeStyles.None);
    }
}
return @return;
0 голосов
/ 16 сентября 2010

Создайте пользовательский DateTimeFormatInfo и передайте его в DateTime.Parse. Как это:

string dateValue = string.Format("{0} {1}", "9/15/2010", "16:12:45");
var customDateTimeFormatInfo = new DateTimeFormatInfo();
customDateTimeFormatInfo.FullDateTimePattern = string.Format("{0} {1}", "M/dd/yyyy", "h:mm:ss");
DateTime dt = DateTime.Parse(dateValue, customDateTimeFormatInfo);

Не требуется экранирование и обработан штраф в размере "h: mm: ss" без изменений.

0 голосов
/ 16 сентября 2010

Знаете ли вы, к какой культуре относится оригинальная строка? Если вы это сделаете, вы можете указать специфичный для культуры DateTimeStyle при вызове Parse ()

DateTime date = DateTime.Parse("<your specific date>", System.Globalization.CultureInfo.GetCultureInfo("<your culture>").DateTimeFormat);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...