This commit is contained in:
Looly 2024-07-31 15:46:15 +08:00
parent 1a0ae09047
commit a22f4d686a
7 changed files with 85 additions and 112 deletions

View File

@ -158,17 +158,6 @@ public class CalendarUtil {
return DateModifier.modify(calendar, dateField.getValue(), DateModifier.ModifyType.ROUND);
}
/**
* 修改日期为某个时间字段结束时间
*
* @param calendar {@link Calendar}
* @param dateField 保留到的时间字段如定义为 {@link DateField#SECOND}表示这个字段不变这个字段以下字段全部取最大值
* @return {@link Calendar}
*/
public static Calendar ceiling(final Calendar calendar, final DateField dateField) {
return DateModifier.modify(calendar, dateField.getValue(), DateModifier.ModifyType.CEILING);
}
/**
* 修改日期为某个时间字段结束时间<br>
* 可选是否归零毫秒
@ -200,12 +189,13 @@ public class CalendarUtil {
/**
* 修改秒级别的结束时间即毫秒设置为999
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
* @since 4.6.2
*/
public static Calendar endOfSecond(final Calendar calendar) {
return ceiling(calendar, DateField.SECOND);
public static Calendar endOfSecond(final Calendar calendar, final boolean truncateMillisecond) {
return ceiling(calendar, DateField.SECOND, truncateMillisecond);
}
/**
@ -221,11 +211,12 @@ public class CalendarUtil {
/**
* 修改某小时的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
*/
public static Calendar endOfHour(final Calendar calendar) {
return ceiling(calendar, DateField.HOUR_OF_DAY);
public static Calendar endOfHour(final Calendar calendar, final boolean truncateMillisecond) {
return ceiling(calendar, DateField.HOUR_OF_DAY, truncateMillisecond);
}
/**
@ -241,11 +232,12 @@ public class CalendarUtil {
/**
* 修改某分钟的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
*/
public static Calendar endOfMinute(final Calendar calendar) {
return ceiling(calendar, DateField.MINUTE);
public static Calendar endOfMinute(final Calendar calendar, final boolean truncateMillisecond) {
return ceiling(calendar, DateField.MINUTE, truncateMillisecond);
}
/**
@ -261,11 +253,12 @@ public class CalendarUtil {
/**
* 修改某天的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
*/
public static Calendar endOfDay(final Calendar calendar) {
return ceiling(calendar, DateField.DAY_OF_MONTH);
public static Calendar endOfDay(final Calendar calendar, final boolean truncateMillisecond) {
return ceiling(calendar, DateField.DAY_OF_MONTH, truncateMillisecond);
}
/**
@ -292,27 +285,18 @@ public class CalendarUtil {
return truncate(calendar, DateField.WEEK_OF_MONTH);
}
/**
* 修改某周的结束时间周日定为一周的结束
*
* @param calendar 日期 {@link Calendar}
* @return {@link Calendar}
*/
public static Calendar endOfWeek(final Calendar calendar) {
return endOfWeek(calendar, true);
}
/**
* 修改某周的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param isSundayAsLastDay 是否周日做为一周的最后一天false表示周六做为最后一天
* @param calendar 日期 {@link Calendar}
* @param isSundayAsLastDay 是否周日做为一周的最后一天false表示周六做为最后一天
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
*/
public static Calendar endOfWeek(final Calendar calendar, final boolean isSundayAsLastDay) {
public static Calendar endOfWeek(final Calendar calendar, final boolean isSundayAsLastDay, final boolean truncateMillisecond) {
calendar.setFirstDayOfWeek(isSundayAsLastDay ? Calendar.MONDAY : Calendar.SUNDAY);
// WEEK_OF_MONTH为上限的字段不包括实际调整的为DAY_OF_MONTH
return ceiling(calendar, DateField.WEEK_OF_MONTH);
return ceiling(calendar, DateField.WEEK_OF_MONTH, truncateMillisecond);
}
/**
@ -328,11 +312,12 @@ public class CalendarUtil {
/**
* 修改某月的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
*/
public static Calendar endOfMonth(final Calendar calendar) {
return ceiling(calendar, DateField.MONTH);
public static Calendar endOfMonth(final Calendar calendar, final boolean truncateMillisecond) {
return ceiling(calendar, DateField.MONTH, truncateMillisecond);
}
/**
@ -352,19 +337,20 @@ public class CalendarUtil {
/**
* 获取某季度的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
* @since 4.1.0
*/
@SuppressWarnings({"MagicConstant", "ConstantConditions"})
public static Calendar endOfQuarter(final Calendar calendar) {
public static Calendar endOfQuarter(final Calendar calendar, final boolean truncateMillisecond) {
final int year = calendar.get(Calendar.YEAR);
final int month = calendar.get(DateField.MONTH.getValue()) / 3 * 3 + 2;
final Calendar resultCal = Calendar.getInstance(calendar.getTimeZone());
resultCal.set(year, month, Month.of(month).getLastDay(DateUtil.isLeapYear(year)));
return endOfDay(resultCal);
return endOfDay(resultCal, truncateMillisecond);
}
/**
@ -380,11 +366,12 @@ public class CalendarUtil {
/**
* 修改某年的结束时间
*
* @param calendar 日期 {@link Calendar}
* @param calendar 日期 {@link Calendar}
* @param truncateMillisecond 是否毫秒归零
* @return {@link Calendar}
*/
public static Calendar endOfYear(final Calendar calendar) {
return ceiling(calendar, DateField.YEAR);
public static Calendar endOfYear(final Calendar calendar, final boolean truncateMillisecond) {
return ceiling(calendar, DateField.YEAR, truncateMillisecond);
}
// endregion
@ -611,7 +598,7 @@ public class CalendarUtil {
* @since 5.0.5
*/
public static LocalDateTime toLocalDateTime(final Calendar calendar) {
if(null == calendar){
if (null == calendar) {
return null;
}
return LocalDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());

View File

@ -91,7 +91,7 @@ public class DateModifier {
break;
}
// 处理下一级别字段
return modify(calendar, dateField + 1, modifyType);
return modify(calendar, dateField + 1, modifyType, truncateMillisecond);
}
final int endField = truncateMillisecond ? Calendar.SECOND : Calendar.MILLISECOND;

View File

@ -831,18 +831,6 @@ public class DateUtil {
return new DateTime(CalendarUtil.round(CalendarUtil.calendar(date), dateField));
}
/**
* 修改日期为某个时间字段结束时间
*
* @param date {@link Date}
* @param dateField 保留到的时间字段如定义为 {@link DateField#SECOND}表示这个字段不变这个字段以下字段全部取最大值
* @return {@link DateTime}
* @since 4.5.7
*/
public static DateTime ceiling(final Date date, final DateField dateField) {
return new DateTime(CalendarUtil.ceiling(CalendarUtil.calendar(date), dateField));
}
/**
* 修改日期为某个时间字段结束时间<br>
* 可选是否归零毫秒
@ -876,11 +864,12 @@ public class DateUtil {
* 获取秒级别的结束时间即毫秒设置为999
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
* @since 4.6.2
*/
public static DateTime endOfSecond(final Date date) {
return new DateTime(CalendarUtil.endOfSecond(CalendarUtil.calendar(date)));
public static DateTime endOfSecond(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfSecond(CalendarUtil.calendar(date), truncateMillisecond));
}
/**
@ -897,10 +886,11 @@ public class DateUtil {
* 获取某小时的结束时间
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
*/
public static DateTime endOfHour(final Date date) {
return new DateTime(CalendarUtil.endOfHour(CalendarUtil.calendar(date)));
public static DateTime endOfHour(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfHour(CalendarUtil.calendar(date), truncateMillisecond));
}
/**
@ -917,10 +907,11 @@ public class DateUtil {
* 获取某分钟的结束时间
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
*/
public static DateTime endOfMinute(final Date date) {
return new DateTime(CalendarUtil.endOfMinute(CalendarUtil.calendar(date)));
public static DateTime endOfMinute(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfMinute(CalendarUtil.calendar(date), truncateMillisecond));
}
/**
@ -937,10 +928,11 @@ public class DateUtil {
* 获取某天的结束时间
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
*/
public static DateTime endOfDay(final Date date) {
return new DateTime(CalendarUtil.endOfDay(CalendarUtil.calendar(date)));
public static DateTime endOfDay(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfDay(CalendarUtil.calendar(date), truncateMillisecond));
}
/**
@ -965,26 +957,17 @@ public class DateUtil {
return new DateTime(CalendarUtil.beginOfWeek(CalendarUtil.calendar(date), isMondayAsFirstDay));
}
/**
* 获取某周的结束时间周日定为一周的结束
*
* @param date 日期
* @return {@link DateTime}
*/
public static DateTime endOfWeek(final Date date) {
return new DateTime(CalendarUtil.endOfWeek(CalendarUtil.calendar(date)));
}
/**
* 获取某周的结束时间
*
* @param date 日期
* @param isSundayAsLastDay 是否周日做为一周的最后一天false表示周六做为最后一天
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
* @since 5.4.0
*/
public static DateTime endOfWeek(final Date date, final boolean isSundayAsLastDay) {
return new DateTime(CalendarUtil.endOfWeek(CalendarUtil.calendar(date), isSundayAsLastDay));
public static DateTime endOfWeek(final Date date, final boolean isSundayAsLastDay, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfWeek(CalendarUtil.calendar(date), isSundayAsLastDay, truncateMillisecond));
}
/**
@ -1001,10 +984,11 @@ public class DateUtil {
* 获取某月的结束时间
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
*/
public static DateTime endOfMonth(final Date date) {
return new DateTime(CalendarUtil.endOfMonth(CalendarUtil.calendar(date)));
public static DateTime endOfMonth(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfMonth(CalendarUtil.calendar(date), truncateMillisecond));
}
/**
@ -1021,10 +1005,11 @@ public class DateUtil {
* 获取某季度的结束时间
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
*/
public static DateTime endOfQuarter(final Date date) {
return new DateTime(CalendarUtil.endOfQuarter(CalendarUtil.calendar(date)));
public static DateTime endOfQuarter(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfQuarter(CalendarUtil.calendar(date), truncateMillisecond));
}
/**
@ -1041,10 +1026,11 @@ public class DateUtil {
* 获取某年的结束时间
*
* @param date 日期
* @param truncateMillisecond 是否毫秒归零
* @return {@link DateTime}
*/
public static DateTime endOfYear(final Date date) {
return new DateTime(CalendarUtil.endOfYear(CalendarUtil.calendar(date)));
public static DateTime endOfYear(final Date date, final boolean truncateMillisecond) {
return new DateTime(CalendarUtil.endOfYear(CalendarUtil.calendar(date), truncateMillisecond));
}
/**

View File

@ -85,52 +85,52 @@ public class DateModifierTest {
final Date date = DateUtil.parse(dateStr);
// 毫秒
DateTime begin = DateUtil.ceiling(date, DateField.MILLISECOND);
DateTime begin = DateUtil.ceiling(date, DateField.MILLISECOND, false);
Assertions.assertEquals(dateStr, begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
//
begin = DateUtil.ceiling(date, DateField.SECOND);
begin = DateUtil.ceiling(date, DateField.SECOND, false);
Assertions.assertEquals("2017-03-01 22:33:23.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
//
begin = DateUtil.ceiling(date, DateField.MINUTE);
begin = DateUtil.ceiling(date, DateField.MINUTE, false);
Assertions.assertEquals("2017-03-01 22:33:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
// 小时
begin = DateUtil.ceiling(date, DateField.HOUR);
begin = DateUtil.ceiling(date, DateField.HOUR, false);
Assertions.assertEquals("2017-03-01 22:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
begin = DateUtil.ceiling(date, DateField.HOUR_OF_DAY);
begin = DateUtil.ceiling(date, DateField.HOUR_OF_DAY, false);
Assertions.assertEquals("2017-03-01 22:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
// 上下午原始日期是22点上下午的结束就是23点
begin = DateUtil.ceiling(date, DateField.AM_PM);
begin = DateUtil.ceiling(date, DateField.AM_PM, false);
Assertions.assertEquals("2017-03-01 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
// day of xxx按照day处理
begin = DateUtil.ceiling(date, DateField.DAY_OF_WEEK_IN_MONTH);
begin = DateUtil.ceiling(date, DateField.DAY_OF_WEEK_IN_MONTH, false);
Assertions.assertEquals("2017-03-01 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
begin = DateUtil.ceiling(date, DateField.DAY_OF_WEEK);
begin = DateUtil.ceiling(date, DateField.DAY_OF_WEEK, false);
Assertions.assertEquals("2017-03-01 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
begin = DateUtil.ceiling(date, DateField.DAY_OF_MONTH);
begin = DateUtil.ceiling(date, DateField.DAY_OF_MONTH, false);
Assertions.assertEquals("2017-03-01 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
// 星期
begin = DateUtil.ceiling(date, DateField.WEEK_OF_MONTH);
begin = DateUtil.ceiling(date, DateField.WEEK_OF_MONTH, false);
Assertions.assertEquals("2017-03-05 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
begin = DateUtil.ceiling(date, DateField.WEEK_OF_YEAR);
begin = DateUtil.ceiling(date, DateField.WEEK_OF_YEAR, false);
Assertions.assertEquals("2017-03-05 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
//
begin = DateUtil.ceiling(date, DateField.MONTH);
begin = DateUtil.ceiling(date, DateField.MONTH, false);
Assertions.assertEquals("2017-03-31 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
//
begin = DateUtil.ceiling(date, DateField.YEAR);
begin = DateUtil.ceiling(date, DateField.YEAR, false);
Assertions.assertEquals("2017-12-31 23:59:59.999", begin.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
}
@Test
public void roundTest(){
public void roundTest() {
// issues#I5M2I0
final String dateStr = "2022-08-12 14:59:21.500";
final Date date = DateUtil.parse(dateStr);

View File

@ -92,7 +92,7 @@ public class DateTimeTest {
// 精确到毫秒
final DateTime endTime = new DateTime("2017-12-31 23:59:59.999", DatePattern.NORM_DATETIME_MS_FORMAT);
dateTime = DateUtil.endOfQuarter(dateTime);
dateTime = DateUtil.endOfQuarter(dateTime, false);
Assertions.assertEquals(endTime, dateTime);
}

View File

@ -113,14 +113,14 @@ public class DateUtilTest {
final Date beginOfDay = DateUtil.beginOfDay(date);
Assertions.assertEquals("2017-03-01 00:00:00", beginOfDay.toString());
// 一天的结束
final Date endOfDay = DateUtil.endOfDay(date);
final Date endOfDay = DateUtil.endOfDay(date, false);
Assertions.assertEquals("2017-03-01 23:59:59", endOfDay.toString());
}
@Test
public void endOfDayTest() {
final Date parse = DateUtil.parse("2020-05-31 00:00:00");
Assertions.assertEquals("2020-05-31 23:59:59", DateUtil.endOfDay(parse).toString());
Assertions.assertEquals("2020-05-31 23:59:59", DateUtil.endOfDay(parse, false).toString());
}
@Test
@ -137,7 +137,7 @@ public class DateUtilTest {
final Date date2 = DateUtil.parse(dateStr2);
DateTime dateTime = DateUtil.ceiling(date2, DateField.MINUTE);
DateTime dateTime = DateUtil.ceiling(date2, DateField.MINUTE, false);
Assertions.assertEquals("2020-02-29 12:59:59.999", dateTime.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
dateTime = DateUtil.ceiling(date2, DateField.MINUTE, true);
@ -150,7 +150,7 @@ public class DateUtilTest {
final Date date2 = DateUtil.parse(dateStr2);
DateTime dateTime = DateUtil.ceiling(date2, DateField.DAY_OF_MONTH);
DateTime dateTime = DateUtil.ceiling(date2, DateField.DAY_OF_MONTH, false);
Assertions.assertEquals("2020-02-29 23:59:59.999", dateTime.toString(DatePattern.NORM_DATETIME_MS_PATTERN));
dateTime = DateUtil.ceiling(date2, DateField.DAY_OF_MONTH, true);
@ -167,7 +167,7 @@ public class DateUtilTest {
final Date beginOfWeek = DateUtil.beginOfWeek(date);
Assertions.assertEquals("2017-02-27 00:00:00", beginOfWeek.toString());
// 一周的结束
final Date endOfWeek = DateUtil.endOfWeek(date);
final Date endOfWeek = DateUtil.endOfWeek(date, true, false);
Assertions.assertEquals("2017-03-05 23:59:59", endOfWeek.toString());
final Calendar calendar = CalendarUtil.calendar(date);
@ -175,7 +175,7 @@ public class DateUtilTest {
final Calendar begin = CalendarUtil.beginOfWeek(calendar);
Assertions.assertEquals("2017-02-27 00:00:00", DateUtil.date(begin).toString());
// 一周的结束
final Calendar end = CalendarUtil.endOfWeek(calendar);
final Calendar end = CalendarUtil.endOfWeek(calendar, true, false);
Assertions.assertEquals("2017-03-05 23:59:59", DateUtil.date(end).toString());
}
@ -188,7 +188,7 @@ public class DateUtilTest {
Assertions.assertEquals("2020-03-08 00:00:00", DateUtil.date(begin).toString());
final Calendar calendar2 = date.toCalendar();
final Calendar end = CalendarUtil.endOfWeek(calendar2, false);
final Calendar end = CalendarUtil.endOfWeek(calendar2, false, false);
Assertions.assertEquals("2020-03-14 23:59:59", DateUtil.date(end).toString());
}
@ -743,14 +743,14 @@ public class DateUtilTest {
public void endOfYearTest() {
final DateTime date = DateUtil.now();
date.setField(DateField.YEAR, 2019);
final DateTime endOfYear = DateUtil.endOfYear(date);
final DateTime endOfYear = DateUtil.endOfYear(date, false);
Assertions.assertEquals("2019-12-31 23:59:59", endOfYear.toString());
}
@Test
public void endOfQuarterTest() {
final Date date = DateUtil.endOfQuarter(
DateUtil.parse("2020-05-31 00:00:00"));
DateUtil.parse("2020-05-31 00:00:00"), false);
Assertions.assertEquals("2020-06-30 23:59:59", DateUtil.format(date, "yyyy-MM-dd HH:mm:ss"));
}
@ -762,7 +762,7 @@ public class DateUtilTest {
final DateTime startOfWeek = DateUtil.beginOfWeek(now);
Assertions.assertEquals("2019-09-09 00:00:00", startOfWeek.toString());
final DateTime endOfWeek = DateUtil.endOfWeek(now);
final DateTime endOfWeek = DateUtil.endOfWeek(now, true, false);
Assertions.assertEquals("2019-09-15 23:59:59", endOfWeek.toString());
final long between = DateUtil.between(endOfWeek, startOfWeek, DateUnit.DAY);

View File

@ -50,7 +50,7 @@ public class CronPatternUtil {
* @return 日期列表
*/
public static List<Date> matchedDates(final String patternStr, final Date start, final int count) {
return matchedDates(patternStr, start, DateUtil.endOfYear(start), count);
return matchedDates(patternStr, start, DateUtil.endOfYear(start, false), count);
}
/**