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

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

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

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

关联文章:

hutool实战(带你掌握里面的各种工具)目录

2hutool实战:DateUtil-常用的时间类型转换


源码分析目的

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

知其然,知其所以然

项目引用

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

此博文的依据: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()));

}

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

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

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

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

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

}

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

[外链图片转存中…(img-dFalV9rM-1715788495437)]

[外链图片转存中…(img-z2ILZ3LR-1715788495437)]

[外链图片转存中…(img-PJl8UpFP-1715788495438)]

更多笔记分享

[外链图片转存中…(img-q3YlVq51-1715788495438)]

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

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

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值