1.使用Convert.ToDateTime()方法,用法如下:
string str = "2017-08-10";
DateTime dt= Convert.ToDateTime(str);
不过Convert.ToDateTime()方法,只能解释系统能识别的格式的字符串,如:
2017-08-10 08/10/2017 2017/08/10,
如果是其他格式的字符串,如:20101212 是无法转换的
2.使用DateTime.Parse()方法
try{
DateTime dt= DateTime.Parse("2017-08-10");
}catch(FormatException fe)
{
MessageBox.Show(fe.Message);
}
由于try-catch块占用更多行空间,为了使代码更简洁,所以微软增加了DataTime.TryParse()方法,该方法需要一个DateTime类型变量作为输出参数:
DateTime dt;if (DateTime.TryParse("20170810", outdt))
{
MessageBox.Show(dt.ToString("yyyy-MM-dd"));
}else{
MessageBox.Show("Something is Wrong");
}
和Convert.ToDateTime()方法一样,不管是Parse()还是TryParse()都只能转换系统能识别的格式
3.为了能将特定格式的字符串转化为DateTime类型,可以使用DateTime.ParseExact() ----- Exact 精确的
try{
DateTime dt= DateTime.ParseExact("20170810", "yyyyMMdd", CultureInfo.CurrentCulture);
}catch(FormatException fe)
{
MessageBox.Show(fe.Message);
}
注意:ParseExact()方法,必须指定将要解释的字符串日期的格式,如上述的"yyyyMMdd"。
和Parse()对应的TryParse()一样,ParseExact()也有TryParseExact()方法,而且作用也是一样
yyyy/MM/dd和yyyy/M/d的区别:
yyyy/MM/dd 只能匹配 2017/12/01这种格式,2017/12/1则无法解释;要求更严格
yyyy/M/d 则技能匹配 2017/12/12,2017/12/01,也能匹配2017/12/1;匹配范围更大,当月和日不足两位时,既可以带0也可以不带
由于最终处理日期使用的是System.Globalization.Calendar类,所以不仅要格式满足,还需要是有效的日期,如:2017/99/99就是无效的
4.通过Reflector查看.net的源代码:
Parse()和ParseExact()方法都有3个重载,继续深入:
前面两个Parse()方法,底层都是直接调用有3个参数的Parse(),而这个Parse()方法的底层又去调用了TryParse():
同理 ParseExact()方法的底层原理一样
所以不管调用Parse()是TryParse(),底层的处理是一样的。
5.日期转换会与区域相关,所以需要考虑CultureInfo
CultureInfo类提供特定区域的书写系统,日历、字符串、日期和数字的格式化,所以使用不同的CultureInfo输出的结果可能会不一样
例如,在全球各地都有客户端,而服务器在美国,每一台客户端发送回服务器的日期如果不做任何处理的话,则会出现各种各样格式的日期,
所以为了不受区域的影响,可以使用 CultureInfo.InvariantCulture 属性 (---- Invariant 不变的)
注意:
CultureInfo.InvariantCulture关联的是英语语言,但与国家区域无关;
以上说的ToDateTime()、Parse()、TryParse()、ParseExact()、TryParseExact()都能接受一个CultureInfo类型的参数,
所以只要设置了CultureInfo.InvariantCulture,即使通过控制面板修改日期和时间的格式,都不会影响到转换的结果
对应的代码如下:
ToDateTime():
string str = "2017-08-10";
DateTime dt= Convert.ToDateTime(str, CultureInfo.InvariantCulture);
Parse():
DateTime dt = DateTime.Parse("2017-08-10", CultureInfo.InvariantCulture);
TryParse():
if (DateTime.TryParse("20170810", CultureInfo.InvariantCulture, DateTimeStyles.None, outdt))
{
}
ParseExact():
DateTime dt = DateTime.ParseExact("20170810", "yyyyMMdd", CultureInfo.InvariantCulture);
TryParseExact():
if (DateTime.TryParseExact("20170810", "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, outdt))
{ }
6.总结
如果是将标准的字符串转化为DateTime,直接使用Convert.ToDateTime() 或者 DateTime.Parse()即可;
如果是将比较奇怪格式的字符串转换为DateTime,或者只运行某种格式的字符串时,就是用DateTime.ParseExact 和 DateTime.TryParseExact();
如果不想代码中出现try--catch块的,就使用TryParse()或TryParseExact().
如果需要不受区域影响,则加上CultureInfo.InvariantCulture。