Java 中设计日期工具类 DateTools 和日期工厂类 DateFactory 完善饱受诟病的原生 Date 类

该博客针对Java原生Date类存在的问题,如年份、月份字段不合理,提供了自定义日期工具类DateTools和工厂类DateFactory。DateFactory通过工厂方法创建Date对象,简化日期时间处理,而DateTools提供了获取Date对象字段值的方法,避免了年+1900、月+1的转换。此外,还讨论了Builder模式在调整Date对象字段时的效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值