zoukankan      html  css  js  c++  java
  • 学习之路六:奇怪的DataTime转换以及格式化问题

      写这篇文章存属偶然,因为最近项目中总是会报同样的错误,我试图改了很多次还是没有对,今天仔细的看了一下,发现了一点蛛丝马迹!

      1.这是有关DateTime类型格式化以及转化的问题  

    1   Console.WriteLine("无格式化:"+DateTime.Now.AddMonths(1010).ToString());
    2   Console.WriteLine(string.Format("格式化了 → {0:yy-MM-dd}", DateTime.Now.AddMonths(1010)));
    3   string str = Convert.ToDateTime(string.Format("{0:yy-MM-dd}", DateTime.Now.AddMonths(1010))).ToString();
    4   Console.WriteLine("格式化了,但又转换了:"+str);

      调试结果让我惊讶了一下:  

      

      通过实验,终于找到了错误的根源所在!

      错误所在:①首先我先把时间进行了格式化输出!

             ②然后再把格式化的时间转换成DateTime类型!

             ③最后输出的结果不一致了,导致了程序出错了!

      解决办法:因此我需要丰富一下格式化的形式 → 改为“yyyy-MM-dd”,这样就能保证时间的一致性了,不会在转换过程中出现误差了!

      思考:这种错误是我不细心导致的,没有人不犯错,但是遇到错误能够及时解决并弄懂它就是好样的!

      2.追根溯源                   

        问题解决了,可心理还是有个疙瘩,为什么会默认在前面加上“19”呢,为什么不还原成我以前的时间!

        通过ILSpy工具单步调试,终于发现了这种现象出现的根源所在了!

        ①首先代码会检测你的年份是否是小于0,还是大于0且小于100,还是大于9999?

          如果小于100,就会自动帮你补全前面两位数字!

        ②方法调用步骤      

          I,

          II,

          III,找到下面调用方法的位置,点击查看        

             

           IIII,

           IV,

           IIV,因为TwoDigitYearMax是一个重写属性,所以必须使用调试技术才能看到真正调用的属性,不调试只能看到虚方法!        

             

        总结:到了这一步,源头已经找出来了,如果大家还想看可以继续点下去,我敢保证,方法的返回永远是2029! 


        ③总结规律

          为了发现当两位数的年份在什么范围的时候返回的是“1900”,还是“2000”,为此做了个小实验!

     1   public static void GetValue()
    2   {
    3     Console.WriteLine("-----------------求值--------------------");
    4     int count = 0;
    5     for (int i = 1; i < 100; i++)
    6     {
    7       count = (2029 / 100 - ((i > 2029 % 100) ? 1 : 0)) * 100;
    8       Console.WriteLine(count + "\t" + i);
    9     }
    10     //临界值为29,当你的年份后两位数是小于等于29的时候是不出现奇怪现象的,大于29后,系统会自动把年份设置为 → “19”+加你的后两位年份
    12   }

          从这个可以发现,当你的年份后两位数是小于29的时候是不出现什么异常现象的,当大于29的时候,代码会自动帮你补全变为 → 1900 + 你的后两位年份!

          最后:发现这个存属因为我的粗心大意,所以大家对待问题要仔细全面才好!
     

      3.常见的时间格式化方法              

        ①:固定参数格式说明:

        

    格式化字符

    属性/说明/日期格式

    D

    2012年2月29日

    d

    2012-2-29

    F

    2012年2月29日 15:02:04

    f

    2012年2月29日 15:02 (不带秒数)

    G

    2012-2-29 15:02:04

    g

    2012-2-29 15:02 (不带秒数)

    Y

    2012年2月

    y

    2012年2月    

        ②:自定义日期格式化模式:

          这种模式很严格必须区分大小写的!

    自定义格式化字符

    属性/说明/日期格式

    y,yy,yyy,yyyy

    年份

    M,MM,MMM,MMMM

    月份

    d,dd,ddd,dddd

    天数

    hh

    12小时制

    HH

    24小时制

    m,mm

    s,ss

    f,ff,fff,ffff,fffff,ffffff,fffffff

    秒的精确,一个f代表一个精度

               因此通过上面的各种格式可以组成更多的时间格式,千变万化,你也可以使用各种连接符号,把日期进行分割,如:“-”,“:”,“#”,“=”,“+”等等! 

         你也可以使用String.Format来代替ToString方法,格式还是一样的!

      4.两个时间比较方法                

        ①比较时间大小的实验   

               Public int DateTime.Compare(DateTime one,DateTime two)

               返回值:① 1 → 说明 one > two

                           ② -1 → 说明 one < two

                           ③ 0 → 说明 one = two


        ②计算两个时间差值的函数,返回时间差的绝对值      

     1      public static void Compare()
    2 {
    3 DateTime one = DateTime.Now.AddDays(1);
    4 DateTime two = DateTime.Now;
    19 TimeSpan oneSpan = new TimeSpan(one.Ticks);
    20 TimeSpan twoSpan = new TimeSpan(two.Ticks);
    21 TimeSpan threeSpan = oneSpan.Subtract(twoSpan).Duration();
    22 Console.WriteLine("天数-{0},小时-{1},分钟-{2},秒-{3}", threeSpan.Days, threeSpan.Hours, threeSpan.Minutes, threeSpan.Seconds);
    23 }

      最后:写代码也需要细心,菜鸟之言,希望园友多多指教!

  • 相关阅读:
    app令牌的一个token实现
    velocity分页模板
    js基础-表单验证和提交
    做项目中没经验遇到的各种问题
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    oracle创建用户
    oracle创建表相关
    pe创建激活administrator后消除问题,删除用户问题
    spring学习遇到的问题汇总
    .NET MVC自定义错误处理页面的方法
  • 原文地址:https://www.cnblogs.com/yangcaogui/p/2372024.html
Copyright © 2011-2022 走看看