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查看.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, 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。

posted @ 2017-08-10 14:43  一菲聪天  阅读(11326)  评论(0)    收藏  举报