zoukankan      html  css  js  c++  java
  • 日期 Date--ESBasic 可复用的.NET类库(02)

      1.缘起:

        同我们从DateTime中将时刻部分作为ShortTime抽离出来一样,我们将DateTime中的日期部分也抽离出来,以ESBasic.Date类来表示。

        比如,我们的报表系统是以“天”为单位来进行统计的,为了提高效率,我们会在每天凌晨将前一天的报表数据统计完毕,并存储到数据库中,一天的报表数据就对应数据库数据库中的一条记录,该记录以一个表示日期的整数而不是DateTime作为主键。比如主键值为20090501的表示这条记录对应的是200951日的报表数据。

    假设我想查询2009-05-012009-05-077天的报表数据,就没有必要传入2009-05-01 00:00:00 2009-05-07 23:59:59两个DateTime进去, 而只要传入两个Date类型的对象即可。

    相比于DateTime,使用Date来表示日期在语义上会更加清晰。

    DateTime的形象示意图如下:

    Year

    Month

    Day

     

     2.适用场合:

           任何只需要使用年月日来表示日期的场合。

    3.设计思想与实现

    Date的设计与实现都是相当简单的,其类图如下:
          
          Date
    实现了IComparable泛型接口,表示Date对象之间可以相互比较。Date所表示的日期的值越大,则Date就越大。

    Date提供一个接受DateTime类型的参数的构造函数,表示可以直接将一个DateTime转化为一个Date对象。

    Date标记为可序列化,表示可以通过Remoting进行远程传递Date对象。

          ToDateInteger方法用于将日期转化为一个整数,正如缘起中提到的,对一个表示200951日的Date对象调用ToDateInteger方法会返回整数20090501,这个整数与示例数据库中对应记录的主键是相等的。

         如果一个Date所代表的日期越大,则其ToDateInteger方法返回的整数也越大。基于这一点,如果要查询上述数据库中的某日期范围内的报表记录,直接对主键值进行between…and的范围查询即可。

           AddDays方法表示在现在的日期上加上一定的天数然后返回得到的新日期。如果自己手动来实现这个方法,则要考虑很多例外情况,比如大小月份、闰年的2月等等,所以我直接借助现成的DateTime来实现这个方法。

         另外,Date类还有几个静态方法:ConvertFromDateInteger方法的作用刚好与ToDateInteger方法相反,用于将一个整数转化为一个Date对象。ConvertToDateInteger方法可以更方便地将一个DateTime的日期部分直接转化为一个整数。

    4. 使用时的注意事项

    (1)Date所代表的日期是以“一天”为递增的,是连续的,但是其ToDateInteger方法返回的整数虽然也是递增的,却是不连续的。比如2009053120090601之间就差了70

    (2)Date有一个接受年、月、日三个整数的构造函数,该构造函数我没有手动去检测三个参数的合法性,而是借助了DateTime来做这件事情,如果三个参数的取值不合理,则会DateTime的构造会抛出异常。

            public Date(int y, int m, int d)
                : 
    this(new DateTime(y, m, d)) //借助DateTime来验证参数的合法性
            {
            }

    (3)Date类的Day属性的set方法,也是基于同(2)一样的考虑,借助DateTime来验证属性值的合法性。
     

    5.扩展

    我们可以将表示报表查询的起始日期的Date对象和表示结束日期的Date对象组合成一个ESBasic.DateScope对象,用于表示要查询的报表的日期范围。

    如果我们要判断某个日期是否在DateScope指定的日期范围内,可以调用DateScopeContains方法。

           DateScope对象之间很难进行比较大小,但是可以比较是否相等,所以DateScope实现了“==”操作符和覆盖的基类的Equals方法。

          
    注: ESBasic已经开源,点击这里下载源码。
       
    ESBasic开源前言

  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1554827.html
Copyright © 2011-2022 走看看