解决CalendarUtil.isSameDay时区不同导致结果错误问题

This commit is contained in:
Looly
2024-04-16 17:34:40 +08:00
parent bbc39f9386
commit 4f72daa986

View File

@@ -38,6 +38,8 @@ import java.util.TimeZone;
*/ */
public class CalendarUtil { public class CalendarUtil {
// region ----- calendar
/** /**
* 创建Calendar对象时间为默认时区的当前时间 * 创建Calendar对象时间为默认时区的当前时间
* *
@@ -96,6 +98,21 @@ public class CalendarUtil {
return cal; return cal;
} }
/**
* 转换为指定时区的Calendar返回新的Calendar
*
* @param calendar 时间
* @param timeZone 新时区
* @return 指定时区的新的calendar对象
*/
public static Calendar calendar(Calendar calendar, final TimeZone timeZone) {
// 转换到统一时区例如UTC
calendar = (Calendar) calendar.clone();
calendar.setTimeZone(timeZone);
return calendar;
}
// endregion
/** /**
* 是否为上午 * 是否为上午
* *
@@ -379,7 +396,11 @@ public class CalendarUtil {
* @param cal2 日期2 * @param cal2 日期2
* @return 是否为同一天 * @return 是否为同一天
*/ */
public static boolean isSameDay(final Calendar cal1, final Calendar cal2) { public static boolean isSameDay(final Calendar cal1, Calendar cal2) {
if (ObjUtil.notEquals(cal1.getTimeZone(), cal2.getTimeZone())) {
// 统一时区
cal2 = calendar(cal2, cal1.getTimeZone());
}
return isSameYear(cal1, cal2) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); return isSameYear(cal1, cal2) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
} }
@@ -400,7 +421,13 @@ public class CalendarUtil {
// 防止比较前修改原始Calendar对象 // 防止比较前修改原始Calendar对象
cal1 = (Calendar) cal1.clone(); cal1 = (Calendar) cal1.clone();
cal2 = (Calendar) cal2.clone();
if (ObjUtil.notEquals(cal1.getTimeZone(), cal2.getTimeZone())) {
// 统一时区
cal2 = calendar(cal2, cal1.getTimeZone());
} else {
cal2 = (Calendar) cal2.clone();
}
// 把所传日期设置为其当前周的第一天 // 把所传日期设置为其当前周的第一天
// 比较设置后的两个日期是否是同一天true 代表同一周 // 比较设置后的两个日期是否是同一天true 代表同一周
@@ -427,7 +454,12 @@ public class CalendarUtil {
* @return 是否为同一月 * @return 是否为同一月
* @since 5.4.1 * @since 5.4.1
*/ */
public static boolean isSameMonth(final Calendar cal1, final Calendar cal2) { public static boolean isSameMonth(final Calendar cal1, Calendar cal2) {
if (ObjUtil.notEquals(cal1.getTimeZone(), cal2.getTimeZone())) {
// 统一时区
cal2 = calendar(cal2, cal1.getTimeZone());
}
return isSameYear(cal1, cal2) && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH); return isSameYear(cal1, cal2) && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
} }
@@ -439,10 +471,16 @@ public class CalendarUtil {
* @param cal2 日期2 * @param cal2 日期2
* @return 是否为同一年 * @return 是否为同一年
*/ */
public static boolean isSameYear(final Calendar cal1, final Calendar cal2) { public static boolean isSameYear(final Calendar cal1, Calendar cal2) {
if (cal1 == null || cal2 == null) { if (cal1 == null || cal2 == null) {
throw new IllegalArgumentException("The date must not be null"); throw new IllegalArgumentException("The date must not be null");
} }
if (ObjUtil.notEquals(cal1.getTimeZone(), cal2.getTimeZone())) {
// 统一时区
cal2 = calendar(cal2, cal1.getTimeZone());
}
return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && // return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && //
// issue#3011@Github // issue#3011@Github
cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA); cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA);