无法将字符串识别为有效的DateTime“格式dd / MM / yyyy”


172

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

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

DateTime date = DateTime.Parse(this.Text);

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

编辑

Parse和之间有什么区别ParseExact

编辑2

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

考虑到诸如安全类型,性能或您感觉类似的所有方面,哪个答案更好


7
@Edit:这就是文档的用途。 msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks 2010年

2
当您知道日期字符串的确切格式时,可以使用ParseExact;而当您想要某种可以处理更动态的内容时,则可以使用ParseExact。
gingerbreadboy

Answers:


255

使用DateTime.ParseExact

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

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);

8
为什么我们必须在此处传递null?
Shantanu Gupta'2

3
输入可以是“ 22/11/2009 12:00:00 AM”或“ 22/11/2009”。开发机器的文化也可能与生产文化不同。那么上述代码将无缝运行吗?
拉赫塔尔

8
@Rahat,如果格式不匹配,则精确解析将不起作用。上面的格式模式是dd/MM/yyyy一个带有时间的文本字符串,因此无法正确解析。您需要剥离时间或将其包含在格式模式中。有一个过载,ParseExact它接受格式格式数组,如果匹配任何格式,则将解析文本。
塞缪尔·内夫

7
@SamuelNeff CultureInfo.InvariantCulture如果您仍在定义一种格式,为什么不使用它而不是当前的格式?
Alvin Wong

3
@Toolkit原因是格式字符串中的斜杠不是文字斜杠。在当前区域性中,它们由日期分隔符字符串替换。因此,它确实取决于上面编写方式的文化。塞缪尔·内夫(Samuel Neff),请尝试Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");,它将破坏您的解决方案。要解决此问题,请使用"dd'/'MM'/'yyyy"(用单引号保护斜杠),或@"dd\/MM\/yyyy"(用斜杠“转义”斜杠)。
Jeppe Stig Nielsen

44

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

例如:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

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


2
@Slaks:在代码中没有CultureInfo.InvariantCulture。我是否需要使用一些命名空间
山塔努古普塔

3
using System.Globalization;
Slaks 2010年

2
您也可以右键单击错误,然后单击“解决”,这将为您放入缺少的名称空间。
Inkey

您还可以双击错误并看到一个向下箭头,显示您可以使用的相关命名空间
Usman Younas 2015年

空格也要计数,例如,如果您的字符串格式为“ MM / dd / yyyy HH:mm:ss”(请注意-2个空格)-那么您的ParseExact格式还必须包括空格
Chris Halcrow

20

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

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

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

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

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

当然,您不应该只是随机选择法国,还应该选择适合您需求的东西。

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


您的解决方案对我不起作用,它会显示类似“字符串未被识别为有效的DateTime”的错误。而我正在将以下输入日期:“ 13/06/17”传递给您的解决方案,但是它给出了error.Plz帮助我。
Ghanshyam Lakhani

16

尽管上述解决方案有效,但是您也可以使用以下内容修改webconfig文件...

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

参考:本地计算机上的日期时间格式与生产计算机上的日期时间格式不同


1
阿米特·飞利浦(Amit Philips),您保存了我的一天。.我尝试了所有可能的事情。这个小小的改变是可行的。谢谢。
RNH

1
阿米特,你确实是上帝的儿子。
愤怒的熊


4

花了很多时间后,我解决了问题

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

3

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

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)


2
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;
}

1

就像上面的人说的那样,您可以将其作为字符串参数发送,但必须具有以下格式:例如“ 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可以将其转换并放入数据库中。


0

您也可以使用

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

0

下面的代码为我工作:

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

命名空间

using System.Globalization;

-6

手动更改:

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

从2015年11月22日起,它将在2015年11月22日进行转换

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.