ASP.NET DateTime.Parse oddness

  • Thread starter Thread starter Kevin Kenny
  • Start date Start date
K

Kevin Kenny

Dear All,

I have a date time validation method thus:

public static bool IsDate(string date, System.IFormatProvider provider) {
try {
DateTime.Parse(date, provider)
return true;
} catch (System.FormatException)
return false;
}
}

This works a treat from a console app:
e.g. bool b = Utils.IsDate("21/2/2003", new CultureInfo("en-GB"));

However DateTime.Parse throws an exception if the method is called from
ASP.NET.

Upon further inspection of the CultureInfo object's
DateTimeFormat.ShortDatePattern, it reveals itself as "dd/MM/yyyy" when
called from the console app but is set to "M/d/yyyy" when called from an
ASP.NET application.

Anyone got a clue as to whats happening here. Setting the
ShortDatePattern to "dd/MM/yyyy" solved the problem but it is not very
satisfying when supposedly the culture info object ought to be correct
for en-GB.

The environment is XP, VS.NET2002, FW 1.0.3705.288.

Thanks
Kevin
 
Hi Kevin,

In ASP.NET, you're going to have to make sure that the thread knows about the
culture. It may be that the box is set up as US and not GB.

Try this the code below?

Ken
MVP [ASP.NET]



using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.Globalization ;


namespace p733workcs1
{
/// <summary>
/// Summary description for dtculture.
/// </summary>
public class dtculture : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;

private void Page_Load(object sender, System.EventArgs e)
{
bool b = IsDate("2/21/2003", new CultureInfo("en-GB"));
Label1.Text=b.ToString() ;
}

public static bool IsDate(string date, System.IFormatProvider provider)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new
CultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = new
CultureInfo("en-GB");

try
{
DateTime.Parse(date, provider);
return true;
}

catch (System.FormatException e)
{
return false;

}

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}

Dear All,

I have a date time validation method thus:

public static bool IsDate(string date, System.IFormatProvider provider) {
try {
DateTime.Parse(date, provider)
return true;
} catch (System.FormatException)
return false;
}
}

This works a treat from a console app:
e.g. bool b = Utils.IsDate("21/2/2003", new CultureInfo("en-GB"));

However DateTime.Parse throws an exception if the method is called from
ASP.NET.

Upon further inspection of the CultureInfo object's
DateTimeFormat.ShortDatePattern, it reveals itself as "dd/MM/yyyy" when
called from the console app but is set to "M/d/yyyy" when called from an
ASP.NET application.

Anyone got a clue as to whats happening here. Setting the
ShortDatePattern to "dd/MM/yyyy" solved the problem but it is not very
satisfying when supposedly the culture info object ought to be correct
for en-GB.

The environment is XP, VS.NET2002, FW 1.0.3705.288.

Thanks
Kevin
 
Ken said:
Hi Kevin,

In ASP.NET, you're going to have to make sure that the thread knows about the
culture. It may be that the box is set up as US and not GB.

Try this the code below?

Ken
MVP [ASP.NET]



using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.Globalization ;


namespace p733workcs1
{
/// <summary>
/// Summary description for dtculture.
/// </summary>
public class dtculture : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;

private void Page_Load(object sender, System.EventArgs e)
{
bool b = IsDate("2/21/2003", new CultureInfo("en-GB"));
Label1.Text=b.ToString() ;
}

public static bool IsDate(string date, System.IFormatProvider provider)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new
CultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = new
CultureInfo("en-GB");

try
{
DateTime.Parse(date, provider);
return true;
}

catch (System.FormatException e)
{
return false;

}

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}

Dear All,

I have a date time validation method thus:

public static bool IsDate(string date, System.IFormatProvider provider) {
try {
DateTime.Parse(date, provider)
return true;
} catch (System.FormatException)
return false;
}
}

This works a treat from a console app:
e.g. bool b = Utils.IsDate("21/2/2003", new CultureInfo("en-GB"));

However DateTime.Parse throws an exception if the method is called from
ASP.NET.

Upon further inspection of the CultureInfo object's
DateTimeFormat.ShortDatePattern, it reveals itself as "dd/MM/yyyy" when
called from the console app but is set to "M/d/yyyy" when called from an
ASP.NET application.

Anyone got a clue as to whats happening here. Setting the
ShortDatePattern to "dd/MM/yyyy" solved the problem but it is not very
satisfying when supposedly the culture info object ought to be correct
for en-GB.

The environment is XP, VS.NET2002, FW 1.0.3705.288.

Thanks
Kevin
Hi Ken,

Thanks for the input.

The box is configured for UK locales throughout. The problem is that the
en-GB culture info objects are being instantiated with the wrong
DateTime.ShortDatePattern (M/d/YYYY instead of dd/MM/yyyy). Explicitly
assigning the en-GB CultureInfo object to
Thread.CurrentThread.CurrentCulture &
Thread.CurrentThread.CurrentUICulture doesn't solve the problem because
when they are instantiated they are incorrect and all you are doing is
assigning an already wrong CultureInfo object.

As i said in my last post the only way round this is to explicitly set
the ShortDatePattern in code but I shouldn't have to do this. And
additionally this all works just dandy from a console app.

Regards
Kevin
 
The box is configured for UK locales throughout.

Just out of interest, does everything look correct when you go to the Regional
and Language Options applet > Customize ? Short Date?

Is it possible that there's something in the machine.config or web.config that
is changing the short date format?

Just tossing out ideas here...
 
Back
Top