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月的天数不一样,其他其实都一样,真的很想再抽象一层啊。。。。

  • 相关阅读:
    八月最后的一天
    Go语言系列一
    一个工具libre draw
    Linux启动eclipse报错找不到java环境解决方法
    P2P通讯初步实现
    C#中,当鼠标移动到控件上,动态显示提示内容 ToolTip
    在windows64位的系统上面操作操作excel程序出现异常
    office2007下载地址
    蜗牛算法
    利用vs自带工具分析程序性能
  • 原文地址:https://www.cnblogs.com/wolfworker/p/7647283.html
Copyright © 2011-2022 走看看