源码分析目的
知其然,知其所以然
项目引用
此博文的依据:hutool-5.6.5版本 源码
<dependency> | |
<groupId>cn.hutool</groupId> | |
<artifactId>hutool-core</artifactId> | |
<version>.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.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对应的月份,然后再做了一个简单计算。
/** | |
* 获得当前日期所属季度,从开始计数<br> | |
* | |
* @return 第几个季度 {@link Quarter} | |
*/public int quarter() { | |
return month() / + 1; | |
} | |
/** | |
* 获得月份,从开始计数 | |
* | |
* @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.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 月份,从开始计数 | |
*/public static int month(Date date) { | |
return DateTime.of(date).month(); | |
} |
源码的**DateTime.of(date).month()**可拆解成两部分
- DateTime.of(date)
- DateTime.month()
DateTime.of(date)上面有介绍了,这里就不水字了。
第二部分,getField方法上面有介绍了,这里就不水字了。
/** | |
* 获得月份,从开始计数 | |
* | |
* @return 月份 | |
*/public int month() { | |
return getField(DateField.MONTH); | |
} |
方法名称:DateUtil.monthEnum(java.util.Date)
方法描述
获得月份,返回月份枚举对象Month
源码分析一
/** | |
* 获得月份 | |
* | |
* @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
源码分析一
/** | |
* 获得指定日期是所在年份的第几周<br> | |
* 此方法返回值与一周的第一天有关,比如:<br> | |
*年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)<br> | |
* 如果一周的第一天为周一,那这天是第一周(返回)<br> | |
* 跨年的那个星期得到的结果总是 | |
* | |
* @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> | |
*年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)<br> | |
* 如果一周的第一天为周一,那这天是第一周(返回)<br> | |
* 跨年的那个星期得到的结果总是 | |
* | |
* @return 周 | |
* @see #setFirstDayOfWeek(Week) | |
*/public int weekOfYear() { | |
return getField(DateField.WEEK_OF_YEAR); | |
} |
方法名称:DateUtil.weekOfMonth(java.util.Date)
方法描述
获得指定日期是所在月份的第几周<br>
源码分析一
/** | |
* 获得指定日期是这个日期所在月份的第几天<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方法上面有介绍了,这里就不水字了。
/** | |
* 获得指定日期是这个日期所在月份的第几天,从开始 | |
* | |
* @return 天,表示第一天 | |
*/public int dayOfMonth() { | |
return getField(DateField.DAY_OF_MONTH); | |
} |
方法名称:DateUtil.dayOfMonth(java.util.Date)
方法描述
获得指定日期是这个日期所在月份的第几天<br>
源码分析一
/** | |
* 获得指定日期是这个日期所在月份的第几天<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方法上面有介绍了,这里就不水字了。
/** | |
* 获得指定日期是这个日期所在月份的第几天,从开始 | |
* | |
* @return 天,表示第一天 | |
*/public int dayOfMonth() { | |
return getField(DateField.DAY_OF_MONTH); | |
} |
方法名称:DateUtil.dayOfYear(java.util.Date)
方法描述
获得指定日期是这个日期所在年的第几天
源码分析一
/** | |
* 获得指定日期是这个日期所在年的第几天 | |
* | |
* @param date 日期 | |
* @return 天 | |
* @since.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方法上面有介绍了,这里就不水字了。
/** | |
* 获得指定日期是这个日期所在年份的第几天,从开始 | |
* | |
* @return 天,表示第一天 | |
* @since.3.6 | |
*/public int dayOfYear() { | |
return getField(DateField.DAY_OF_YEAR); | |
} |
方法名称:DateUtil.dayOfWeek(java.util.Date)
方法描述
获得指定日期是星期几,1表示周日,2表示周一
源码分析一
/** | |
* 获得指定日期是星期几,表示周日,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方法上面有介绍了,这里就不水字了。
/** | |
* 获得指定日期是星期几,表示周日,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>
源码分析一
/** | |
* 获得指定日期的小时数部分<br> | |
* | |
* @param date 日期 | |
* @param isHourClock 是否24小时制 | |
* @return 小时数 | |
*/public static int hour(Date date, boolean isHourClock) { | |
return DateTime.of(date).hour(isHourClock); | |
} |
源码的**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 isHourClock 是否24小时制 | |
* @return 小时数 | |
*/public int hour(boolean isHourClock) { | |
return getField(isHourClock ? DateField.HOUR_OF_DAY : DateField.HOUR); | |
} |
方法名称:DateUtil.minute(java.util.Date)
方法描述
获得指定日期的分钟数部分<br> 例如:10:04:15.250 =》 4
源码分析一
/** | |
* 获得指定日期的分钟数部分<br> | |
* 例如::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> | |
* 例如::04:15.250 =》 4 | |
* | |
* @return 分钟数 | |
*/public int minute() { | |
return getField(DateField.MINUTE); | |
} |
方法名称:DateUtil.second(java.util.Date)
方法描述
获得指定日期的秒数部分<br>
源码分析一
/** | |
* 获得指定日期的秒数部分<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>
源码分析一
/** | |
* 获得指定日期的毫秒数部分<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 thisDayOfWeekEnum() { | |
return dayOfWeekEnum(date()); | |
} |
源码的**dayOfWeekEnum(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.dayOfWeekEnum() 获得年的部分 源码分析
DateTime.date()
/** | |
* 当前时间,转换为{@link DateTime}对象 | |
* | |
* @return 当前时间 | |
*/public static DateTime date() { | |
return new DateTime(); | |
} |
方法名称:DateUtil.thisHour(boolean)
方法描述
返回当前日期的小时数部分
源码分析一
/** | |
* @param isHourClock 是否24小时制 | |
* @return 当前日期的小时数部分<br> | |
*/public static int thisHour(boolean isHourClock) { | |
return hour(date(), isHourClock); | |
} |
源码的**hour(date(), is24HourClock)**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.hour() 获得年的部分 源码分析
DateTime.date()
/** | |
* 当前时间,转换为{@link DateTime}对象 | |
* | |
* @return 当前时间 | |
*/public static DateTime date() { | |
return new DateTime(); | |
} |
方法名称:DateUtil.thisMinute()
方法描述
返回当前日期的分钟数部分
源码分析一
/** | |
* @return 当前日期的分钟数部分<br> | |
*/public static int thisMinute() { | |
return minute(date()); | |
} |
源码的**minute(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.minute() 获得年的部分 源码分析
DateTime.date()
/** | |
* 当前时间,转换为{@link DateTime}对象 | |
* | |
* @return 当前时间 | |
*/public static DateTime date() { | |
return new DateTime(); | |
} |
方法名称:DateUtil.thisSecond()
方法描述
返回当前日期的秒数部分
源码分析一
/** | |
* @return 当前日期的秒数部分<br> | |
*/public static int thisSecond() { | |
return second(date()); | |
} |
源码的**second(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.second() 获得年的部分 源码分析
DateTime.date()
/** | |
* 当前时间,转换为{@link DateTime}对象 | |
* | |
* @return 当前时间 | |
*/public static DateTime date() { | |
return new DateTime(); | |
} |
方法名称:DateUtil.thisMillisecond()
方法描述
返回当前日期的毫秒数部分
源码分析一
/** | |
* @return 当前日期的毫秒数部分<br> | |
*/public static int thisMillisecond() { | |
return millisecond(date()); | |
} |
源码的**millisecond(date())**可拆解成两部分
- DateTime.date() 获取当前时间,返回DateTime类型
- DateTime.millisecond() 获得年的部分 源码分析
DateTime.date()
/** | |
* 当前时间,转换为{@link DateTime}对象 | |
* | |
* @return 当前时间 | |
*/public static DateTime date() { | |
return new DateTime(); | |
} |
方法名称:DateUtil.yearAndQuarter(java.util.Date)
方法描述
获得指定日期年份和季节<br> 格式:[20131]表示2013年第一季度
源码分析一
/** | |
* 获得指定日期年份和季节<br> | |
* 格式:[]表示2013年第一季度 | |
* | |
* @param date 日期 | |
* @return Quarter ,类似于 | |
*/public static String yearAndQuarter(Date date) { | |
return yearAndQuarter(calendar(date)); | |
} |
源码的**yearAndQuarter(calendar(date))**可拆解成两部分
- calendar(date):Date对象转换为Calendar对象
- yearAndQuarter(Calendar)
yearAndQuarter方法代码分析:
获取年份 cal.get(Calendar.YEAR)
获取季度 cal.get(Calendar.MONTH) / 3 + 1
然后通过StringBuilder拼接字符串
/** | |
* 获得指定日期年份和季度<br> | |
* 格式:[]表示2013年第一季度 | |
* | |
* @param cal 日期 | |
* @return 年和季度,格式类似于 | |
*/public static String yearAndQuarter(Calendar cal) { | |
return StrUtil.builder().append(cal.get(Calendar.YEAR)).append(cal.get(Calendar.MONTH) / + 1).toString(); | |
} |
方法名称:DateUtil.yearAndQuarter(java.util.Date, java.util.Date)
方法描述
获得指定日期区间内的年份和季节<br>
源码分析一
/** | |
* 获得指定日期区间内的年份和季节<br> | |
* | |
* @param startDate 起始日期(包含) | |
* @param endDate 结束日期(包含) | |
* @return 季度列表 ,元素类似于 | |
*/public static LinkedHashSet<String> yearAndQuarter(Date startDate, Date endDate) { | |
if (startDate == null || endDate == null) { | |
return new LinkedHashSet<>(); | |
} | |
return yearAndQuarter(startDate.getTime(), endDate.getTime()); | |
} |
如上面代码所示,有个判空处理
然后,写了一个while循环,把符合条件的年份和季度存到LinkedHashSet里,存完一个年份和季度的字符串后,会给开始时间增加3个月,如果开始时间超出结束时间,让结束时间为开始时间,处理完后结束循环
/** | |
* 获得指定日期区间内的年份和季度<br> | |
* | |
* @param startDate 起始日期(包含) | |
* @param endDate 结束日期(包含) | |
* @return 季度列表 ,元素类似于 | |
* @since.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,); | |
startDate = cal.getTimeInMillis(); | |
} | |
return quarters; | |
} |