一直以来有一种感受,就是日期类这个东西是个神奇的东西。我觉得各编程语言中的日期类都不是面向为了肝大作业的学生设计的。
在Lab3里,我只是想朴素地设置一个日期,忽略时间,但却比较麻烦。尤其是在实验要求的三个App中的一个里使用了经典的基于毫秒的时间,出现了各种舍入bug。
感觉Java Calendar类相对比较友善。它其实相当于一个表,存了很多字段,比如YEAR,存的是年份;MONTH,存的是月份。很多情况下(尤其是对于这种学生实验)比那种只能存一个毫秒数的方法好用很多。
我用到了这么几个方法:
方法 | 功能 |
---|---|
Date getTime() | 返回一个Date类型的时间值 |
void set(int year, int month, int date) | 设定字段YEAR,MONTH,DAY_OF_MONTH |
void set(int field, int value) | 为指定的字段field设置给定值value |
int get(int field) | 得到指定字段的值 |
int compareTo(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0 |
void add(int field, int amount) | 为给定的日历字段 field 添加指定的时间量 amount |
这个Calendar把日期和时间都转化为字段和值。而且巧妙在,在修改某一个字段的值后,仍能够维持日历的合法性。比如将DAY_OF_MONTH搞成40,那么日期不会变成这个月的第40天,而会变成下个月的第10天。这样,对使用者来说,完全不需要考虑日期格式、闰年闰月之类的复杂问题,将维护日期简单化。
需要注意的是,Calendar中的有些字段的值是从0开始的,有些是从1开始的。我**猜测 **其大概的逻辑是,固定取值空间从0开始(比如DAY_OF_WEEK只可能有7个取值,那么就是0-6);而可能有变化的空间从1开始(比如每个月的天数都不一样,那么就从1开始,到30或者31或者28或者29结束,具体取决于是哪个月)。