Тестовое преобразование строки в дату и время, отличное от DateTime.TryParseExact

Добрый день,

Обычно, если я хочу проверить, является ли строка допустимым форматом даты и времени, я буду использовать:

if (DateTime.TryParseExact()){
//do something
}

Я хотел бы спросить, есть ли какой-либо код, который может напрямую проверить Convert.ToDateTime() успешно или нет? Например как:

if (Convert.ToDateTime(date1)){
//do something
}

or

if(Convert.ToDateTime(date1) == true){
//do soemthing
}

Моя идея состоит в том, чтобы сделать его логическим, чтобы проверить его успешное преобразование в дату или нет. Просто пытаюсь узнать код вместо использования DateTime.TryParseExact()


person Panadol Chong    schedule 10.07.2013    source источник
comment
Что не так с DateTime.TryParseExact?   -  person Darren    schedule 10.07.2013
comment
Оберните свой код try..catch   -  person Andrey Gordeev    schedule 10.07.2013
comment
Какая-то конкретная причина не использовать DateTime.TryParse или DateTime.TryParseExact? Именно для этого они и существуют.   -  person Corak    schedule 10.07.2013
comment
@ Даррен, с DateTime.TryParseExact ничего не поношено, я просто думаю, есть ли что-то похожее на то, что я думаю, или нет. @Corak, потому что, если использовать DateTime.TryParse, мне нужно объявить формат для проверки, иногда формат даты и времени может отличаться, поэтому я думаю, есть ли какой-нибудь код, подобный тому, что я думаю.   -  person Panadol Chong    schedule 10.07.2013
comment
Что ж, вы всегда можете сами обернуть его в небольшой метод, который обрабатывает объявление объекта out, но ничего с ним не делает. И поскольку существует около двух миллиардов различных способов представления DateTime в виде строки, в ваших собственных интересах ограничить, какие именно форматы вы принимаете. Продолжаются войны между dd/MM и MM/dd...   -  person Corak    schedule 10.07.2013


Ответы (4)


Ваш первый код

if (DateTime.TryParseExact()) {
    //do something
}

делает именно то, что вы хотите.

Используйте это так:

if (DateTime.TryParseExact(str, ...)) {    // OR use DateTime.TryParse()
    // str is a valid DateTime
}
else {
    // str is not valid
}

Вы можете использовать DateTime.TryParse(), если не хотите указывать формат.
Оба метода возвращают значение boolean.

person joe    schedule 10.07.2013
comment
Я понимаю, что вы имеете в виду. При использовании DateTime.TryParseExact(str, format, ...) мне нужно объявить формат для проверки. Мой вопрос в том, могу ли я перенести Convert.ToDateTime(str) в bool или нет. - person Panadol Chong; 10.07.2013
comment
@PanadolChong: как уже упоминалось, вы также можете использовать DateTime.TryParse(), где вам не нужно указывать формат. - person joe; 10.07.2013

Если вы действительно хотите, вы можете использовать convert to. Однако использование этого означает, что вы не получаете функций, которые может дать вам tryparse.

ПопробуйтеParse:

-Простая проверка if/else

-Wont вылетит и сожжет ваше приложение, если в него будут введены неверные данные

public static bool
{ 
    TryParse(string s, out DateTime result)
}

Тогда, если еще проверка

Преобразовать в:

-Если будут введены неверные данные, ваше приложение выйдет из строя.

-Лучше включить в это try catch

– См. статью msdn о ConvertTo.

 private static void ConvertToDateTime(string value)
 {
  DateTime convertedDate;
  try {
     convertedDate = Convert.ToDateTime(value);
     Console.WriteLine("'{0}' converts to {1} {2} time.", 
                       value, convertedDate, 
                       convertedDate.Kind.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("'{0}' is not in the proper format.", value);
  }
}

На мой взгляд, вы всегда должны отдавать предпочтение Tryparse.

person Philip Gullick    schedule 10.07.2013

Согласно вашим комментариям:

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

TryParseExact уже принимает формат.

Этот короткий пример делает то, что вы хотите, используя TryParseExact. TryParseExact не будет генерировать исключение, если формат или дата неверны, поэтому вам не нужно беспокоиться о дорогостоящих блоках Try/Catch. Вместо этого он вернет false.

static void Main()
{
    Console.Write(ValidateDate("ddd dd MMM h:mm tt yyyy", "Wed 10 Jul 9:30 AM 2013"));
    Console.Read();
}

public static bool ValidateDate(string date, string format)
{
   DateTime dateTime;
   if (DateTime.TryParseExact(date, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
   {
       Console.WriteLine(dateTime);
       return true;
   }
   else
   {
       Console.WriteLine("Invalid date or format");
       return false;
   }
}

Или сокращенно:

public static bool ValidateDate(string date, string format)
{
    DateTime dateTime;
    return DateTime.TryParseExact(date, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime);
}
person DGibbs    schedule 10.07.2013

Тогда используйте что-то вроде этого.

bool isDateTimeValid(string date, string format)
{
    try
    {
        DateTime outDate = DateTime.ParseExact(date, format, Thread.CurrentThread.CurrentUICulture);

        return true;
    }
    catch(Exception exc)
    {
        return false;
    }
}
person Donatas K.    schedule 10.07.2013
comment
DateTime.TryParseExact(...) не генерирует исключение. Вы имели в виду DateTime.ParseExact? - person joe; 10.07.2013
comment
Отредактировано, да, я хотел использовать ParseExact - person Donatas K.; 10.07.2013
comment
@joe - на самом деле за TryParse/TryParseExact скрывается немного больше магии, в основном из-за того, что он не использует никакого try ... catch. И поскольку перехват исключения происходит очень медленно, всегда следует использовать TryParse/TryParseExact. - person Corak; 10.07.2013