2hutool 源码分析:DateUtil(时间工具类)- 常用的时间类型 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()
要 《一线大厂 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}对象
[](()源码分析一
/**
评论