string未被识别为有效的date时间“格式dd / MM / yyyy”
我试图将我的string格式的值转换为格式dd/MM/yyyy
datetypes。
this.Text="22/11/2009"; DateTime date = DateTime.Parse(this.Text);
问题是什么 ? 它有一个要求IFormatProvider
的第二个覆盖。 这是什么? 我还需要通过这个吗? 如果是的话,如何使用它呢?
编辑
Parse
和ParseExact
什么区别?
编辑2
Slaks和Sam的答案都在为我工作,目前用户正在给input,但这将由我确定,他们是有效的,通过使用maskTextbox。
考虑到types安全,性能或者你喜欢的东西等方面,哪个答案更好
使用DateTime.ParseExact
。
this.Text="22/11/2009"; DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
您需要调用ParseExact
, ParseExact
parsing与您提供的格式完全匹配的date。
例如:
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
IFormatProvider
参数指定用于parsingdate的IFormatProvider
。
除非你的string来自用户,你应该通过CultureInfo.InvariantCulture
。
如果string确实来自用户,则应传递CultureInfo.CurrentCulture
,它将使用用户在“控制面板”中的“区域选项”中指定的设置。
parsingdate时间的string表示是一件棘手的事情,因为不同的文化有不同的date格式。 .net知道这些date格式,并从当前的文化( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat
),当您调用DateTime.Parse(this.Text)
;
例如,string“22/11/2009”与美国(en-US)的ShortDatePattern不匹配,但与法国(fr-FR)匹配。
现在,您可以调用DateTime.ParseExact
并传入您期望的确切格式string,也可以将适当的文化传递给DateTime.Parse
以parsingdate。
例如,这将正确parsing你的date:
DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );
当然,你不应该随便select法国,而是适合你的需求。
你需要弄清楚什么是System.Threading.Thread.CurrentThread.CurrentCulture
设置,如果/为什么它不同于你的期望。
虽然上面的解决scheme是有效的,你也可以用下面的方法修改webconfig文件…
<configuration> <system.web> <globalization culture="en-GB"/> </system.web> </configuration>
参考: 与生产机器相比,本地机器上的date时间格式不同
您可能需要指定该特定date格式的文化,如下所示:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy this.Text="22/11/2009"; DateTime date = DateTime.Parse(this.Text);
欲了解更多细节,请点击
用这个将string转换为datetime:
Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
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参数发送,但是它必须有这样的格式:例如“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可以将其转换并放入您的数据库中。
花了很多时间后,我已经解决了这个问题
string strDate = PreocessDate(data); string[] dateString = strDate.Split('/'); DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
基于这个参考 ,下一个方法为我工作:
// eg format = "dd/MM/yyyy", dateString = "10/07/2017" var formatInfo = new DateTimeFormatInfo() { ShortDatePattern = format }; date = Convert.ToDateTime(dateString, formatInfo);
你也可以用
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
代码如下:
DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));
命名空间
using System.Globalization;
手动更改:
string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);
2015年11月22日起,酒店将在22/11/2015进行改build