Проверьте, содержит ли строка времени даты время

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

1) 1980/10/11 12:00:01 2) 2010/APRIL/02 17:10:00 3) 10/02/10 03:30:34

Дата может быть в любом формате, за которым следует время в 24hr.

Я попытался определить существование времени через следующий код,

string timestamp_string = "2013/04/08 17:30";
DateTime timestamp = Convert.ToDateTime(timestamp_string);
string time ="";

if (timestamp_string.Length > 10)
{
    time = timestamp.ToString("hh:mm");
}
else {
    time = "Time not registered";
}

MessageBox.Show(time);

Но это работает только для временных меток типа 1). Могу ли я, пожалуйста, знать, как достичь этой задачи, как определить, существует ли элемент времени в этой временной строке даты. Большое спасибо:)

ВОЗМОЖНАЯ МАТЧА Как проверить, есть ли дата и время " строка имеет только время?

INFO три ответа, предоставленные Arun Selva Kumar, Guru Kara, Patipol Paripoonnanonda, являются правильными и проверяют время и служат моей цели. Но я выбираю Guru Kara ответ только на простоту использования и объяснение, которое он дал. Большое спасибо:) очень ценю всех вас:)

Ответ 1

Компоненты времени даты TimeOfDay - это то, что вам нужно.

MSDN говорит: "В отличие от свойства Date, которое возвращает значение DateTime, которое представляет дату без его компонента времени, свойство TimeOfDay возвращает значение TimeSpan, которое представляет компонент времени значения DateTime."

Вот пример с учетом всех ваших сценариев.
Поскольку вы уверены в формате, который вы можете использовать DateTime.Parse else, используйте DateTime.TryParse

var dateTime1 = System.DateTime.Parse("1980/10/11 12:00:00");
var dateTime2 = System.DateTime.Parse("2010/APRIL/02 17:10:00");
var dateTime3 = System.DateTime.Parse("10/02/10 03:30:34");
var dateTime4 = System.DateTime.Parse("02/20/10");

if (dateTime1.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("1980/10/11 12:00:00 - does not have Time");
} else {
    Console.WriteLine("1980/10/11 12:00:00 - has Time");
}

if (dateTime2.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("2010/APRIL/02 17:10:00 - does not have Time");
} else {
    Console.WriteLine("2010/APRIL/02 17:10:00 - Has Time");
}

if (dateTime3.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("10/02/10 03:30:34 - does not have Time");
} else {
    Console.WriteLine("10/02/10 03:30:34 - Has Time");
}

if (dateTime4.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("02/20/10 - does not have Time");
} else {
    Console.WriteLine("02/20/10 - Has Time");
}

Ответ 2

Попробуйте это,

DateTime myDate;
if (DateTime.TryParseExact(inputString, "dd-MM-yyyy hh:mm:ss", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate))
{
    //String has Date and Time
}
else
{
    //String has only Date Portion    
}

Вы можете попробовать использовать другие спецификаторы формата, перечисленные здесь, http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Ответ 3

Объединив ответы Гуру Кара и bool HasExplicitTime(DateTime parsedTimestamp, string str_timestamp) { string[] dateTimeSeparators = { "T", " ", "@" }; string[] timeSeparators = { CultureInfo.CurrentUICulture.DateTimeFormat.TimeSeparator, CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator, ":"}; if (parsedTimestamp.TimeOfDay.TotalSeconds != 0) return true; string[] dateOrTimeParts = str_timestamp.Split( dateTimeSeparators, StringSplitOptions.RemoveEmptyEntries); bool hasTimePart = dateOrTimeParts.Any(part => part.Split( timeSeparators, StringSplitOptions.RemoveEmptyEntries).Length > 1); return hasTimePart; }

Этот подход:

обнаруживает явное время полуночи (например, "2015-02-26T00: 00" ); только ищет строку, когда TimeOfDay указывает на полночь или нет явного времени; и находит явное полночное время в локальном формате и любое не-полночное время в любом формате, который может анализировать .net.

Ограничения:

явное полночное время в некультурном локальном формате не обнаружено; явное время полуночи с менее чем двумя частями не обнаружено; и менее простые и элегантные, чем подходы Гуру Кара и Патипола Парифоннанонды.

Ответ 4

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

Мне пришлось сделать предположение, что там нет какой-либо допустимой даты/времени, в которой есть 7 символов небелого пробела или меньше. Похоже, что "1980/10" анализирует, но не "1980/10 01: 01: 01.001".

Я включил различные тестовые примеры. Не стесняйтесь добавлять свои собственные и сообщать мне, если они терпят неудачу.

public static bool IsValidDateTime(this string dateString, bool requireTime = false)
{
    DateTime outDate;
    if(!DateTime.TryParse(dateString, out outDate)) return false;

    if (!requireTime) return true;
    else
    {
        return Regex.Replace(dateString, @"\s", "").Length > 7 
&& !DateTime.TryParse(dateString + " 01:01:01.001", out outDate);
    }
}

public void DateTest()
{
    var withTimes = new[]{
    "1980/10/11 01:01:01.001",
    "02/01/1980 01:01:01.001",
    "1980-01-01 01:01:01.001",
    "1980/10/11 00:00",
    "1980/10/11 1pm",
    "1980-01-01 00:00:00"};

    //Make sure our ones with time pass both tests
    foreach(var date in withTimes){
        Assert.IsTrue(date.IsValidDateTime(), String.Format("date: {0} isn't valid.", date));
        Assert.IsTrue(date.IsValidDateTime(true), String.Format("date: {0} does have time.", date));
    }

    var withoutTimes = new[]{
    "1980/10/11",
    "1980/10",
    "1980/10 ",
    "10/1980",
    "1980 01",
    "1980/10/11 ",
    "02/01/1980",
    "1980-01-01"};

    //Make sure our ones without time pass the first and fail the second
    foreach (var date in withoutTimes)
    {
        Assert.IsTrue(date.IsValidDateTime(), String.Format("date: {0} isn't valid.", date));
        Assert.IsFalse(date.IsValidDateTime(true), String.Format("date: {0} doesn't have time.", date) );
    }

    var bogusTimes = new[]{
    "1980",
    "1980 01:01",
    "80 01:01",
    "1980T01",
    "80T01:01",
    "1980-01-01T01",
    };

    //Make sure our ones without time pass the first and fail the second
    foreach (var date in bogusTimes)
    {
        DateTime parsedDate;
        DateTime.TryParse(date, out parsedDate);
        Assert.IsFalse(date.IsValidDateTime(), String.Format("date: {0} is valid. {1}", date, parsedDate));
        Assert.IsFalse(date.IsValidDateTime(true), String.Format("date: {0} is valid. {1}", date, parsedDate));
    }
}

Ответ 5

Дата и время всегда разделяются пробелом. Самый простой способ:

if (timestamp_string.Split(' ').Length == 2)
{
    // timestamp_string has both date and time
}
else
{
    // timestamp_string only has the date
}

Этот код предполагает, что дата всегда существует.

Если вы хотите принять его дальше (в случае, если дата не существует), вы можете сделать:

if (timestamp_string.Split(' ')
                    .Select(item => item.Split(':').Length > 1)
                    .Any(item => item))
{
    // this would work for any string format that contains date, for example:
    // 2012/APRIL/03 12:00:05 -> this would work
    // 2013/04/05 09:00:01 -> this would work
    // 08:50:45 2013/01/01 -> this would also work
    // 08:50:50 -> this would also work
}
else
{
    // no date in the timestamp_string at all
}

Надеюсь, это поможет!