这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆
❤️技术活,该赏
❤️点赞 👍 收藏 ⭐再看,养成习惯
看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:
关联文章:
源码分析目的
知其然,知其所以然
项目引用
此博文的依据:hutool-5.6.5版本源码
1  | xml复制代码 <dependency>  | 
方法名称:DateUtil.year(java.util.Date)
方法描述
获得年的部分
源码分析一
1  | java复制代码 /**  | 
源码的**DateTime.of(date).year()**可拆解成两部分
- DateTime.of(date)
 - DateTime.year()第一部分,看代码很好理解,就是类型的转化
 
1  | java复制代码/**  | 
第二部分,
1  | java复制代码/**  | 
java复制代码/**
- 转换为Calendar, 默认 {@link Locale}
 - @return {@link Calendar}
 - /
public Calendar toCalendar() {
return toCalendar(Locale.getDefault(Locale.Category.FORMAT));
} 
1  | 
  | 
java复制代码/**
- 获得指定日期所属季度,从1开始计数
 - @param date 日期
 - @return 第几个季度
 - @since 4.1.0
 - /
public static int quarter(Date date) {
return DateTime.of(date).quarter();
} 
1  | 
  | 
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  | 
  | 
java复制代码/**
- 获得指定日期所属季度
 - @param date 日期
 - @return 第几个季度枚举
 - @since 4.1.0
 - /
public static Quarter quarterEnum(Date date) {
return DateTime.of(date).quarterEnum();
} 
1  | 
  | 
java复制代码/**
- 获得当前日期所属季度
 - @return 第几个季度 {@link Quarter}
 - /
public Quarter quarterEnum() {
return Quarter.of(quarter());
} 
1  | 
  | 
java复制代码/**
- 获得月份,从0开始计数
 - @param date 日期
 - @return 月份,从0开始计数
 - /
public static int month(Date date) {
return DateTime.of(date).month();
} 
1  | 
  | 
java复制代码/**
- 获得月份,从0开始计数
 - @return 月份
 - /
public int month() {
return getField(DateField.MONTH);
} 
1  | 
  | 
java复制代码/**
- 获得月份
 - @param date 日期
 - @return {@link Month}
 - /
public static Month monthEnum(Date date) {
return DateTime.of(date).monthEnum();
} 
1  | 
  | 
java复制代码/**
- 获得月份
 - @return {@link Month}
 - /
public Month monthEnum() {
return Month.of(month());
} 
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  | 
  | 
java复制代码/**
- 获得指定日期是所在年份的第几周
 - 此方法返回值与一周的第一天有关,比如:
 - 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)
 - 如果一周的第一天为周一,那这天是第一周(返回1)
 - 跨年的那个星期得到的结果总是1
 - @return 周
 - @see #setFirstDayOfWeek(Week)
 - /
public int weekOfYear() {
return getField(DateField.WEEK_OF_YEAR);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是这个日期所在月份的第几天
 - @param date 日期
 - @return 天
 - /
public static int dayOfMonth(Date date) {
return DateTime.of(date).dayOfMonth();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是这个日期所在月份的第几天,从1开始
 - @return 天,1表示第一天
 - /
public int dayOfMonth() {
return getField(DateField.DAY_OF_MONTH);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是这个日期所在月份的第几天
 - @param date 日期
 - @return 天
 - /
public static int dayOfMonth(Date date) {
return DateTime.of(date).dayOfMonth();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是这个日期所在月份的第几天,从1开始
 - @return 天,1表示第一天
 - /
public int dayOfMonth() {
return getField(DateField.DAY_OF_MONTH);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是这个日期所在年的第几天
 - @param date 日期
 - @return 天
 - @since 5.3.6
 - /
public static int dayOfYear(Date date) {
return DateTime.of(date).dayOfYear();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是这个日期所在年份的第几天,从1开始
 - @return 天,1表示第一天
 - @since 5.3.6
 - /
public int dayOfYear() {
return getField(DateField.DAY_OF_YEAR);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是星期几,1表示周日,2表示周一
 - @param date 日期
 - @return 天
 - /
public static int dayOfWeek(Date date) {
return DateTime.of(date).dayOfWeek();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是星期几,1表示周日,2表示周一
 - @return 星期几
 - /
public int dayOfWeek() {
return getField(DateField.DAY_OF_WEEK);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是星期几
 - @param date 日期
 - @return {@link Week}
 - /
public static Week dayOfWeekEnum(Date date) {
return DateTime.of(date).dayOfWeekEnum();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期是星期几
 - @return {@link Week}
 - /
public Week dayOfWeekEnum() {
return Week.of(dayOfWeek());
} 
1  | 
  | 
java复制代码/**
- 获得指定日期的小时数部分
 - @param date 日期
 - @param is24HourClock 是否24小时制
 - @return 小时数
 - /
public static int hour(Date date, boolean is24HourClock) {
return DateTime.of(date).hour(is24HourClock);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期的小时数部分
 - @param is24HourClock 是否24小时制
 - @return 小时数
 - /
public int hour(boolean is24HourClock) {
return getField(is24HourClock ? DateField.HOUR_OF_DAY : DateField.HOUR);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期的分钟数部分
 - 例如:10:04:15.250 =》 4
 - @param date 日期
 - @return 分钟数
 - /
public static int minute(Date date) {
return DateTime.of(date).minute();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期的分钟数部分
 - 例如:10:04:15.250 =》 4
 - @return 分钟数
 - /
public int minute() {
return getField(DateField.MINUTE);
} 
1  | 
  | 
java复制代码/**
- 获得指定日期的秒数部分
 - @param date 日期
 - @return 秒数
 - /
public static int second(Date date) {
return DateTime.of(date).second();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期的秒数部分
 - @return 秒数
 - /
public int second() {
return getField(DateField.SECOND);
} 
1  | 
  | 
java复制代码    /**
     * 获得指定日期的毫秒数部分
     *
     * @param date 日期
     * @return 毫秒数
     */
    public static int millisecond(Date date) {
        return DateTime.of(date).millisecond();
    }
1  | 
  | 
java复制代码/**
- 获得指定日期的毫秒数部分
 - @return 毫秒数
 - /
public int millisecond() {
return getField(DateField.MILLISECOND);
} 
1  | 
  | 
java复制代码/**
- 是否为上午
 - @param date 日期
 - @return 是否为上午
 - /
public static boolean isAM(Date date) {
return DateTime.of(date).isAM();
} 
1  | 
  | 
java复制代码/**
- 是否为上午
 - @return 是否为上午
 - /
public boolean isAM() {
return Calendar.AM == getField(DateField.AM_PM);
} 
1  | 
  | 
java复制代码/**
- 是否为下午
 - @param date 日期
 - @return 是否为下午
 - /
public static boolean isPM(Date date) {
return DateTime.of(date).isPM();
} 
1  | 
  | 
typescript复制代码/**
- 是否为下午
 - @return 是否为下午
 - /
public boolean isPM() {
return Calendar.PM == getField(DateField.AM_PM);
} 
1  | 
  | 
java复制代码/**
- @return 今年
 - /
public static int thisYear() {
return year(date());
} 
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码/**
- @return 当前月份
 - /
public static int thisMonth() {
return month(date());
} 
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码/**
- @return 当前月份 {@link Month}
 - /
public static Month thisMonthEnum() {
return monthEnum(date());
} 
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码/**
- @return 当前日期所在年份的第几周
 - /
public static int thisWeekOfYear() {
return weekOfYear(date());
} 
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期所在月份的第几周
     */
    public static int thisWeekOfMonth() {
        return weekOfMonth(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期是这个日期所在月份的第几天
     */
    public static int thisDayOfMonth() {
        return dayOfMonth(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期是星期几
     */
    public static int thisDayOfWeek() {
        return dayOfWeek(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期是星期几 {@link Week}
     */
    public static Week thisDayOfWeekEnum() {
        return dayOfWeekEnum(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @param is24HourClock 是否24小时制
     * @return 当前日期的小时数部分
     */
    public static int thisHour(boolean is24HourClock) {
        return hour(date(), is24HourClock);
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期的分钟数部分
     */
    public static int thisMinute() {
        return minute(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期的秒数部分
     */
    public static int thisSecond() {
        return second(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码    /**
     * @return 当前日期的毫秒数部分
     */
    public static int thisMillisecond() {
        return millisecond(date());
    }
1  | 
  | 
java复制代码/**
- 当前时间,转换为{@link DateTime}对象
 - @return 当前时间
 - /
public static DateTime date() {
return new DateTime();
} 
1  | 
  | 
java复制代码/**
- 获得指定日期年份和季节
 - 格式:[20131]表示2013年第一季度
 - @param date 日期
 - @return Quarter ,类似于 20132
 - /
public static String yearAndQuarter(Date date) {
return yearAndQuarter(calendar(date));
} 
1  | 
  | 
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  | 
  | 
java复制代码/**
- 获得指定日期区间内的年份和季节
 - @param startDate 起始日期(包含)
 - @param endDate 结束日期(包含)
 - @return 季度列表 ,元素类似于 20132
 - /
public static LinkedHashSetyearAndQuarter(Date startDate, Date endDate) { 
if (startDate == null || endDate == null) {
}return new LinkedHashSet<>(0);
return yearAndQuarter(startDate.getTime(), endDate.getTime());
} 
1  | 
  | 
java复制代码/**
获得指定日期区间内的年份和季度
@param startDate 起始日期(包含)
@param endDate 结束日期(包含)
@return 季度列表 ,元素类似于 20132
@since 4.1.15
/
public static LinkedHashSetyearAndQuarter(long startDate, long endDate) { 
LinkedHashSetquarters = 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/)*