Как проверить, есть ли в строке «дата и время» только время? - PullRequest
6 голосов
/ 14 сентября 2011

У меня есть одна строковая переменная, в которой хранится то, что может быть полной или неполной датой:

1) Полная дата: 12.12.2010, 00:33

2)Частичная дата: 12:33 (без поля даты, только время)

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

Обновление - мой конкретный ответ на эту проблему.

Как отмечалось во всех «постах», существует несколько ответов на эту проблему,в конечном итоге это то, что я использовал, и надеюсь, что это может помочь другим *:

public DateTime ProcessDateAndTime(string dateString)
{
    string dateAndTimeString = dateString;

    string[] timeFormats = new string[]
    {
        "hh:mm tt", "hh:mm:ss tt",
        "h:mm tt", "h:mm:ss tt", 
        "HH:mm:ss", "HH:mm", "H:mm"
    };
    // check to see if the date string has a time only
    DateTime dateTimeTemp;
    if (DateTime.TryParseExact(dateString, timeFormats,
        CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.None, out dateTimeTemp))
    {
        // setting date to 01/01/1900
        dateAndTimeString = new DateTime(1900, 1, 1).ToShortDateString() + " " + dateString;
    }

    return DateTime.Parse(dateAndTimeString);
}

* Примечание. Этот метод основан на предположении, что в вашем приложении используется только определенное количество форматов времени, и чтогарантируется, что передана правильно отформатированная строка даты и времени или только время (предварительная проверка для удаления мусорного текста).

Ответы [ 8 ]

6 голосов
/ 14 сентября 2011

Использование

Convert.ToDateTime(string value, IFormatProviderProvider provider)

Поскольку строка представлена ​​в разных вариантах, при необходимости предоставьте разных поставщиков форматов.

Заказ может быть:

  • DateOnly
  • Только время
  • DateTime

Преобразование выдаст исключение формата, если это не удастся. Если вы предпочитаете, чтобы исключений не было, используйте Datetime.TryParse, поскольку это возвращает логическое значение.

В зависимости от того, как представлена ​​строка, у вас может быть более 3 поставщиков форматов.

3 голосов
/ 14 сентября 2011

Вы можете попробовать проверить строку с помощью RegEx, Кстати, хорошие регулярные выражения для проверки DateTime можно найти здесь

2 голосов
/ 26 августа 2016

Вот один из способов сделать это, не зная всех возможных форматов времени:

CultureInfo provider = CultureInfo.CurrentCulture;
DateTime time;
DateTime datetime;
bool isTime = DateTime.TryParse(dateString, provider, DateTimeStyles.NoCurrentDateDefault, out time) 
            && time.Date == DateTime.MinValue.Date
            && DateTime.TryParse(dateString, provider, DateTimeStyles.None, out datetime) 
            && datetime.Date != DateTime.MinValue.Date);

Если строка содержит только время, то первый TryParse установит часть даты на 1/1/0001 или DateTime.MinValue.Date, а второй TryParse установит часть даты на текущую дату. Это будет работать, если только он не будет выполнен «Доктором Кто» после того, как вы вернетесь в прошлое к 1 января 0001 года.

2 голосов
/ 14 сентября 2011

Просмотр длины строки будет простым и будет поддерживать несколько форматов.Строка с датой и временем наверняка будет длиннее, чем строка со временем.Однако, если ваш ввод может иметь времена с высокой точностью (12: 30: 30: 50: 20 против 12/11/11 12:30) и низкой точностью, это не сработает.

Это решение идеальноесли вам не нужно знать значение в строке немедленно и хотите добавить только дату по умолчанию.

Если вы поддерживаете время, например, для секунды, время будет иметь 8 или менее символов идата-время будет иметь 9 или более.

2 голосов
/ 14 сентября 2011

Возможно, это не лучший , но он отвечает на ваш вопрос:

    string dateString = "9:53AM";
    if (!dateString.Contains('/')))
    {
        dateString = DateTime.Now.ToShortDateString() + " " + dateString;
    }
2 голосов
/ 14 сентября 2011

Вы можете использовать DateTime.TryParseExact .

1 голос
/ 14 сентября 2011

Учитывая, что время может быть в различных форматах (12/24?), Было бы лучше использовать несколько шаблонов в некотором предопределенном порядке, пытаясь проанализировать каждый из них и решить, когда первый будет успешным.

0 голосов
/ 20 февраля 2014

Вы также можете попробовать

DateTime aTime;
if (DateTime.TryParse(dateString, CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.NoCurrentDateDefault, out aTime))
{
    //if the there is no date part in the dateString, date will
    // default to Gregorian 1/1/0001
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...