3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容

举报
小虚竹 发表于 2021/10/19 00:51:19 2021/10/19
【摘要】 技术活,该赏 关注+一键三连(点赞,评论,收藏)再看,养成好习惯 12 看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章: 万字博文教你搞懂java源码的日...
技术活,该赏
关注+一键三连(点赞,评论,收藏)再看,养成好习惯

  
 
  • 1
  • 2

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

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

关联文章:

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

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


源码分析目的

知其然,知其所以然

项目引用

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

        <dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-core</artifactId>
			<version>5.6.5</version>
		</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

方法描述

获得年的部分

源码分析一

	/**
	 * 获得年的部分
	 *
	 * @param date 日期
	 * @return 年的部分
	 */
	public static int year(Date date) {
		return DateTime.of(date).year();
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

源码的**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);
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第二部分,

/**
 * 获得年的部分
 *
 * @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);
	}

  
 
  • 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

从代码跟下来,可以发现会走到toCalendar().get(field)

/**
 * 转换为Calendar, 默认 {@link Locale}
 *
 * @return {@link Calendar}
 */
public Calendar toCalendar() {
   return toCalendar(Locale.getDefault(Locale.Category.FORMAT));
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

**toCalendar()**会得到Calendar,这会就好理解可以获取年了。

不止可以获取年,还可以获取年,月,日,时,分,秒。详细介绍可以看这里:万字博文教你搞懂java源码的日期和时间相关用法

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

方法描述

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

源码分析一

/**
 * 获得指定日期所属季度,从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

源码的**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());
	}

  
 
  • 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

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();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

源码的**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());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

获得月份,从0开始计数

源码分析一

/**
 * 获得月份,从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)上面有介绍了,这里就不水字了。

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

/**
 * 获得月份
 *
 * @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

源码的**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());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

/**
 * 获得指定日期是所在年份的第几周<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();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

源码的**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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

方法描述

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

源码分析一

/**
 * 获得指定日期是这个日期所在月份的第几天<br>
 *
 * @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)上面有介绍了,这里就不水字了。

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

/**
 * 获得指定日期是这个日期所在月份的第几天,从1开始
 *
 * @return 天,1表示第一天
 */
public int dayOfMonth() {
   return getField(DateField.DAY_OF_MONTH);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

/**
 * 获得指定日期是这个日期所在月份的第几天<br>
 *
 * @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)上面有介绍了,这里就不水字了。

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

/**
 * 获得指定日期是这个日期所在月份的第几天,从1开始
 *
 * @return 天,1表示第一天
 */
public int dayOfMonth() {
   return getField(DateField.DAY_OF_MONTH);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

/**
 * 获得指定日期是这个日期所在年的第几天
 *
 * @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
  • 10

源码的**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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

方法描述

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

源码分析一

/**
 * 获得指定日期是星期几,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)上面有介绍了,这里就不水字了。

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

/**
 * 获得指定日期是星期几,1表示周日,2表示周一
 *
 * @return 星期几
 */
public int dayOfWeek() {
   return getField(DateField.DAY_OF_WEEK);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

获得指定日期是星期几

源码分析一

/**
 * 获得指定日期是星期几
 *
 * @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

源码的**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());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

/**
 * 获得指定日期的小时数部分<br>
 *
 * @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

源码的**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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

源码的**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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

方法描述

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

源码分析一

/**
 * 获得指定日期的秒数部分<br>
 *
 * @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)上面有介绍了,这里就不水字了。

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

/**
 * 获得指定日期的秒数部分<br>
 *
 * @return 秒数
 */
public int second() {
   return getField(DateField.SECOND);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

	/**
	 * 获得指定日期的毫秒数部分<br>
	 *
	 * @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)上面有介绍了,这里就不水字了。

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

/**
 * 获得指定日期的毫秒数部分<br>
 *
 * @return 毫秒数
 */
public int millisecond() {
   return getField(DateField.MILLISECOND);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

是否为上午

源码分析一

/**
 * 是否为上午
 *
 * @param date 日期
 * @return 是否为上午
 */
public static boolean isAM(Date date) {
   return DateTime.of(date).isAM();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

源码的**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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

是否为下午

源码分析一

/**
 * 是否为下午
 *
 * @param date 日期
 * @return 是否为下午
 */
public static boolean isPM(Date date) {
   return DateTime.of(date).isPM();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

源码的**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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisYear()

方法描述

返回今年

源码分析一

/**
 * @return 今年
 */
public static int thisYear() {
   return year(date());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisMonth()

方法描述

返回当前月份

源码分析一

/**
 * @return 当前月份
 */
public static int thisMonth() {
   return month(date());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisMonthEnum()

方法描述

返回当前月份

源码分析一

/**
 * @return 当前月份 {@link Month}
 */
public static Month thisMonthEnum() {
   return monthEnum(date());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisWeekOfYear()

方法描述

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

源码分析一

/**
 * @return 当前日期所在年份的第几周
 */
public static int thisWeekOfYear() {
   return weekOfYear(date());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisWeekOfMonth()

方法描述

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

源码分析一

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisDayOfMonth()

方法描述

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

源码分析一

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisDayOfWeek()

方法描述

返回当前日期是星期几

源码分析一

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisDayOfWeekEnum()

方法描述

返回当前日期是星期几

源码分析一

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisHour(boolean)

方法描述

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

源码分析一

	/**
	 * @param is24HourClock 是否24小时制
	 * @return 当前日期的小时数部分<br>
	 */
	public static int thisHour(boolean is24HourClock) {
		return hour(date(), is24HourClock);
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisMinute()

方法描述

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

源码分析一

	/**
	 * @return 当前日期的分钟数部分<br>
	 */
	public static int thisMinute() {
		return minute(date());
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisSecond()

方法描述

返回当前日期的秒数部分

源码分析一

	/**
	 * @return 当前日期的秒数部分<br>
	 */
	public static int thisSecond() {
		return second(date());
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法名称:DateUtil.thisMillisecond()

方法描述

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

源码分析一

	/**
	 * @return 当前日期的毫秒数部分<br>
	 */
	public static int thisMillisecond() {
		return millisecond(date());
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

DateTime.date()

/**
 * 当前时间,转换为{@link DateTime}对象
 *
 * @return 当前时间
 */
public static DateTime date() {
   return new DateTime();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

方法描述

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

源码分析一

/**
 * 获得指定日期年份和季节<br>
 * 格式:[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

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

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

yearAndQuarter方法代码分析:

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

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

​ 然后通过StringBuilder拼接字符串

/**
 * 获得指定日期年份和季度<br>
 * 格式:[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

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

方法描述

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

源码分析一

/**
 * 获得指定日期区间内的年份和季节<br>
 *
 * @param startDate 起始日期(包含)
 * @param endDate   结束日期(包含)
 * @return 季度列表 ,元素类似于 20132
 */
public static LinkedHashSet<String> 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
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

/**
 * 获得指定日期区间内的年份和季度<br>
 *
 * @param startDate 起始日期(包含)
 * @param endDate   结束日期(包含)
 * @return 季度列表 ,元素类似于 20132
 * @since 4.1.15
 */
public static LinkedHashSet<String> yearAndQuarter(long startDate, long endDate) {
   LinkedHashSet<String> 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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

文章来源: xiaoxuzhu.blog.csdn.net,作者:小虚竹,版权归原作者所有,如需转载,请联系作者。

原文链接:xiaoxuzhu.blog.csdn.net/article/details/119064704

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。