JDK之Date源码解析

刚入java不久的程序猿,对于简单的使用已毫不满足,最终为了一探究竟,翻开了JDK的源码,以下观点为自己的理解及看了多篇博客的总结,欢迎各位大神指出不对的地方,当然也欢迎和我一样刚学的同学,一起加油努力吧~~

Date简单的学习

今天看了一下Date的源码这里就讲一下我们常用的2个Date方法,其他的方法很多都被划伤横线,可能几个版本后就过期了,这里也不做赘述了,下面上源码

    //long类型的时间
    private transient long fastTime;

    public Date() {
        this(System.currentTimeMillis());
    }

    public Date(long date) {
        fastTime = date;
    }

这应该是用的比较多的构造方法了,先来说说Date()方法,每当我们new Date()的时候,其实是调用了重载的Date(long date)方法,传入的参数System.currentTimeMillis(),获取了当前系统时间并将值赋予fastTime,接下来我们看一下getTime这个方法

    public long getTime() {
        return getTimeImpl();
    }

    private final long getTimeImpl() {
        if (cdate != null && !cdate.isNormalized()) {
            normalize();
        }
        return fastTime;
    }

我们可以看到,最终getTime返回值是fastTime,也就是说是一个long类型的时间,在工作中发现有很多人习惯使用new Date().getTime()获取当前的毫秒数,这无疑是造成了浪费,看到这里我相信已经有人知道该怎么获取了。对,就是直接使用System.currentTimeMillis()方法获取当前毫秒数,好了Date的解读就到这了,最后附上当时一个小伙伴的疑问,为何long类型的打印出来是时间格式呢?好吧,毕竟对于像我们这样的新手还是会觉得很奇怪,下面附上原因

    public String toString() {
        // "EEE MMM dd HH:mm:ss zzz yyyy";
        BaseCalendar.Date date = normalize();
        StringBuilder sb = new StringBuilder(28);
        int index = date.getDayOfWeek();
        if (index == gcal.SUNDAY) {
            index = 8;
        }
        convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
        TimeZone zi = date.getZone();
        if (zi != null) {
            sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
        } else {
            sb.append("GMT");
        }
        sb.append(' ').append(date.getYear());  // yyyy
        return sb.toString();
    }

没错,toString方法被重写了,打印时会调用这个方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值