sonali_prajapati Ответов: 9

C# - Как проверить, содержит ли строка дату


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

Мне нужно проверить, содержит ли введенный текст такую дату, как

если пользователь вводит "я хочу этот пункт к 11/21/2011"

или "15.10.2011" в обоих случаях я хочу true else false.

Пожалуйста, предложите

9 Ответов

Рейтинг:
69

OriginalGriff

Это намного сложнее, чем кажется - вы должны предположительно справиться с любым форматом даты - я могу придумать три, которые могут сбить вас с толку:

yyyy/MM/dd
dd/mm/yy
mm/dd/yy

Если он войдет в "11/12/13", какой это год? Какой сейчас месяц?
Если он войдет в "11/12/2013", это будет 11 декабря или 12 ноября?
Что, если он войдет в 1/2-это половина или 1 февраля следующего года?
А что, если он войдет 12 декабря 2011 года?

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


Orcun Iyigun

5 ЕД!

raju melveetilpurayil

5+

Monjurul Habib

5!

Рейтинг:
62

Wendelius

Вы могли бы сначала использовать например Строка.Расщеплять[^] чтобы разбить текст на части, используя пробелы в качестве разделителя и для каждого элемента в массиве используйте, например Метод tryparse[^].

Однако, как писал OriginalGriff, у вас будут проблемы с аналогичными датами и месяцами в разных форматах дат, поэтому вы должны каким-то образом знать формат, используемый пользователем, или разбить ввод на несколько элементов управления, как предложил OriginalGriff.


Monjurul Habib

5!

Wendelius

Спасибо :)

Рейтинг:
60

Morgs Morgan

Я думаю, что у Мики Венделиуса есть идея разрешить такой сценарий, и ниже я попытаюсь изложить его в коде:

Boolean hasDate = false;
DateTime dateTime = new DateTime();
String[] inputText = txtWords.Text().Split( " " );//split on a whitespace

foreach( String text in inputText )
{
   //Use the Parse() method
   try
   {
      dateTime = DateTime.Parse( text );
      hasDate = true;
      break;//no need to execute/loop further if you have your date
   }
   catch( Exception ex )
   {
      
   }
}

//after breaking from the foreach loop, you can check if hasDate=true
//if it is, then your user entered a date and you can retrieve it from the dateTime 

if( hasDate )
{
    //user entered a date, get it from dateTime
}
else
{
   //user didn't enter any date
}


Пользуясь DateTime.Parse(), вам не нужно знать формат даты перед рукой, если формат даты не разрешен, то DateTime.Parse() метод просто не сможет разобрать текущий "текст", перейти в catch и продолжить обратно в then foreach loop!

Надеюсь, это даст вам толчок,

Счастливое кодирование,
Морги


Morgs Morgan

Спасибо

Perić Željko

Что произойдет, если пользователь введет следующее сообщение:
Мой день рождения-06.11.2011.
Программа распознала бы дату в таком текстовом сообщении.

Monjurul Habib

5!

Wendelius

Вот именно, что-то в этом роде. Мои 5 :)

Рейтинг:
2

BillWoodruff

Почему бы не использовать специальный элемент управления DateTimePicker и не предотвращать ошибки с помощью не позволяя им произойти: как у JQuery: [^].


CHill60

Однако это не вписывается в краткое изложение. Краткое изложение, э-э, 6+ - летней давности

BillWoodruff

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

Еще один пример моего ослабленного зрения.

Рейтинг:
2

Abhi KA

попробовать это

string []format = new string []{"yyyy-MM-dd HH:mm:ss"};
string value = "2011-09-02 15:30:20";
DateTime datetime;

if (DateTime.TryParseExact(value, format, System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.NoCurrentDateDefault  , out datetime))
   Console.WriteLine("Valid  : " + datetime);
else
  Console.WriteLine("Invalid");


Abhi KA

это работает

_Zorro_

Что произойдет, если формат не yyyy-MM-dd HH:mm:ss ?

Member 14870442

Спасибо

Рейтинг:
2

Perić Željko

Привет ,
это мое решение,
но это связано с региональными настройками в ОС.

/*
 * Created by Perić Željko
 * IDE SharpDevelop C#
 * Date: 6.12.2011
 * Time: 18:30
 * 
 * This is a small console application that partially solves the problem
 * because it recognizes only the date format in the text
 * that is set at the level of operating system , regional settings
 * in my case it is "Serbian cyrillic" and that means
 * DD.MM.YYYY or DD/MM/YYYY (day/month/year) if you want that program 
 * recognizes the other Date formats such as :
 * MM/DD/YYYY or other,
 * you have to write different kind of program
 * or you have to set regional settings for that Date format
 */
 
using System;
namespace DateCheck
{
	class Program
	{
		public static void Main(string[] args)
		{
			
			//
			// variable definition
			//
			
			string text = "";
			string date = "";
			int lenght = 0;
			int index = 0;
			bool da = false;
			DateTime D;
			
			//
			// write message for user to enter text
			// and read text from console
			//
			Console.WriteLine();
			Console.WriteLine("Hello,");
			Console.WriteLine("Enter text :");
			text = Console.ReadLine();
			
			//
			// wanted format of date is exactly DD/MM/YYYY or DD.MM.YYYY
			// it depends of local Date and Time format settings
			//
			index = 0;
			lenght = 0;
			lenght = text.Length - 9;
			while (index < lenght)
			{
				//
				// Since the format of date consists of 10 characters
				// we take first 10 characters and check if it is Date
				// if it is not we take next 10, starting from 2. character in the text
				// afther that next 10 starting from 3. character in the text ....
				// until we check all text.
				//
				date = text.Substring(index,10);
				try
				{
					D = DateTime.Parse(date);
					da = true;
					index = lenght;
				}
				catch
				{
					da = false;
					index = index + 1;
				}
			}
			
			//
			// If there is Date in the text write a message to user
			//
			if (da == true) 
			{
				Console.WriteLine();
				Console.WriteLine("In the text you have Date !");
			}
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
		}
	}
}


В этом случае дату не нужно отделять от текста пробелом
пример :
Это мое послание, написанное 08.12.2011 года, и это было в декабре.

в этом примере программа распознает формат даты в тексте.


Perić Željko

Извините, но я не знаю, почему иногда текстовый редактор хочет принимать теги </pre>, Чтобы код не выделялся, как в других решениях.
Перич Желько : (?

Wendelius

Предварительно теги исправлены

Perić Željko

Спасибо, Мика.

Рейтинг:
1

tibinthomas

public static bool IsDate(Object obj)
    {
        string strDate = obj.ToString();
        try
        {
            DateTime dt = DateTime.Parse(strDate);
            if (dt != DateTime.MinValue && dt != DateTime.MaxValue)
                return true;
            return false;
        }
        catch (Exception ex)
        {
            throw ex;
            return false;
        }
    }


Abhi KA

правильный

sonali_prajapati

но моя строка может иметь текст также с датой strDate= "items needed by 11/21/2011" я должен проверить, содержит ли этот текст дату в формате mm/dd/yyyy

RaviRanjanKr

Предложение : - всегда оборачивайте свой код в предварительный тег.

Morgs Morgan

Как насчет того, чтобы поместить это в свой "улов": бросить ex; вернуть false; вместе? плохое кодирование-это не так!?
Я бы подумал, что throw ex; остановит выполнение программы? в следующий раз будь осторожен..

Рейтинг:
0

AmitGajjar

Привет,

если это единственный формат даты и времени, то вы можете использовать,

Regex stringDatePattern=new Regex("*[0-9][0-9][/][0-9][0-9][/][0-9][0-9[0-9][0-9]]*");
return stringDatePattern.IsMatch(TextBox.Text);


надеюсь, это вам поможет,

спасибо
- Амит.


AmitGajjar

Причина для 1 голоса ?

Рейтинг:
0

santhosh-padamatinti

try
{
DateTime UserDate=Convert.ToDateTime("MM/dd/yyyy")
}
catch(Exception ex)
{
return "invalid date entered";
}


if(UserDate.Day==11 && UserDate.Day==12)
return true;
else
return false;