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

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

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


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

编辑

ParseParseExact有什么区别?

编辑2

Slaks和Sam的答案都对我有用,当前用户正在提供输入,但是我可以通过使用maskTextbox保证它们是有效的。安全类型,性能或您感觉类似的方面

评论

@Edit:这就是文档的用途。 msdn.microsoft.com/zh-CN/library/w2sa9yss.aspx

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

#1 楼

使用DateTime.ParseExact

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

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


评论


为什么我们必须在此处传递null?

– Shantannu Gupta
2010-2-3在15:29

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

–拉赫塔尔
2012年2月24日在9:11

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

–塞缪尔·内夫(Samuel Neff)
2012-2-27在2:22

@SamuelNeff如果您仍在定义格式,为什么不使用CultureInfo.InvariantCulture而不是当前的格式呢?

–黄永Al
13年3月25日在16:51

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

–杰普·斯蒂格·尼尔森(Jeppe Stig Nielsen)
15年7月27日在8:51

#2 楼

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

例如:

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


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

评论


@Slaks:在代码中没有CultureInfo.InvariantCulture。我需要使用一些名称空间吗

– Shantannu Gupta
2010-2-3在15:31



使用System.Globalization;

–SL
2010-2-3在15:32



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

– Inkey
2014年1月8日在16:36



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

–Usman Younas
2015年4月14日在7:17

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

–克里斯·哈克罗(Chris Halcrow)
17年7月4日在6:39

#3 楼

解析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") );


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

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

评论


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

– Ghanshyam Lakhani
17年7月17日在7:32

#4 楼

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

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


Ref:与生产计算机相比,本地计算机上的日期时间格式

评论


阿米特·飞利浦(Amit Philips),您保存了我的一天。这个小小的改变是可行的。谢谢。

– RNH
13年7月26日在6:20

阿米特,你确实是上帝的儿子。

–愤怒的熊
2015年3月2日,12:21

#5 楼

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

    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/zh-CN/library/5hh873ya.aspx

#6 楼

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

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


评论


对我来说效果很好,我认为这是最好的答案,因为它可以同时处理带有日期和时区文本的日期,这意味着,如果其处理用户输入的数据,则可以处理各种格式

–院长
8月13日15:43

#7 楼

根据此参考,下一种方法对我有用:

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


#8 楼

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

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


#9 楼

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


#10 楼

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

#11 楼

您也可以使用

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


#12 楼

在下面的代码中为我工作:

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


命名空间

using System.Globalization;


#13 楼

手动更改:

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


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