日期时间格式不正确,无法识别为有效的DateTime类型。格式应为dd/MM/yyyy。

218

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

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

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

问题是什么? 它有一个第二个重载,要求使用 IFormatProvider。这是什么?需要传递这个吗?如果需要,如何在这种情况下使用?

编辑

ParseParseExact 之间有什么区别?

编辑2

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

考虑到类型安全、性能或其他你觉得重要的方面,哪个答案更好呢?


7
这就是文档的作用所在。http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx - SLaks
2
ParseExact 用于当您知道日期字符串的确切格式时,而 Parse 则用于当您需要处理更动态的内容。 - gingerbreadboy
13个回答

313

使用 DateTime.ParseExact 方法。

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

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

19
为什么我们必须在这里传递 null? - Shantanu Gupta
3
输入可以是“22/11/2009 12:00:00 AM”或“22/11/2009”。开发机器的文化可能与生产的文化不同。那么上述代码能否无缝运行? - Rahatur
10
@Rahat,如果格式不匹配,精确解析将无法正常工作。上面的格式模式是“dd/MM/yyyy”,因此带有时间的文本字符串将无法正确解析。您需要剥离时间或将其包含在格式模式中。ParseExact有一种重载形式,接受一个格式模式数组,如果文本与任何格式模式匹配,则会解析它。 - Samuel Neff
8
如果您已经定义了格式,为什么不使用CultureInfo.InvariantCulture而不是当前的格式呢? - Alvin Wong
3
@Toolkit的原因是格式字符串中的斜杠不是字面上的斜杆。它们会被当前文化中的日期分隔符字符串替换。因此,它确实取决于写成上面那样的文化方式。如果尝试 Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");,它将破坏你的解决方案。为了修复这个问题,请使用"dd'/'MM'/'yyyy"(用单引号保护斜杠)或@"dd\/MM\/yyyy"(使用反斜杠转义)。 - Jeppe Stig Nielsen
显示剩余8条评论

56
你需要调用ParseExact方法,它可以解析与你提供的特定格式完全匹配的日期。
例如:
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
IFormatProvider参数指定用于解析日期的文化。除非您的字符串来自用户,否则应传递CultureInfo.InvariantCulture。如果该字符串来自用户,则应传递CultureInfo.CurrentCulture,它将使用用户在控制面板中的区域选项中指定的设置。

2
@Slaks:在代码中没有InvariantCulture可用。我需要使用某个名称空间吗? - Shantanu Gupta
3
使用 System.Globalization; - SLaks
2
您还可以右键单击错误并单击“解决”,这将为您添加丢失的命名空间。 - Inkey
空格也要计算在内。例如,如果您的字符串格式为“MM/dd/yyyy HH:mm:ss”(注意-有2个空格),那么ParseExact的格式也必须包括这些空格。 - Chris Halcrow
@SLaks 您的解决方案对我无效,它给出了以下错误:“字符串未被识别为有效的 DateTime。” 我正在向您的解决方案传递以下输入日期:“13/06/17”,但它仍然报错。请帮帮我。 - Ghanshyam Lakhani
显示剩余2条评论

23

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

例如,字符串"22/11/2009"不符合美国(英语)的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”,但它会出现错误。请帮助我。 - Ghanshyam Lakhani

18

1
Amit Philips,你救了我的一天...我尝试了所有可能的方法。而这个小改变起了作用。谢谢。 - RNH
3
阿密特,你真的是上帝的儿子。 - The Furious Bear

13

你可能需要为特定的日期格式指定区域性,例如:

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

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

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

详情请查看此处:

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


8

根据这个参考文献,下面的方法对我管用:

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

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

5

花费了很多时间,我解决了这个问题。

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

2
对我来说完美运作,我认为这是最佳答案,因为它可以处理同时包含日期、时间和时区文本的数据,这意味着如果它处理用户输入的数据,它可以处理各种格式。 - Dean
"PreocessDate()是什么?" - B. Clay Shannon-B. Crow Raven

4

使用以下代码将字符串转换为日期时间:

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

1

Worked for me below code:

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

命名空间

using System.Globalization;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接