字符串未被识别为有效的DateTime"格式dd/MM/yyyy"

Sha*_*pta 158 .net c# datetime types casting

我试图将我的字符串格式化值转换为格式的日期类型dd/MM/yyyy.

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);
Run Code Online (Sandbox Code Playgroud)

问题是什么 ?它有一个要求的第二个覆盖IFormatProvider.这是什么?难道我还需要通过这个?如果是,如何在这种情况下使用它?

编辑

Parse和之间有什么区别ParseExact

编辑2

Slaks和Sam的两个答案都适合我,目前用户正在提供输入,但我将确保使用maskTextbox它们是有效的.

考虑到类型安全性,性能或您想要的所有方面,哪个答案更好

Sam*_*eff 233

使用DateTime.ParseExact.

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Run Code Online (Sandbox Code Playgroud)

  • 为什么我们必须在这里传递null? (7认同)
  • @Rahat,如果格式不匹配,则解析精确不起作用.上面的格式模式是`dd/MM/yyyy`,因此不会正确解析带有时间的文本字符串.您需要剥离时间或将其包含在格式模式中.有一个'ParseExact`的重载,它接受一个格式模式数组,如果它们匹配任何一个,它将解析文本. (7认同)
  • @SamuelNeff如果你要定义一个格式,为什么不使用`CultureInfo.InvariantCulture`而不是当前的? (7认同)
  • 输入可以是"22/11/2009 12:00:00 AM"或"22/11/2009".开发机器的培养也可以与生产文化不同.那么上面的代码可以无缝地工作吗? (3认同)
  • @Toolkit原因是格式字符串中的斜杠不是文字斜杠.它们由当前区域性中的日期分隔符字符串替换.所以它确实依赖于上面写的文化.Samuel Neff,尝试`Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");`,它会打破你的解决方案.要解决这个问题,请使用`"dd"/'MM'/'yyyy"`(用单引号保护斜杠),或`@"dd\/ MM\/ yyyy"`("转义"用反斜杠划线). (3认同)
  • 我不知道到底是什么,但这个var text ="22/11/2009"; DateTime date = DateTime.ParseExact(text,"dd/MM/yyyy",null); throws String未被识别为有效的DateTime.例外.您必须使用DateTime.ParseExact(Text,"dd/MM/yyyy",CultureInfo.InvariantCulture); (2认同)

SLa*_*aks 42

您需要调用ParseExact,它会解析与您提供的格式完全匹配的日期.

例如:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

IFormatProvider参数指定用于解析日期的区域性.
除非你的字符串来自用户,否则你应该通过CultureInfo.InvariantCulture.
如果字符串确实来自用户,则应传递CultureInfo.CurrentCulture,这将使用用户在"控制面板"的"区域选项"中指定的设置.

  • `使用System.Globalization;` (3认同)
  • @Slaks:CultureInfo.InvariantCulture在代码中不可用.我需要使用一些命名空间吗? (2认同)
  • 您也可以右键单击错误并单击"解决",这将为您提供缺少的命名空间. (2认同)

Gre*_*reg 20

解析DateTime的字符串表示是一件棘手的事情,因为不同的文化具有不同的日期格式..Net知道这些日期格式,并System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat在你打电话时将它们从你当前的文化中拉出来DateTime.Parse(this.Text);

例如,字符串"22/11/2009"不匹配ShortDatePattern为美国(EN-US),但它确实难挡法国(FR-FR).

现在,您可以调用DateTime.ParseExact并传入您期望的确切格式字符串,也可以传入适当的文化DateTime.Parse来解析日期.

例如,这将正确解析您的日期:

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );
Run Code Online (Sandbox Code Playgroud)

当然,你不应该只是随意选择法国,而是适合你的需要.

您需要弄清楚的System.Threading.Thread.CurrentThread.CurrentCulture是设置的内容,以及它是否/为什么与您的期望不同.


Ami*_*ips 16

虽然上述解决方案有效,但您也可以使用以下方法修改webconfig文件...

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

参考:与生产机器相比,本地机器上的日期时间格式不同

  • 阿米特,你真是神的儿子。 (3认同)

Ric*_*hez 10

您可能需要为该特定日期格式指定文化,如:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

    this.Text="22/11/2009";

    DateTime date = DateTime.Parse(this.Text);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请访问:

http://msdn.microsoft.com/en-us/library/5hh873ya.aspx


Jes*_*tro 7

基于此参考,下一种方法对我有用:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
Run Code Online (Sandbox Code Playgroud)


Bal*_*mar 6

private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}
Run Code Online (Sandbox Code Playgroud)


ati*_*ker 5

花了很多时间我已经解决了这个问题

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
Run Code Online (Sandbox Code Playgroud)

  • 非常适合我,我认为这是最好的答案,因为它适用于也有时间和时区文本的日期,这意味着如果它处理用户输入的数据,它可以处理各种格式 (2认同)