写点什么

2hutool 源码分析:DateUtil(时间工具类)- 常用的时间类型 Date,DateTime

  • 2022 年 4 月 29 日
  • 本文字数:2329 字

    阅读完需:约 8 分钟

/**


  • 给定日期的构造

  • @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()


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 拆成 2 个调用


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


2、Date.getTime()


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


源码如下


/**


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

  • <pre>

  • ObjectUtil.defaultIfNull(null, null) = null

  • ObjectUtil.defaultIfNull(null, "") = ""

  • ObjectUtil.defaultIfNull(null, "zz") = "zz"

  • ObjectUtil.defaultIfNull("abc", *) = "abc"

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

  • </pre>

  • @param <T> 对象类型

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

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

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

  • @since 3.0.7


*/


public static <T> 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 的赋值。



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


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


[](()方法描述




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


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


[](()源码分析一




/**


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

  • 只支持毫秒级别时间戳,如果需要秒级别时间戳,请自行×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 的赋值。



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


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


[](()方法描述




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


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


[](()源码分析一




/**


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

  • 始终根据已有{@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()));


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


1、calendar.getFirstDayOfWeek() 获取 calendarWeekIntValue(一周的第一天)


2、Week.of(calendar.getFirstDayOfWeek()) -->Week of(int calendarWeekIntValue) 获取星期对应的枚举值



3、this.setFirstDayOfWeek(Week.of(calendar.getFirstDayOfWeek())) -->setFirstDayOfWeek(Week firstDayOfWeek) 给 DateTime 对象设置一周的第一天参数的值。


/**


  • 设置一周的第一天<br>

  • JDK 的 Calendar 中默认一周的第一天是周日,Hutool 中将此默认值设置为周一<br>

  • 设置一周的第一天主要影响{@link #weekOfMonth()}和{@link #weekOfYear()} 两个方法

  • @param firstDayOfWeek 一周的第一天

  • @return this

  • @see #weekOfMonth()

  • @see #weekOfYear()


*/


public DateTime setFirstDayOfWeek(Week firstDayOfWeek) {


this.firstDayOfWeek = firstDayOfWeek;


return this;


}


[](()方法名称:DateUtil.DateUtil.date(java.time.temporal.TemporalAccessor)


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


[](()方法描述




{@link TemporalAccessor}类型时间转为{@link DateTime}<br>


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


[](()源码分析一




/**

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
2hutool源码分析:DateUtil(时间工具类)-常用的时间类型Date,DateTime_Java_爱好编程进阶_InfoQ写作社区