zoukankan      html  css  js  c++  java
  • .NET DateTime 源码学习

    今天下载了微软.Net 源码,看了一下DateTime类,做下记录

    DaysInMonth 这个方法是获取某年某月的天数,平时直接用觉得很简单,今天看到源码,发现设计的还是很好的

    我想如果是我的话,封装这个方法应该会根据每个月固定天数,直接一个switch就完了;

    但是看看微软是怎么做的

            public static int DaysInMonth(int year, int month) {
                if (month < 1 || month > 12)
                    throw new ArgumentOutOfRangeException("month", Environment.GetResourceString("ArgumentOutOfRange_Month"));
                Contract.EndContractBlock();
                // IsLeapYear checks the year argument
                int[] days = IsLeapYear(year)? DaysToMonth366: DaysToMonth365;
                return days[month] - days[month - 1];
            }
    View Code

    1:参数错误,抛出异常;

    2:判断是否是闰年,闰年的话用闰年的方式计算,反之用平年;

    3:有趣的是DaysToMonth366和DaysToMonth365,这两个变量是什么呢?

            private static readonly int[] DaysToMonth365 = {
                0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
            private static readonly int[] DaysToMonth366 = {
                0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
    View Code

    可以看到,DaysToMonth366是闰年从第一个月到当前月的天数之和, DaysToMonth365是平年从第一个月到当前月的天数之和

    为什么要这样设计呢?我开始也不明白,后来想明白了

    如果仅仅是针对DaysInMonth这个方法 这样设计是大材小用,完全可以把每个月的天数单独放进数组里,而不用存天数之和这种方式,之所以这样做,是因为还有很多其他方法会频繁的用到天数之和之类的操作,比如从3月到5月多少天,就很方便取得结果,而单独一个月的天数也可用使用相减的操作来方便获得;

    不过对于强迫症来说,DaysToMonth366和DaysToMonth365 这两个数组中只有2月的天数不一样,其他其实都一样,真的很想再抽象一层啊。。。。

  • 相关阅读:
    C#截取字符串的方法小结
    使用苏飞httphelper开发自动更新发布文章程序
    公务员“上班睡觉”为何会被强势围观?
    透明代理和匿名代理的区别
    Linux基础命令---ipcalc计算IP
    Linux基础命令---apwatch
    Linux基础命令---arping
    Linux基础命令---arp
    Linux基础命令---ifdown、ifup
    Linux基础命令---ifconfig
  • 原文地址:https://www.cnblogs.com/wolfworker/p/7647283.html
Copyright © 2011-2022 走看看