C#将字符串转换为⽇期
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", out dt))
{
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查看的源代码:
Parse()和ParseExact()⽅法都有3个重载,继续深⼊:
前⾯两个Parse()⽅法,底层都是直接调⽤有3个参数的Parse(),⽽这个Parse()⽅法的底层⼜去调⽤了TryParse():
同理 ParseExact()⽅法的底层原理⼀样
所以不管调⽤Parse()是TryParse(),底层的处理是⼀样的。
5.⽇期转换会与区域相关,所以需要考虑CultureInfo
提供特定区域的书写系统,⽇历、字符串、⽇期和数字的格式化,所以使⽤不同的CultureInfo输出的结果可能会不⼀样
例如,在全球各地都有客户端,⽽服务器在美国,每⼀台客户端发送回服务器的⽇期如果不做任何处理的话,则会出现各种各样格式的⽇期,
所以为了不受区域的影响,可以使⽤ CultureInfo.InvariantCulture 属性(---- Invariant 不变的)
注意:
CultureInfo.InvariantCulture关联的是英语语⾔,但与国家区域⽆关;
以上说的ToDateTime()、Parse()、TryParse()、ParseExact()、TryParseExact()都能接受⼀个CultureInf
o类型的参数,所以只要设置了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, out dt))
{
}
ParseExact():
DateTime dt = DateTime.ParseExact("20170810", "yyyyMMdd", CultureInfo.InvariantCulture);
TryParseExact():
if (DateTime.TryParseExact("20170810", "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{ }
6.总结字符串截取日期
如果是将标准的字符串转化为DateTime,直接使⽤Convert.ToDateTime() 或者 DateTime.Parse()即可;
如果是将⽐较奇怪格式的字符串转换为DateTime,或者只运⾏某种格式的字符串时,就是⽤DateTime.ParseExact 和DateTime.TryParseExact();
如果不想代码中出现try--catch块的,就使⽤TryParse()或TryParseExact().
如果需要不受区域影响,则加上CultureInfo.InvariantCulture。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论