C# 字符串未被识别为有效的日期时间;格式dd/MM/yyyy“;

C# 字符串未被识别为有效的日期时间;格式dd/MM/yyyy“;,c#,.net,datetime,types,casting,C#,.net,Datetime,Types,Casting,我正在尝试将字符串格式的值转换为日期类型,格式为dd/MM/yyyy this.Text="22/11/2009"; DateTime date = DateTime.Parse(this.Text); 有什么问题? 它有第二个覆盖,要求IFormatProvider。这是什么?我也需要通过这个吗?如果是,如何在这种情况下使用它 编辑 Parse和ParseExact之间有什么区别 编辑2 Slaks和Sam的答案都适用于我,目前用户正在提供输入,但我可以通过使用maskTextbox确保它

我正在尝试将字符串格式的值转换为日期类型,格式为
dd/MM/yyyy

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

DateTime date = DateTime.Parse(this.Text);
有什么问题? 它有第二个覆盖,要求
IFormatProvider
。这是什么?我也需要通过这个吗?如果是,如何在这种情况下使用它

编辑

Parse
ParseExact
之间有什么区别

编辑2

Slaks和Sam的答案都适用于我,目前用户正在提供输入,但我可以通过使用maskTextbox确保它们是有效的


考虑到诸如类型安全性、性能或您喜欢的东西等所有方面,哪个答案更好使用
DateTime.ParseExact

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

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
您需要调用,它解析与您提供的格式完全匹配的日期

例如:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
IFormatProvider
参数指定用于解析日期的区域性。
除非字符串来自用户,否则应传递
CultureInfo.InvariantCulture


如果字符串确实来自用户,您应该传递
CultureInfo.CurrentCulture
,它将使用用户在“控制面板”的“区域选项”中指定的设置。

解析日期时间的字符串表示形式是一件棘手的事情,因为不同的区域性具有不同的日期格式。Net知道这些日期格式,并在调用
DateTime.Parse(this.Text)
时从当前区域性(
System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat
)中提取它们

例如,字符串“22/11/2009”与美国(en-US)的不匹配,但与法国(fr)的匹配

现在,您可以调用
DateTime.ParseExact
并传递所需的精确格式字符串,也可以将适当的区域性传递到
DateTime.Parse
以解析日期

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

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );
当然,你不应该随便挑选法国,而应该选择适合你需要的东西


您需要了解的是System.Threading.Thread.CurrentThread.CurrentCulture设置为什么,以及它是否/为什么与您期望的不同。

您可能需要指定特定日期格式的区域性,如下所示:

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

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

    DateTime date = DateTime.Parse(this.Text);
有关更多详细信息,请访问:


使用此选项将字符串转换为日期时间:

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
你也可以使用

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day

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

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>


Ref:

正如上面有人所说,您可以将其作为字符串参数发送,但它必须具有以下格式:例如:“20130121”,您可以直接从控件将其转换为该格式。例如,您可以从如下文本框中获得:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"
要将其转换为:“20130121”,请使用:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

这样SQL就可以将其转换并放入您的数据库。

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

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;
}
 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
手动更改:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

从2015年11月22日起,它将于2015年11月22日转换,代码如下:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));
名称空间

using System.Globalization;
基于此,下一种方法对我有效:

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

为什么我们必须在这里传递null?输入可以是“22/11/2009 12:00:00 AM”或“22/11/2009”。开发机器的文化也可能不同于生产的文化。那么上述代码能否无缝工作?@Rahat,如果格式不匹配,parse-exact将无法工作。上面的格式模式是
dd/MM/yyyy
,因此无法正确解析包含时间的文本字符串。您需要去掉时间或将其包含在格式模式中。有一个超负荷的
ParseExact
,它接受一个格式模式数组,如果与其中任何一个模式匹配,它将解析文本。@SamuelNeff如果要定义格式,为什么不使用
CultureInfo.InvariantCulture
而不是当前模式?@Toolkit原因是格式字符串中的斜杠不是文字砍。它们被当前区域性中的日期分隔符字符串替换。所以它确实取决于上面写的文化。Samuel Neff,尝试
Thread.CurrentThread.CurrentCulture=new CultureInfo(“da DK”),它将破坏您的解决方案。要解决此问题,请使用
“dd'/'MM'/'yyyyy”
(用单引号保护斜杠),或
@“dd\/MM\/yyyy”
(“转义”带反斜杠的斜杠)。@Slaks:CultureInfo.InvariantCulture在代码中不可用。我是否需要使用System.Globalization使用一些名称空间
您也可以右键单击错误并单击“解决”,这将为您放入缺少的命名空间。您也可以双击错误并看到向下的箭头,其中显示了相关命名空间,您也可以使用空格计数,例如,如果字符串格式为“MM/dd/yyyy HH:MM:ss”(注意-2空格)-那么ParseExact的格式还必须包括spaces@Edit:这就是文档的目的。ParseExact是指当你知道日期字符串的确切格式时,Parse是指当你想要能够处理更动态的东西时。Amit Philips,你救了我一天。。我已经尝试了所有可能的事情。这个小小的改变是有效的。谢谢。阿米特,你真的是上帝之子。你的解决方案对我不起作用。它会出现错误,如“字符串未被识别为有效的日期时间”。我将以下输入日期传递给你的解决方案:“13/06/17”,但它会出现错误。请帮我一把。对我来说非常有效,我认为这是最好的答案,因为它的工作日期也有时间和时区文本,这意味着,如果它的处理用户输入的数据,它可以处理各种格式什么是“PROCOOSATEDATE())?