2hutool源码分析:DateUtil(时间工具类)-常用的时间类型Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)转换

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

===================================================================

知其然,知其所以然

项目引用

=================================================================

此博文的依据:hutool-5.6.5版本源码

cn.hutool

hutool-core

5.6.5

方法名称:DateUtil.date(java.util.Date)

===============================================================================================

方法描述


{@link Date}类型时间转为{@link DateTime}

如果date本身为DateTime对象,则返回强转后的对象,否则新建一个DateTime对象

源码分析一


/**

  • {@link Date}类型时间转为{@link DateTime}

  • 如果date本身为DateTime对象,则返回强转后的对象,否则新建一个DateTime对象

  • @param date Long类型Date(Unix时间戳)

  • @return 时间对象

  • @since 3.0.7

*/

public static DateTime date(Date date) {

if (date instanceof DateTime) {

return (DateTime) date;

}

return dateNew(date);

}

判断传入的date是否是DateTime类型,如果是,直接转换成DateTime对象

如果不是,则执行DateUtil.dateNew((date)

方法名称:DateUtil.DateUtil.dateNew(java.util.Date)

===========================================================================================================

方法描述


根据已有{@link Date} 产生新的{@link DateTime}对象

源码分析一


/**

  • 根据已有{@link Date} 产生新的{@link DateTime}对象

  • @param date Date对象

  • @return {@link DateTime}对象

  • @since 4.3.1

*/

public static DateTime dateNew(Date date) {

return new DateTime(date);

}


//DateTime 类

/**

  • 给定日期的构造

  • @param date 日期

*/

public DateTime(Date date) {

this(

date,//

(date instanceof DateTime) ? ((DateTime) date).timeZone : TimeZone.getDefault()

);

}

代码里写了一个多目运算,(date instanceof DateTime) ? ((DateTime) date).timeZone : TimeZone.getDefault()

传入的date是否是DateTime类型,如果是,直接取DateTime对象的时区,如果不是,取系统默认时区。

然后调用这个方法DateTime(Date date, TimeZone timeZone)

//DateTime 类

/**

  • 给定日期的构造

  • @param date 日期

  • @param timeZone 时区

  • @since 4.1.2

*/

public DateTime(Date date, TimeZone timeZone) {

this(ObjectUtil.defaultIfNull(date, new Date()).getTime(), timeZone);

}

ObjectUtil.defaultIfNull(date, new Date()).getTime()

要拆成2个调用

1、ObjectUtil.defaultIfNull(date, new Date())

2、Date.getTime()

ObjectUtil.defaultIfNull是Hutool封装的一个工具类,用来判断数据对象是否为null,如果是,返回默认值

源码如下

/**

  • 如果给定对象为{@code null}返回默认值

  • ObjectUtil.defaultIfNull(null, null) = null

  • ObjectUtil.defaultIfNull(null, “”) = “”

  • ObjectUtil.defaultIfNull(null, “zz”) = “zz”

  • ObjectUtil.defaultIfNull(“abc”, *) = “abc”

  • ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE

  • @param 对象类型

  • @param object 被检查对象,可能为{@code null}

  • @param defaultValue 被检查对象为{@code null}返回的默认值,可以为{@code null}

  • @return 被检查对象为{@code null}返回默认值,否则返回原值

  • @since 3.0.7

*/

public static T defaultIfNull(final T object, final T defaultValue) {

return (null != object) ? object : defaultValue;

}

最后会调用这个方法

/**

  • 给定日期毫秒数的构造

  • @param timeMillis 日期毫秒数

  • @param timeZone 时区

  • @since 4.1.2

*/

public DateTime(long timeMillis, TimeZone timeZone) {

super(timeMillis);

this.timeZone = ObjectUtil.defaultIfNull(timeZone, TimeZone.getDefault());

}

从**DateTime(long timeMillis, TimeZone timeZone)中源码中,可看出,在Date(long date)**基础上,多加了timeZone的赋值。

image-20210706213821993

方法名称:DateUtil.DateUtil.date(long)

==============================================================================================

方法描述


Long类型时间转为{@link DateTime}

只支持毫秒级别时间戳,如果需要秒级别时间戳,请自行×1000

源码分析一


/**

  • Long类型时间转为{@link DateTime}

  • 只支持毫秒级别时间戳,如果需要秒级别时间戳,请自行×1000

  • @param date Long类型Date(Unix时间戳)

  • @return 时间对象

*/

public static DateTime date(long date) {

return new DateTime(date);

}


/**

  • 给定日期毫秒数的构造

  • @param timeMillis 日期毫秒数

  • @since 4.1.2

*/

public DateTime(long timeMillis) {

this(timeMillis, TimeZone.getDefault());

}

从**DateTime(long timeMillis, TimeZone timeZone)中源码中,可看出,在Date(long date)**基础上,多加了timeZone的赋值。

image-20210706213821993

方法名称:DateUtil.DateUtil.date(java.util.Calendar)

============================================================================================================

方法描述


{@link Calendar}类型时间转为{@link DateTime}

始终根据已有{@link Calendar} 产生新的{@link DateTime}对象

源码分析一


/**

  • {@link Calendar}类型时间转为{@link DateTime}

  • 始终根据已有{@link Calendar} 产生新的{@link DateTime}对象

  • @param calendar {@link Calendar}

  • @return 时间对象

*/

public static DateTime date(Calendar calendar) {

return new DateTime(calendar);

}


//DateTime类

/**

  • 给定日期的构造

  • @param calendar {@link Calendar}

*/

public DateTime(Calendar calendar) {

this(calendar.getTime(), calendar.getTimeZone());

this.setFirstDayOfWeek(Week.of(calendar.getFirstDayOfWeek()));

}

**this(calendar.getTime(), calendar.getTimeZone());**就是调用 DateTime(Date date, TimeZone timeZone)

this.setFirstDayOfWeek(Week.of(calendar.getFirstDayOfWeek()));

实际上是调用了三个步骤:

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

15788529095)]

[外链图片转存中…(img-VhUjEVwZ-1715788529095)]

[外链图片转存中…(img-yiIuTLH5-1715788529096)]

[外链图片转存中…(img-3IstenxW-1715788529096)]

[外链图片转存中…(img-IxZe8byQ-1715788529096)]

[外链图片转存中…(img-N3yat0JL-1715788529097)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-3RqzkCbf-1715788529097)]

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值