/**

  • 给定日期的构造

  • @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}返回默认值

  • 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的赋值。

[](()方法名称: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的赋值。

[](()方法名称: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()));

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

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

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

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

/**

  • 设置一周的第一天

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

  • 设置一周的第一天主要影响{@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}

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

[](()源码分析一


/**