Link to home
Create AccountLog in
Avatar of mtarabay
mtarabayFlag for United States of America

asked on

String was not recognized as a valid DateTime

I want to check that the entered date not lrgaer than today
in some pc it working good and others gives me the following error
"String was not recognized as a valid DateTime"

here is the code

   DateTime dt = DateTime.ParseExact(txtDueDate.Text.Trim(), "yy/MM/dd", null);
   DateTime curDate = DateTime.ParseExact(DateTime.Now.ToString() , "yy/MM/dd",

null);

                if (dt > curDate)
                {
                    ColErrors.Add(GetLocalResourceObject

("DateNotLargerThanToday.Text").ToString());

                }

thanks
Avatar of Gene_Cyp
Gene_Cyp

Which line of code fails?

Try debugging yourcode and let me know which line fails.

Avatar of mtarabay

ASKER

DateTime curDate = DateTime.ParseExact(DateTime.Now.ToString() , "yy/MM/dd",

null);

this line
try this
Sorry, here is the code
DateTime dt = DateTime.ParseExact(txtDueDate.Text.Trim());
 DateTime curDate = DateTime.Now;

                if (dt > curDate)
                {
                    ColErrors.Add(GetLocalResourceObject

("DateNotLargerThanToday.Text").ToString());

Open in new window

dear elimesika,
I try your suggestion and the same error
Thanks
looks like a problem of Culture

you may do something like:-

     
 DateTime dtParam;
                System.Globalization.CultureInfo enGB = new System.Globalization.CultureInfo("en-GB");
                dtParam = Convert.ToDateTime(strdatetimeparam, enGB);

Open in new window

 

The format of the DataTime will depend on the current culture of your application. In order to have a specific format throughout your application you can set the <globalization> tag in the web.config file under <system.web> section. In such case you need not write code to convert the datatime to proper format. By default all the dates will be set to the format specified.

<system.web>
    ....................
    <globalization culture="en-GB" uiCulture="en-GB" requestEncoding="utf-8" responseEncoding="utf-8" />
</system.web>
Avatar of Pratima
try
DateTime.TryParseExact Method (String, String, IFormatProvider, DateTimeStyles, DateTime%)

refer
http://msdn.microsoft.com/en-us/library/ms131044.aspx
from MSDN:-

Because the Parse(String) method tries to parse the string representation of a date and time using the formatting rules of the current culture, trying to parse a particular string across different cultures can either fail or return different results. If a specific date and time format will be parsed across different locales, use the DateTime.Parse(String, IFormatProvider) method or one of the overloads of the ParseExact method and provide a format specifier.

references:-
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1140

http://msdn.microsoft.com/en-us/library/system.datetime.parseexact.aspx

I tried parse and parseexact with the solutions you said but the same

You don't need to parse the current date.
DateTime dt = DateTime.ParseExact(txtDueDate.Text.Trim(), "yy/MM/dd", null);
if (dt > DateTime.Now.Date)
    ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());

Open in new window

guys no body can help me !!!
DateTime.Now is a DateTime object already, so just don't parse that one. The reason it fails is probably because DateTime.Now.ToString() doesn't return the date in the form yy/MM/dd. The user obviously has to type the date in the txtDueDate textbox in the yy/MM/dd form.

Just try it this way:
DateTime dt = DateTime.ParseExact(txtDueDate.Text.Trim(), "yy/MM/dd", null);
DateTime curDate = DateTime.Now;

if (dt > curDate)
{
   ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());
}

Open in new window

Thanks for interest Divinity ,but gives me the same error
Actually, that was  my suggestion (look back a couple comments). ;)

Can you post your code as it is now, and tell me what string  you're testing with, what line is the exception on, and is todays date valid, or does the user need to enter a date BEFORE today?
apologies tgerbert, but looking at the post times we probably started to type around the same time ;)

I agree, that it would be helpful to see the code as it is now, because there is positively no way to get a "string was not recognized as a datetime" error if the code was changed to no longer parse a string.
I know, was just teasing. I type slow, so sometimes I look at a question and there aren't any comments, but by the time I hit Submit five other people managed to post before me. :)
This is the code now ,it works good in internet explorer but if i use google chroome it gives me the same error
 DateTime dt = DateTime.ParseExact(txtDueDate.Text.Trim(), "yy/MM/dd", null);
                    //DateTime curDate = DateTime.ParseExact(DateTime.Now.ToString(), "yy/MM/dd", fp);
                    DateTime curDate = DateTime.Now;
                    if (dt > curDate)
                    {
                        ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());

                    }
               
Guys any body there?
This is server-side code and pretty standard code at that, so there should be no difference between IE and Google Chrome.
Also, the only DateTime that is being parsed at the moment is the date that the user types into the txtDueDate textbox. Since you are using the ParseExact method, the typed-in date should match the "yy/MM/dd" format exactly. Could it be you accidently typed the year as 2011 in stead of 11 for example, while testing in Google Chrome ?
no i use the calendar with the same format "yy/MM/dd"
thanks for your help Divinity
I agree with Divinity, it's not possible for the code you have posted to yield different results in different browsers; you will need to post your entire page for us to be able to see what's really going on.

I would also note, however, that the ASP.Net calendar control will give you a DateTime object, so there's no need to parse anything:
if (calendarDueDate.SelectedDate > DateTime.Now)
	ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());

Open in new window

i try this code but the same problem , it works good on some pcs and not on the others

  string strDate = txtDueDate.Text.Trim();
                    System.Globalization.DateTimeFormatInfo dtfi = new System.Globalization.DateTimeFormatInfo();
                    dtfi.ShortDatePattern = "yy/MM/dd";
                    dtfi.DateSeparator = "/";
                    DateTime selDate = Convert.ToDateTime(strDate, dtfi);


                    String curDatestr = DateTime.Now.ToString("yy/MM/dd");
                    DateTime curDate = Convert.ToDateTime(curDatestr, dtfi);

                    if (selDate > curDate)
                    {
                        ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());
                    }
>>it works good on some pcs and not on the others
You will need to post the entire page's code. You probably have something else not working that's causing you're problems that has nothing to do with the code you have posted.

Couple other notes...

1) You don't need to bother with a DateTimeFormatInfo, that won't make any difference in this particular case (Convert.ToDateTime is just going to use DateTime.Parse anyway). So you can re-write the top part of your code as:
DateTime selDate;
bool success = DateTime.TryParseExact("", "yy/MM/dd", null, System.Globalization.DateTimeStyles.None, out selDate);
if (success == false)
{
	// Could not convert string into DateTime, show an error message
}

Open in new window


2) The bottom half of your code is taking a DateTime and converting it into a string, then taking that string and converting it back into a DateTime; you're starting with a DateTime and through a series of conversions ending up with the same DateTime you started with, so what's the point in the conversions?  You're basically doing this:
string string1 = "123";
int number = Convert.ToInt32(string1);
string string2 = Convert.ToString(number);
Console.WriteLine(string2);

Open in new window

When you could just write:
string string1 = "123";
Console.WriteLine(string1);

Open in new window


You can re-write the bottom half of your code as:
if (selDate > DateTime.Now.Today)
{
    ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());
} 

Open in new window


If you use these code snippets, and you're certain that you're providing the selected date in the format of "yy/MM/dd" then this code CAN'T fail, and it CAN'T be different on different computers. So, you will need to post your entire page in order to hunt down the problem. It would also be useful if you can tell us what the exceptions are and where they occur. To just say "sometimes it works and sometimes it doesn't" is completely useless to us, we need more details.

You should also have a read at the documentation for the DateTime class: http://msdn.microsoft.com/en-us/library/system.datetime.aspx

Make sure to see the TryParseExact() method (http://msdn.microsoft.com/en-us/library/h9b85w22.aspx), the Now property (http://msdn.microsoft.com/en-us/library/system.datetime.now.aspx) and the Date property (http://msdn.microsoft.com/en-us/library/system.datetime.date.aspx).

Also, if you're using the ASP.Net calendar control you should be aware that it will return a DateTime object, so if you're requiring the user to use the calendar to select a date (which is not a bad idea since it will prevent them from typing an invalid entry in a text box), then you don't need to do any parsing of DateTime's at all (see http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.calendar.aspx and http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.calendar.selecteddate.aspx).  If you use the Calendar control in that manner, then your code might look like:
if (calendar1.SelectedDate.Date > DateTime.Now.Date)
	ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());

Open in new window

Ok I attached the code.
Thanks for helping me
View.ascx
View.ascx.cs
View.ascx.designer.cs
Hi tgerbert,
I upload the source code ,  colud you plese see what is the problem?

thanks for help
Hmm, I wasn't expecting such a large file. ;)

I will take a more detailed look as soon as I can, in the mean time try replacing the date validation section with the code snippet below (just comment-out everything you have now, or save it to a text file, so you can go back easily if necessary).  Use this code exactly as it appears here, inside the ValidateNewTicketForm() method.

// Validate the date only if a date was entered
// Instead of checking txtDueDate.Text.Length != 1, check that it's length is 8 since
// the format you are using requires that the date be exactly 8 characters long
string strDueDate = null;
if ( (!String.IsNullOrEmpty(txtDueDate.Text)) && ( strDueDate = txtDueDate.Text.Trim() ).Length == 8 )
{
               
    // Instead of using a try/catch use DateTime.TryParseExact to determine if the date is valid
    DateTime dueDate;
    if (DateTime.TryParseExact(strDueDate, "yy/MM/dd", null, DateTimeStyles.None, out dueDate))
    {
        // If DateTime.TryParseExact was successful and returned true then "dueDate" 
        // will contain the result of parsing the strDueDate string

        // DateTime.Today returns the current date without time info (actually, it's today's date at 12:00AM)
        // Also, I assume you want to verify the due date is in the future so make sure your
        // comparison is: If TheSelectedDate is not greater than today then add error.
        // (I think in your original code this was backwards)
        if (dueDate < DateTime.Today) // If dueDate occurs BEFORE today then...
            ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());
    }
    else
    {
        // Could not parse the strDueDate string into a DateTime
        ColErrors.Add(GetLocalResourceObject("MustUseAValidDate.Text").ToString());
    }
}

Open in new window


Without the comments (to copy & paste into your project):
string strDueDate = null;
if ( (!String.IsNullOrEmpty(txtDueDate.Text)) && ( strDueDate = txtDueDate.Text.Trim() ).Length == 8 )
{
    DateTime dueDate;
    if (DateTime.TryParseExact(strDueDate, "yy/MM/dd", null, DateTimeStyles.None, out dueDate))
        if (dueDate < DateTime.Today)
            ColErrors.Add(GetLocalResourceObject("DateNotLargerThanToday.Text").ToString());
    else
        ColErrors.Add(GetLocalResourceObject("MustUseAValidDate.Text").ToString());
}

Open in new window

It Gives me error if i enter date like 11/03/31  , i think it is in the format of the today ,they are not matching
>> i think it is in the format of the today ,they are not matching
No. DateTime objects have no format.  Formats are only useful when converting to or from a string. A DateTime is actually a number, a "long", that counts the number of ticks since 12:00AM January 1, 0001. If you used DateTime.ParseExact to get todays date from the string "04/12/2011" and another DateTime getting todays date from the string "11/04/12" then the value of both DateTimes will be: 634381632000000000. Start a new Console project in C# and replace the contents of Program.cs with this code below and run it:
using System;

class Program
{
	static void Main(string[] args)
	{
		Console.Write("Enter a date (yy/MM/dd): ");
		string strDate = Console.ReadLine();

		DateTime dt;
		bool parseSuccess = DateTime.TryParseExact(strDate, "yy/MM/dd", null, System.Globalization.DateTimeStyles.None, out dt);

		if (!parseSuccess)
		{
			Console.WriteLine("You did not enter a valid date.");
			Console.Write("Press any key to exit...");
			Console.ReadKey();
			return;
		}

		if (dt < DateTime.Today)
			Console.WriteLine("You entered a date before today.");
		else if (dt == DateTime.Today)
			Console.WriteLine("You entered todays date.");
		else if (dt > DateTime.Today)
			Console.WriteLine("You entered a date after today.");

		Console.WriteLine("You entered (yy/MM/dd): " + dt.ToString("yy/MM/dd"));
		Console.WriteLine("You entered (MM/dd/yy): " + dt.ToString("MM/dd/yy"));
		Console.WriteLine("You entered (short string): " + dt.ToShortDateString());
		Console.WriteLine("You entered (long format): " + dt.ToLongDateString());

		Console.Write("Press any key to exit...");
		Console.ReadKey();
	}
}

Open in new window



>> It Gives me error if i enter date like 11/03/31
What error? Where does the error occur? Is it throwing an exception? Are you sure the error happened in the date validation section? Did you try putting a breakpoint at the top of the method and stepping through it a line at a time to make sure the strings contain the values you think they do? What does txtDueDate.Text contain? What does your code look like now?
ASKER CERTIFIED SOLUTION
Avatar of mtarabay
mtarabay
Flag of United States of America image

Link to home
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
See answer
there are no solution available