Java 原生的日期时间类 Date 有很多体验不好的地方,比如里面的年份字段存的是距离 1900 年的年数,月份字段用 0~11 代表 1~12 月,用里面的 getYear(), getMonth() 等得到的都不是我们想要的结果,还要再进行额外的处理(setter 同理。这也是为什么这些方法在 JDK 1.1 之后马上就被标注为废弃的原因。)后来的 Calendar 类虽然有所改良,但为什么唯独留着那个月份字段不改,仍然是用 0~11 来存储,我百思不得其解。
好在还有一个 DateFormat 类算是比较友好的,日期字符串里的各个部分都是自然数,直接就能转换为 Date 对象,没有年 + 1900,月 + 1 这样的顾虑。那么我们现在就结合 Date 和 DateFormat 这两个类做一个日期工具类 DateTools 和日期工厂类 DateFactory,用于完善原生 Date 类。
首先我们来设计 DateFactory 工厂类,提供一些方法用于创建一个 Date 对象。先设计一个简单的方法:
public class DateFactory {
private static final DateFormat DATE_FORMAT;
private static final String STR_FORMAT;
static {
DATE_FORMAT = new SimpleDateFormat("yyyy-M-d H:m:s", Locale.CHINA);
STR_FORMAT = "%d-%d-%d %d:%d:%d";
} // static
public static Date create(int y, int m, int d, int h, int min, int sec) {
String dateString = String.format(STR_FORMAT, y, m, d, h, min, sec);
try {
return DATE_FORMAT.parse(dateString);
} // try
catch (ParseException e) {
throw new RuntimeException(e.toString());
} // catch (ParseException e)
} // create(int * 6)
} // DateFactory Class
在这个工厂方法里,我们将传入的年、月、日、时、分、秒组织起来,并按照【%d-%d-%d %d:%d:%d】的格式转化成日期字符串,这个字符串格式和【yyyy-M-d H:m:s】的日期格式是完全一致的。然后我们调用 DateFormat 类的 parse 方法,将日期字符串转换为 Date 对象并返回。
这个方法要求提供精确到秒的时间。我们还可以再创建精确到分或者小时的工厂方法:
public class DateFactory {
// 省略已有代码
// 精确到分钟
public static Date create(int y, int m, int d, int h, int min) {
return create(y, m, d, h, min, 0);
} // create(int * 5)
// 精确到小时
public static Date create(int y, int m, int d, int h) {
return create(y, m, d, h, 0, 0);
} // create(int * 4)
} // DateFactory Class
现在,假如我们要创建一个时间为 2019 年 3 月 1 日 18 点 30 分的 Date 对象,我们就可以执行下面这条语句来创建了:
Date date = DateFact