3hutool源码分析:DateUtil(时间工具类)-获取

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆

❤️技术活,该赏

❤️点赞 👍 收藏 ⭐再看,养成习惯

看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:

万字博文教你搞懂java源码的日期和时间相关用法

关联文章:

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

3hutool实战:DateUtil-获取日期的各种内容


源码分析目的

知其然,知其所以然

项目引用

此博文的依据:hutool-5.6.5版本源码

1
2
3
4
5
xml复制代码        <dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.6.5</version>
</dependency>

方法名称:DateUtil.year(java.util.Date)

方法描述

获得年的部分

源码分析一

1
2
3
4
5
6
7
8
9
java复制代码	/**
* 获得年的部分
*
* @param date 日期
* @return 年的部分
*/
public static int year(Date date) {
return DateTime.of(date).year();
}

源码的**DateTime.of(date).year()**可拆解成两部分

  • DateTime.of(date)
  • DateTime.year()第一部分,看代码很好理解,就是类型的转化
1
2
3
4
5
6
7
8
9
10
11
12
java复制代码/**
* 转换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);
}

第二部分,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
java复制代码/**
* 获得年的部分
*
* @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)**

java复制代码/**

  • 转换为Calendar, 默认 {@link Locale}
  • @return {@link Calendar}
  • /
    public Calendar toCalendar() {
    return toCalendar(Locale.getDefault(Locale.Category.FORMAT));
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

\*\*toCalendar()\*\*会得到Calendar,这会就好理解可以获取年了。不止可以获取年,还可以获取年,月,日,时,分,秒。详细介绍可以看这里:[万字博文教你搞懂java源码的日期和时间相关用法](https://xiaoxuzhu.blog.csdn.net/article/details/118947669)


方法名称:DateUtil.quarter(java.util.Date)
=====================================


方法描述
----


获得指定日期所属季度,从1开始计数


源码分析一
-----

java复制代码/**

  • 获得指定日期所属季度,从1开始计数
  • @param date 日期
  • @return 第几个季度
  • @since 4.1.0
  • /
    public static int quarter(Date date) {
    return DateTime.of(date).quarter();
    }
1
2
3
4
5
6
7
8
9
10
11
12

源码的\*\*DateTime.of(date).quarter()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.quarter()


[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,month()获取DateTime对应的月份,然后再做了一个简单计算。

java复制代码/**

  • 获得当前日期所属季度,从1开始计数
  • @return 第几个季度 {@link Quarter}
  • /
    public int quarter() {
    return month() / 3 + 1;
    }

/**
* 获得月份,从0开始计数
*
* @return 月份
/
public int month() {
return getField(DateField.MONTH);
}
/*

* 获得日期的某个部分

* 例如获得年的部分,则使用 getField(DatePart.YEAR)
*
* @param field 表示日期的哪个部分的枚举 {@link DateField}
* @return 某个部分的值
*/
public int getField(DateField field) {
return getField(field.getValue());
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

[getField](#getField)方法上面有介绍了,这里就不水字了。


方法名称:DateUtil.quarterEnum(java.util.Date)
=========================================


方法描述
----


获得指定日期所属季度,返回的是季度枚举对象Quarter


源码分析一
-----

java复制代码/**

  • 获得指定日期所属季度
  • @param date 日期
  • @return 第几个季度枚举
  • @since 4.1.0
  • /
    public static Quarter quarterEnum(Date date) {
    return DateTime.of(date).quarterEnum();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

源码的\*\*DateTime.of(date).quarterEnum()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.quarterEnum()


[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[quarter()](#quarter)上面有源码分析,结论是获取**获得当前日期所属季度,从1开始计数**


\*\*Quarter.of(int)\*\*就是把对应的数值转为对应的枚举Quarter

java复制代码/**

  • 获得当前日期所属季度
  • @return 第几个季度 {@link Quarter}
  • /
    public Quarter quarterEnum() {
    return Quarter.of(quarter());
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.month(java.util.Date)
===================================


方法描述
----


获得月份,从0开始计数

源码分析一
-----

java复制代码/**

  • 获得月份,从0开始计数
  • @param date 日期
  • @return 月份,从0开始计数
  • /
    public static int month(Date date) {
    return DateTime.of(date).month();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).month()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.month()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得月份,从0开始计数
  • @return 月份
  • /
    public int month() {
    return getField(DateField.MONTH);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.monthEnum(java.util.Date)
=======================================


方法描述
----


获得月份,返回月份枚举对象Month

源码分析一
-----

java复制代码/**

  • 获得月份
  • @param date 日期
  • @return {@link Month}
  • /
    public static Month monthEnum(Date date) {
    return DateTime.of(date).monthEnum();
    }
1
2
3
4
5
6
7
8
9
10
11
12

源码的\*\*DateTime.of(date).monthEnum()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.monthEnum()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[month()](#DateUtil_month)是获得月份,从0开始计数


\*\*Month.of(int)\*\*就是把对应的数值转为对应的枚举Month

java复制代码/**

  • 获得月份
  • @return {@link Month}
  • /
    public Month monthEnum() {
    return Month.of(month());
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

方法名称:DateUtil.weekOfYear(java.util.Date)
========================================


方法描述
----


获得指定日期是所在年份的第几周<br>
此方法返回值与一周的第一天有关,比如:<br>
2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)<br>
如果一周的第一天为周一,那这天是第一周(返回1)<br>
跨年的那个星期得到的结果总是1

源码分析一
-----

java复制代码/**

  • 获得指定日期是所在年份的第几周
  • 此方法返回值与一周的第一天有关,比如:
  • 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)
  • 如果一周的第一天为周一,那这天是第一周(返回1)
  • 跨年的那个星期得到的结果总是1
  • @param date 日期
  • @return 周
  • @see DateTime#setFirstDayOfWeek(Week)
  • /
    public static int weekOfYear(Date date) {
    return DateTime.of(date).weekOfYear();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).weekOfYear()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.weekOfYear()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期是所在年份的第几周
  • 此方法返回值与一周的第一天有关,比如:
  • 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)
  • 如果一周的第一天为周一,那这天是第一周(返回1)
  • 跨年的那个星期得到的结果总是1
  • @return 周
  • @see #setFirstDayOfWeek(Week)
  • /
    public int weekOfYear() {
    return getField(DateField.WEEK_OF_YEAR);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.weekOfMonth(java.util.Date)
=========================================


方法描述
----


获得指定日期是所在月份的第几周<br>

源码分析一
-----

java复制代码/**

  • 获得指定日期是这个日期所在月份的第几天
  • @param date 日期
  • @return 天
  • /
    public static int dayOfMonth(Date date) {
    return DateTime.of(date).dayOfMonth();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).year()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.monthEnum()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期是这个日期所在月份的第几天,从1开始
  • @return 天,1表示第一天
  • /
    public int dayOfMonth() {
    return getField(DateField.DAY_OF_MONTH);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.dayOfMonth(java.util.Date)
========================================


方法描述
----


获得指定日期是这个日期所在月份的第几天<br>

源码分析一
-----

java复制代码/**

  • 获得指定日期是这个日期所在月份的第几天
  • @param date 日期
  • @return 天
  • /
    public static int dayOfMonth(Date date) {
    return DateTime.of(date).dayOfMonth();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).dayOfMonth()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.dayOfMonth()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期是这个日期所在月份的第几天,从1开始
  • @return 天,1表示第一天
  • /
    public int dayOfMonth() {
    return getField(DateField.DAY_OF_MONTH);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.dayOfYear(java.util.Date)
=======================================


方法描述
----


获得指定日期是这个日期所在年的第几天

源码分析一
-----

java复制代码/**

  • 获得指定日期是这个日期所在年的第几天
  • @param date 日期
  • @return 天
  • @since 5.3.6
  • /
    public static int dayOfYear(Date date) {
    return DateTime.of(date).dayOfYear();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).dayOfYear()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.dayOfYear()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期是这个日期所在年份的第几天,从1开始
  • @return 天,1表示第一天
  • @since 5.3.6
  • /
    public int dayOfYear() {
    return getField(DateField.DAY_OF_YEAR);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.dayOfWeek(java.util.Date)
=======================================


方法描述
----


获得指定日期是星期几,1表示周日,2表示周一

源码分析一
-----

java复制代码/**

  • 获得指定日期是星期几,1表示周日,2表示周一
  • @param date 日期
  • @return 天
  • /
    public static int dayOfWeek(Date date) {
    return DateTime.of(date).dayOfWeek();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).dayOfWeek()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.dayOfWeek()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期是星期几,1表示周日,2表示周一
  • @return 星期几
  • /
    public int dayOfWeek() {
    return getField(DateField.DAY_OF_WEEK);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.dayOfWeekEnum(java.util.Date)
===========================================


方法描述
----


获得指定日期是星期几

源码分析一
-----

java复制代码/**

  • 获得指定日期是星期几
  • @param date 日期
  • @return {@link Week}
  • /
    public static Week dayOfWeekEnum(Date date) {
    return DateTime.of(date).dayOfWeekEnum();
    }
1
2
3
4
5
6
7
8
9
10
11
12

源码的\*\*DateTime.of(date).dayOfWeekEnum()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.dayOfWeekEnum()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[dayOfWeek()](#DateUtil_dayOfWeek)是获得指定日期是星期几,1表示周日,2表示周一


\*\*Week.of(int)\*\*就是把对应的数值转为对应的枚举Week

java复制代码/**

  • 获得指定日期是星期几
  • @return {@link Week}
  • /
    public Week dayOfWeekEnum() {
    return Week.of(dayOfWeek());
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.hour(java.util.Date, boolean)
===========================================


方法描述
----


获得指定日期的小时数部分<br>

源码分析一
-----

java复制代码/**

  • 获得指定日期的小时数部分
  • @param date 日期
  • @param is24HourClock 是否24小时制
  • @return 小时数
  • /
    public static int hour(Date date, boolean is24HourClock) {
    return DateTime.of(date).hour(is24HourClock);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

源码的\*\*DateTime.of(date).hour(is24HourClock)\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.hour(is24HourClock)[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。


**is24HourClock ? DateField.HOUR\_OF\_DAY : DateField.HOUR**:is24HourClock 是否24小时制


**DateField.HOUR\_OF\_DAY**:小时,用于24小时制


**DateField.HOUR**:小时,用于12小时制

java复制代码/**

  • 获得指定日期的小时数部分
  • @param is24HourClock 是否24小时制
  • @return 小时数
  • /
    public int hour(boolean is24HourClock) {
    return getField(is24HourClock ? DateField.HOUR_OF_DAY : DateField.HOUR);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.minute(java.util.Date)
====================================


方法描述
----


获得指定日期的分钟数部分<br>
例如:10:04:15.250 =》 4

源码分析一
-----

java复制代码/**

  • 获得指定日期的分钟数部分
  • 例如:10:04:15.250 =》 4
  • @param date 日期
  • @return 分钟数
  • /
    public static int minute(Date date) {
    return DateTime.of(date).minute();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).minute()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.minute()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期的分钟数部分
  • 例如:10:04:15.250 =》 4
  • @return 分钟数
  • /
    public int minute() {
    return getField(DateField.MINUTE);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.second(java.util.Date)
====================================


方法描述
----


获得指定日期的秒数部分<br>

源码分析一
-----

java复制代码/**

  • 获得指定日期的秒数部分
  • @param date 日期
  • @return 秒数
  • /
    public static int second(Date date) {
    return DateTime.of(date).second();
    }
1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).second()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.second()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期的秒数部分
  • @return 秒数
  • /
    public int second() {
    return getField(DateField.SECOND);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13

方法名称:DateUtil.millisecond(java.util.Date)
=========================================


方法描述
----


获得指定日期的毫秒数部分<br>

源码分析一
-----

java复制代码 /**
* 获得指定日期的毫秒数部分

*
* @param date 日期
* @return 毫秒数
*/
public static int millisecond(Date date) {
return DateTime.of(date).millisecond();
}

1
2
3
4
5
6
7
8
9

源码的\*\*DateTime.of(date).millisecond()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.millisecond()[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。

java复制代码/**

  • 获得指定日期的毫秒数部分
  • @return 毫秒数
  • /
    public int millisecond() {
    return getField(DateField.MILLISECOND);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.isAM(java.util.Date)
==================================


方法描述
----


是否为上午


源码分析一
-----

java复制代码/**

  • 是否为上午
  • @param date 日期
  • @return 是否为上午
  • /
    public static boolean isAM(Date date) {
    return DateTime.of(date).isAM();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

源码的\*\*DateTime.of(date).isAM()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.isAM()


[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。


做了一个判断**Calendar.AM == getField(DateField.AM\_PM)**

java复制代码/**

  • 是否为上午
  • @return 是否为上午
  • /
    public boolean isAM() {
    return Calendar.AM == getField(DateField.AM_PM);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.isPM(java.util.Date)
==================================


方法描述
----


是否为下午


源码分析一
-----

java复制代码/**

  • 是否为下午
  • @param date 日期
  • @return 是否为下午
  • /
    public static boolean isPM(Date date) {
    return DateTime.of(date).isPM();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

源码的\*\*DateTime.of(date).isPM()\*\*可拆解成两部分


* DateTime.of(date)
* DateTime.isPM()


[DateTime.of(date)](#DateTime_of)上面有介绍了,这里就不水字了。


第二部分,[getField](#getField)方法上面有介绍了,这里就不水字了。


做了一个判断**Calendar.PM== getField(DateField.AM\_PM)**

typescript复制代码/**

  • 是否为下午
  • @return 是否为下午
  • /
    public boolean isPM() {
    return Calendar.PM == getField(DateField.AM_PM);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisYear()
========================


方法描述
----


返回今年


源码分析一
-----

java复制代码/**

  • @return 今年
  • /
    public static int thisYear() {
    return year(date());
    }
1
2
3
4
5
6
7
8
9

源码的\*\*year(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.year() 获得年的部分 [源码分析](#DateTime_year)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisMonth()
=========================


方法描述
----


返回当前月份


源码分析一
-----

java复制代码/**

  • @return 当前月份
  • /
    public static int thisMonth() {
    return month(date());
    }
1
2
3
4
5
6
7
8
9

源码的\*\*month(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.month() 获得年的部分 [源码分析](#DateTime_month)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisMonthEnum()
=============================


方法描述
----


返回当前月份


源码分析一
-----

java复制代码/**

  • @return 当前月份 {@link Month}
  • /
    public static Month thisMonthEnum() {
    return monthEnum(date());
    }
1
2
3
4
5
6
7
8
9

源码的\*\*monthEnum(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.monthEnum() 获得年的部分 [源码分析](#DateTime_monthEnum)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisWeekOfYear()
==============================


方法描述
----


返回当前日期所在年份的第几周


源码分析一
-----

java复制代码/**

  • @return 当前日期所在年份的第几周
  • /
    public static int thisWeekOfYear() {
    return weekOfYear(date());
    }
1
2
3
4
5
6
7
8
9

源码的\*\*weekOfYear(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.weekOfYear() 获得年的部分 [源码分析](#DateTime_weekOfYear)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisWeekOfMonth()
===============================


方法描述
----


返回当前日期所在月份的第几周


源码分析一
-----

java复制代码 /**
* @return 当前日期所在月份的第几周
*/
public static int thisWeekOfMonth() {
return weekOfMonth(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*weekOfMonth(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.weekOfMonth() 获得年的部分 [源码分析](#DateTime_weekOfMonth)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisDayOfMonth()
==============================


方法描述
----


返回当前日期是这个日期所在月份的第几天


源码分析一
-----

java复制代码 /**
* @return 当前日期是这个日期所在月份的第几天
*/
public static int thisDayOfMonth() {
return dayOfMonth(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*dayOfMonth(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.dayOfMonth() 获得年的部分 [源码分析](#DateTime_dayOfMonth)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisDayOfWeek()
=============================


方法描述
----


返回当前日期是星期几


源码分析一
-----

java复制代码 /**
* @return 当前日期是星期几
*/
public static int thisDayOfWeek() {
return dayOfWeek(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*dayOfWeek(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.dayOfWeek() 获得年的部分 [源码分析](#DateTime_dayOfWeek)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisDayOfWeekEnum()
=================================


方法描述
----


返回当前日期是星期几


源码分析一
-----

java复制代码 /**
* @return 当前日期是星期几 {@link Week}
*/
public static Week thisDayOfWeekEnum() {
return dayOfWeekEnum(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*dayOfWeekEnum(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.dayOfWeekEnum() 获得年的部分 [源码分析](#DateTime_dayOfWeekEnum)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisHour(boolean)
===============================


方法描述
----


返回当前日期的小时数部分


源码分析一
-----

java复制代码 /**
* @param is24HourClock 是否24小时制
* @return 当前日期的小时数部分

*/
public static int thisHour(boolean is24HourClock) {
return hour(date(), is24HourClock);
}

1
2
3
4
5
6
7
8
9

源码的\*\*hour(date(), is24HourClock)\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.hour() 获得年的部分 [源码分析](#DateTime_hour)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisMinute()
==========================


方法描述
----


返回当前日期的分钟数部分


源码分析一
-----

java复制代码 /**
* @return 当前日期的分钟数部分

*/
public static int thisMinute() {
return minute(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*minute(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.minute() 获得年的部分 [源码分析](#DateTime_minute)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisSecond()
==========================


方法描述
----


返回当前日期的秒数部分


源码分析一
-----

java复制代码 /**
* @return 当前日期的秒数部分

*/
public static int thisSecond() {
return second(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*second(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.second() 获得年的部分 [源码分析](#DateTime_second)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.thisMillisecond()
===============================


方法描述
----


返回当前日期的毫秒数部分


源码分析一
-----

java复制代码 /**
* @return 当前日期的毫秒数部分

*/
public static int thisMillisecond() {
return millisecond(date());
}

1
2
3
4
5
6
7
8
9

源码的\*\*millisecond(date())\*\*可拆解成两部分


* DateTime.date() 获取当前时间,返回DateTime类型
* DateTime.millisecond() 获得年的部分 [源码分析](#DateTime_millisecond)


**DateTime.date()**

java复制代码/**

  • 当前时间,转换为{@link DateTime}对象
  • @return 当前时间
  • /
    public static DateTime date() {
    return new DateTime();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

方法名称:DateUtil.yearAndQuarter(java.util.Date)
============================================


方法描述
----


获得指定日期年份和季节<br>
格式:[20131]表示2013年第一季度


源码分析一
-----

java复制代码/**

  • 获得指定日期年份和季节
  • 格式:[20131]表示2013年第一季度
  • @param date 日期
  • @return Quarter ,类似于 20132
  • /
    public static String yearAndQuarter(Date date) {
    return yearAndQuarter(calendar(date));
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

源码的\*\*yearAndQuarter(calendar(date))\*\*可拆解成两部分


* calendar(date):Date对象转换为Calendar对象
* yearAndQuarter(Calendar)


yearAndQuarter方法代码分析:


​ 获取年份**cal.get(Calendar.YEAR)**


​ 获取季度**cal.get(Calendar.MONTH) / 3 + 1**


​ 然后通过StringBuilder拼接字符串

java复制代码/**

  • 获得指定日期年份和季度
  • 格式:[20131]表示2013年第一季度
  • @param cal 日期
  • @return 年和季度,格式类似于20131
  • /
    public static String yearAndQuarter(Calendar cal) {
    return StrUtil.builder().append(cal.get(Calendar.YEAR)).append(cal.get(Calendar.MONTH) / 3 + 1).toString();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法名称:DateUtil.yearAndQuarter(java.util.Date, java.util.Date)
============================================================


方法描述
----


获得指定日期区间内的年份和季节<br>


源码分析一
-----

java复制代码/**

  • 获得指定日期区间内的年份和季节
  • @param startDate 起始日期(包含)
  • @param endDate 结束日期(包含)
  • @return 季度列表 ,元素类似于 20132
  • /
    public static LinkedHashSet yearAndQuarter(Date startDate, Date endDate) {
    if (startDate == null || endDate == null) {
    return new LinkedHashSet<>(0);
    }
    return yearAndQuarter(startDate.getTime(), endDate.getTime());
    }
1
2
3
4
5

如上面代码所示,有个判空处理


然后,写了一个while循环,把符合条件的年份和季度存到LinkedHashSet里,存完一个年份和季度的字符串后,会给开始时间增加3个月,如果开始时间超出结束时间,让结束时间为开始时间,处理完后结束循环

java复制代码/**

  • 获得指定日期区间内的年份和季度

  • @param startDate 起始日期(包含)

  • @param endDate 结束日期(包含)

  • @return 季度列表 ,元素类似于 20132

  • @since 4.1.15

  • /
    public static LinkedHashSet yearAndQuarter(long startDate, long endDate) {
    LinkedHashSet quarters = new LinkedHashSet<>();
    final Calendar cal = calendar(startDate);
    while (startDate <= endDate) {

    // 如果开始时间超出结束时间,让结束时间为开始时间,处理完后结束循环
    quarters.add(yearAndQuarter(cal));
    
    cal.add(Calendar.MONTH, 3);
    startDate = cal.getTimeInMillis();

    }

    return quarters;
    }



**本文转载自:** [掘金](https://juejin.cn/post/7028050356995096584)

*[开发者博客 – 和开发相关的 这里全都有](https://dev.newban.cn/)*
0%