3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容
Posted 小虚竹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容相关的知识,希望对你有一定的参考价值。
技术活,该赏
关注+一键三连(点赞,评论,收藏)再看,养成好习惯
看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:
关联文章:
源码分析目的
知其然,知其所以然
项目引用
此博文的依据:hutool-5.6.5版本源码
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.6.5</version>
</dependency>
方法名称:DateUtil.year(java.util.Date)
方法描述
源码分析一
/**
* 获得年的部分
*
* @param date 日期
* @return 年的部分
*/
public static int year(Date date) {
return DateTime.of(date).year();
}
源码的**DateTime.of(date).year()**可拆解成两部分
- DateTime.of(date)
- DateTime.year()
/**
* 转换JDK date为 DateTime
*
* @param date JDK Date
* @return DateTime
*/
public static DateTime of(Date date) {
if (date instanceof DateTime) {
return (DateTime) date;
}
return new DateTime(date);
}
第二部分,
/**
* 获得年的部分
*
* @return 年的部分
*/
public int year() {
return getField(DateField.YEAR);
}
/**
* 获得日期的某个部分<br>
* 例如获得年的部分,则使用 getField(DatePart.YEAR)
*
* @param field 表示日期的哪个部分的枚举 {@link DateField}
* @return 某个部分的值
*/
public int getField(DateField field) {
return getField(field.getValue());
}
/**
* 获得日期的某个部分<br>
* 例如获得年的部分,则使用 getField(Calendar.YEAR)
*
* @param field 表示日期的哪个部分的int值 {@link Calendar}
* @return 某个部分的值
*/
public int getField(int field) {
return toCalendar().get(field);
}
从代码跟下来,可以发现会走到toCalendar().get(field)
/**
* 转换为Calendar, 默认 {@link Locale}
*
* @return {@link Calendar}
*/
public Calendar toCalendar() {
return toCalendar(Locale.getDefault(Locale.Category.FORMAT));
}
**toCalendar()**会得到Calendar,这会就好理解可以获取年了。
不止可以获取年,还可以获取年,月,日,时,分,秒。详细介绍可以看这里:万字博文教你搞懂java源码的日期和时间相关用法
方法名称:DateUtil.quarter(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期所属季度,从1开始计数
*
* @param date 日期
* @return 第几个季度
* @since 4.1.0
*/
public static int quarter(Date date) {
return DateTime.of(date).quarter();
}
源码的**DateTime.of(date).quarter()**可拆解成两部分
- DateTime.of(date)
- DateTime.quarter()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,month()获取DateTime对应的月份,然后再做了一个简单计算。
/**
* 获得当前日期所属季度,从1开始计数<br>
*
* @return 第几个季度 {@link Quarter}
*/
public int quarter() {
return month() / 3 + 1;
}
/**
* 获得月份,从0开始计数
*
* @return 月份
*/
public int month() {
return getField(DateField.MONTH);
}
/**
* 获得日期的某个部分<br>
* 例如获得年的部分,则使用 getField(DatePart.YEAR)
*
* @param field 表示日期的哪个部分的枚举 {@link DateField}
* @return 某个部分的值
*/
public int getField(DateField field) {
return getField(field.getValue());
}
getField方法上面有介绍了,这里就不水字了。
方法名称:DateUtil.quarterEnum(java.util.Date)
方法描述
获得指定日期所属季度,返回的是季度枚举对象Quarter
源码分析一
/**
* 获得指定日期所属季度
*
* @param date 日期
* @return 第几个季度枚举
* @since 4.1.0
*/
public static Quarter quarterEnum(Date date) {
return DateTime.of(date).quarterEnum();
}
源码的**DateTime.of(date).quarterEnum()**可拆解成两部分
- DateTime.of(date)
- DateTime.quarterEnum()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,quarter()上面有源码分析,结论是获取获得当前日期所属季度,从1开始计数
**Quarter.of(int)**就是把对应的数值转为对应的枚举Quarter
/**
* 获得当前日期所属季度<br>
*
* @return 第几个季度 {@link Quarter}
*/
public Quarter quarterEnum() {
return Quarter.of(quarter());
}
方法名称:DateUtil.month(java.util.Date)
方法描述
源码分析一
/**
* 获得月份,从0开始计数
*
* @param date 日期
* @return 月份,从0开始计数
*/
public static int month(Date date) {
return DateTime.of(date).month();
}
源码的**DateTime.of(date).month()**可拆解成两部分
- DateTime.of(date)
- DateTime.month()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得月份,从0开始计数
*
* @return 月份
*/
public int month() {
return getField(DateField.MONTH);
}
方法名称:DateUtil.monthEnum(java.util.Date)
方法描述
源码分析一
/**
* 获得月份
*
* @param date 日期
* @return {@link Month}
*/
public static Month monthEnum(Date date) {
return DateTime.of(date).monthEnum();
}
源码的**DateTime.of(date).monthEnum()**可拆解成两部分
- DateTime.of(date)
- DateTime.monthEnum()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,month()是获得月份,从0开始计数
**Month.of(int)**就是把对应的数值转为对应的枚举Month
/**
* 获得月份
*
* @return {@link Month}
*/
public Month monthEnum() {
return Month.of(month());
}
方法名称:DateUtil.weekOfYear(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期是所在年份的第几周<br>
* 此方法返回值与一周的第一天有关,比如:<br>
* 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)<br>
* 如果一周的第一天为周一,那这天是第一周(返回1)<br>
* 跨年的那个星期得到的结果总是1
*
* @param date 日期
* @return 周
* @see DateTime#setFirstDayOfWeek(Week)
*/
public static int weekOfYear(Date date) {
return DateTime.of(date).weekOfYear();
}
源码的**DateTime.of(date).weekOfYear()**可拆解成两部分
- DateTime.of(date)
- DateTime.weekOfYear()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期是所在年份的第几周<br>
* 此方法返回值与一周的第一天有关,比如:<br>
* 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)<br>
* 如果一周的第一天为周一,那这天是第一周(返回1)<br>
* 跨年的那个星期得到的结果总是1
*
* @return 周
* @see #setFirstDayOfWeek(Week)
*/
public int weekOfYear() {
return getField(DateField.WEEK_OF_YEAR);
}
方法名称:DateUtil.weekOfMonth(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期是这个日期所在月份的第几天<br>
*
* @param date 日期
* @return 天
*/
public static int dayOfMonth(Date date) {
return DateTime.of(date).dayOfMonth();
}
源码的**DateTime.of(date).year()**可拆解成两部分
- DateTime.of(date)
- DateTime.monthEnum()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期是这个日期所在月份的第几天,从1开始
*
* @return 天,1表示第一天
*/
public int dayOfMonth() {
return getField(DateField.DAY_OF_MONTH);
}
方法名称:DateUtil.dayOfMonth(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期是这个日期所在月份的第几天<br>
*
* @param date 日期
* @return 天
*/
public static int dayOfMonth(Date date) {
return DateTime.of(date).dayOfMonth();
}
源码的**DateTime.of(date).dayOfMonth()**可拆解成两部分
- DateTime.of(date)
- DateTime.dayOfMonth()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期是这个日期所在月份的第几天,从1开始
*
* @return 天,1表示第一天
*/
public int dayOfMonth() {
return getField(DateField.DAY_OF_MONTH);
}
方法名称:DateUtil.dayOfYear(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期是这个日期所在年的第几天
*
* @param date 日期
* @return 天
* @since 5.3.6
*/
public static int dayOfYear(Date date) {
return DateTime.of(date).dayOfYear();
}
源码的**DateTime.of(date).dayOfYear()**可拆解成两部分
- DateTime.of(date)
- DateTime.dayOfYear()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期是这个日期所在年份的第几天,从1开始
*
* @return 天,1表示第一天
* @since 5.3.6
*/
public int dayOfYear() {
return getField(DateField.DAY_OF_YEAR);
}
方法名称:DateUtil.dayOfWeek(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期是星期几,1表示周日,2表示周一
*
* @param date 日期
* @return 天
*/
public static int dayOfWeek(Date date) {
return DateTime.of(date).dayOfWeek();
}
源码的**DateTime.of(date).dayOfWeek()**可拆解成两部分
- DateTime.of(date)
- DateTime.dayOfWeek()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期是星期几,1表示周日,2表示周一
*
* @return 星期几
*/
public int dayOfWeek() {
return getField(DateField.DAY_OF_WEEK);
}
方法名称:DateUtil.dayOfWeekEnum(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期是星期几
*
* @param date 日期
* @return {@link Week}
*/
public static Week dayOfWeekEnum(Date date) {
return DateTime.of(date).dayOfWeekEnum();
}
源码的**DateTime.of(date).dayOfWeekEnum()**可拆解成两部分
- DateTime.of(date)
- DateTime.dayOfWeekEnum()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,dayOfWeek()是获得指定日期是星期几,1表示周日,2表示周一
**Week.of(int)**就是把对应的数值转为对应的枚举Week
/**
* 获得指定日期是星期几
*
* @return {@link Week}
*/
public Week dayOfWeekEnum() {
return Week.of(dayOfWeek());
}
方法名称:DateUtil.hour(java.util.Date, boolean)
方法描述
源码分析一
/**
* 获得指定日期的小时数部分<br>
*
* @param date 日期
* @param is24HourClock 是否24小时制
* @return 小时数
*/
public static int hour(Date date, boolean is24HourClock) {
return DateTime.of(date).hour(is24HourClock);
}
源码的**DateTime.of(date).hour(is24HourClock)**可拆解成两部分
- DateTime.of(date)
- DateTime.hour(is24HourClock)
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
is24HourClock ? DateField.HOUR_OF_DAY : DateField.HOUR:is24HourClock 是否24小时制
DateField.HOUR_OF_DAY:小时,用于24小时制
DateField.HOUR:小时,用于12小时制
/**
* 获得指定日期的小时数部分<br>
*
* @param is24HourClock 是否24小时制
* @return 小时数
*/
public int hour(boolean is24HourClock) {
return getField(is24HourClock ? DateField.HOUR_OF_DAY : DateField.HOUR);
}
方法名称:DateUtil.minute(java.util.Date)
方法描述
获得指定日期的分钟数部分<br>
例如:10:04:15.250 =》 4
源码分析一
/**
* 获得指定日期的分钟数部分<br>
* 例如:10:04:15.250 =》 4
*
* @param date 日期
* @return 分钟数
*/
public static int minute(Date date) {
return DateTime.of(date).minute();
}
源码的**DateTime.of(date).minute()**可拆解成两部分
- DateTime.of(date)
- DateTime.minute()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期的分钟数部分<br>
* 例如:10:04:15.250 =》 4
*
* @return 分钟数
*/
public int minute() {
return getField(DateField.MINUTE);
}
方法名称:DateUtil.second(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期的秒数部分<br>
*
* @param date 日期
* @return 秒数
*/
public static int second(Date date) {
return DateTime.of(date).second();
}
源码的**DateTime.of(date).second()**可拆解成两部分
- DateTime.of(date)
- DateTime.second()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期的秒数部分<br>
*
* @return 秒数
*/
public int second() {
return getField(DateField.SECOND);
}
方法名称:DateUtil.millisecond(java.util.Date)
方法描述
源码分析一
/**
* 获得指定日期的毫秒数部分<br>
*
* @param date 日期
* @return 毫秒数
*/
public static int millisecond(Date date) {
return DateTime.of(date).millisecond();
}
源码的**DateTime.of(date).millisecond()**可拆解成两部分
- DateTime.of(date)
- DateTime.millisecond()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/**
* 获得指定日期的毫秒数部分<br>
*
* @return 毫秒数
*/
public int millisecond() {
return getField(DateField.MILLISECOND);
}
方法名称:DateUtil.isAM(java.util.Date)
方法描述
是否为上午
源码分析一
/**
* 是否为上午
*
* @param date 日期
* @return 是否为上午
*/
public static boolean isAM(Date date) {
return DateTime.of(date).isAM();
}
源码的**DateTime.of(date).isAM()**可拆解成两部分
- DateTime.of(date)
- DateTime.isAM()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
做了一个判断Calendar.AM == getField(DateField.AM_PM)
/**
* 是否为上午
*
* @return 是否为上午
*/
public boolean isAM() {
return Calendar.AM == getField(DateField.AM_PM);
}
方法名称:DateUtil.isPM(java.util.Date)
方法描述
是否为下午
源码分析一
/**
* 是否为下午
*
* @param date 日期
* @return 是否为下午
*/
public static boolean isPM(Date date) {
return DateTime.of(date).isPM();
}
源码的**DateTime.of(date).isPM()**可拆解成两部分
- DateTime.of(date)
- DateTime.isPM()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
做了一个判断Calendar.PM== getField(DateField.AM_PM)
/**
* 是否为下午
*
* @return 是否为下午
*/
public boolean isPM() {
return Calendar.PM == getField(DateField.AM_PM);
}
方法名称:DateUtil.thisYear()
方法描述
返回今年
源码分析一
/**
* @return 今年
*/
public static int thisYear() {
return year(date());
}
源码的**year(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.year() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisMonth()
方法描述
返回当前月份
源码分析一
/**
* @return 当前月份
*/
public static int thisMonth() {
return month(date());
}
源码的**month(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.month() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisMonthEnum()
方法描述
返回当前月份
源码分析一
/**
* @return 当前月份 {@link Month}
*/
public static Month thisMonthEnum() {
return monthEnum(date());
}
源码的**monthEnum(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.monthEnum() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisWeekOfYear()
方法描述
返回当前日期所在年份的第几周
源码分析一
/**
* @return 当前日期所在年份的第几周
*/
public static int thisWeekOfYear() {
return weekOfYear(date());
}
源码的**weekOfYear(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.weekOfYear() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisWeekOfMonth()
方法描述
返回当前日期所在月份的第几周
源码分析一
/**
* @return 当前日期所在月份的第几周
*/
public static int thisWeekOfMonth() {
return weekOfMonth(date());
}
源码的**weekOfMonth(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.weekOfMonth() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisDayOfMonth()
方法描述
返回当前日期是这个日期所在月份的第几天
源码分析一
/**
* @return 当前日期是这个日期所在月份的第几天
*/
public static int thisDayOfMonth() {
return dayOfMonth(date());
}
源码的**dayOfMonth(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.dayOfMonth() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisDayOfWeek()
方法描述
返回当前日期是星期几
源码分析一
/**
* @return 当前日期是星期几
*/
public static int thisDayOfWeek() {
return dayOfWeek(date());
}
源码的**dayOfWeek(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.dayOfWeek() 获得年的部分 源码分析
DateTime.date()
/**
* 当前时间,转换为{@link DateTime}对象
*
* @return 当前时间
*/
public static DateTime date() {
return new DateTime();
}
方法名称:DateUtil.thisDayOfWeekEnum()
方法描述
返回当前日期是星期几
源码分析一
/**
* @return 当前日期是星期几 {@link Week}
*/
public static Week 以上是关于3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容的主要内容,如果未能解决你的问题,请参考以下文章
3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容
1hutool源码分析:DateUtil(时间工具类)-当前时间和当前时间戳