如何在C#中测试日期以了解它所属的文化

Fan*_*o68 3 c# datetime sql-server-2005 date-format

我有一个datetime字段,其格式如下......

dd/mm/yyyy - 这是英国/ GB/AU格式

有时会以美国格式发现日期......

毫米/日/年

如果DAY超过12且MONTH在12以内,则此方法正常.

如果不是,则自动假定日期采用美国格式.

即:2014年1月1日可以在两个方面进行互操作 - 英国和美国(3月1日或1月3日)

我如何在C#中解析它以了解它是哪种文化?显然没有直接的单行方式这样做,因为在美国或英国文化中解析这些日期将再次返回相同的日期.

问题是,无论我们在DD和MM中有什么价值,我如何强制美国日期为英国格式,并留下英国格式的日期?

我试图使用以下代码执行此操作...

//get the date from a control
TextBox tbDate = (TextBox)e.Row.FindControl("tbInvoiceDate");
if (tbDate != null && tbDate.Text != "")
{
   //define the two cultures I want to test
   IFormatProvider cultureAU = new CultureInfo("en-AU", true);
   IFormatProvider cultureUS = new CultureInfo("en-US", true);

   //try and parse the date into US culture
   DateTime dtINV;
   DateTime.TryParse(tbDate.Text, cultureUS, DateTimeStyles.None, out dtINV);

   //"force" the date to be in UK format
   String strDate = (dtINV != null && tbDate.Text != "") ? dtINV.ToString("dd-MM-yyyy") : "";

   //return the new format back to the textbox
   tbDate.Text = dtINV.ToShortDateString();               
}
Run Code Online (Sandbox Code Playgroud)

上述代码不起作用,因为美国日期保留为美国日期,因为日期和月份,正如我上面所解释的那样,也是正确的"格式",因为它是英国日期.

我想我在这里错过了一些额外的代码来分别测试日期和月份,然后格式化日期.

提前致谢.

[UPDATE]

我已经解决了一些问题(参见下文),使用以下代码,并假设文本框中的日期始终采用mm-dd-yyyy格式.

TextBox tbDate = (TextBox)e.Row.FindControl("tbInvoiceDate");
if (tbDate != null && tbDate.Text != "")
{
   IFormatProvider cultureAU = new CultureInfo("en-AU", true);
   DateTime dtIn;
   DateTime.TryParse(tbDate.Text, cultureAU, DateTimeStyles.AssumeLocal, out dtIn);
   DateTime dtInv = new DateTime(dtIn.Year, dtIn.Day, dtIn.Month);
   tbDate.Text = dtInv.ToShortDateString();               
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我在AU格式中键入新日期时,系统会在上面的代码之前启动,出现以下错误...

将char数据类型转换为smalldatetime数据类型导致语句已终止的超出范围的smalldatetime值

所以现在似乎有些东西现在期望该领域采用美国格式.但我尝试用美国格式输入31-01-2014,但它仍然会出现上述错误,因此不确定现在要去哪里.

谢谢大家到目前为止.

Ree*_*sey 5

我怎样才能强制美国日期为英国格式并单独留下英国格式的日期?

没有自动的方式来了解这一点.如果您收到"04/03/2014"的日期,则无法在没有额外信息的情况下知道这是代表3月4日还是4月3日.

为了正确处理日期,您需要提供文化以及日期,始终使用特定的文化,或者将日期表示为DateTime而不是string.