java 之 日期工具类

270 阅读2分钟

判断两个日期是否是同一周

参考

CSDN:java中如何判断两个日期是否是同一周
作者:machinecat0898

代码实现

/**
 * 判断两个日期是否是同一周
 * 设置周一为一周开始。
 * 经过测试发现,只要12月的最后一周有一天跨越到明年,就会被当成明年的第一周,
 * 所以判断两个日期跨年的时候,需要是连续的一周才能正确判断,判断方法就是判断小的年对应的月份是否为12月
 * 如:“2022-12-31”和“2023-01-01”同是2023年的第一周
 * 否则可能会误判两年的第一周为同一周,
 * 如:误判“2022-01-01”和“2023-01-01”为同一周
 *
 * 默认周日为一周开始,原作者的示例:
 * “2004-12-25”是星期六,也就是说它是2004年中第52周的星期六,
 * 那么“2004-12-26”到底是2004年的第几周哪,java中经测试取得的它的Week值是1,
 * 那么也就是说它被看作2005年的第一周了,这个处理是比较好的。
 * 可以用来判断“2004-12-26”和“2005-1-1”是同一周。
 * 参考:https://blog.csdn.net/machinecat0898/article/details/58598959
 *
 * @param date1 日期1,格式:yyyy-MM-dd
 * @param date2 日期2,格式:yyyy-MM-dd
 * @return boolean 返回ture说明是同一周
 */
@SneakyThrows
public static boolean isSameWeek(String date1, String date2) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date d1 = format.parse(date1);
    Date d2 = format.parse(date2);
    Calendar cal1 = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();
    // 设置周一为一周开始
    cal1.setFirstDayOfWeek(Calendar.MONDAY);
    cal2.setFirstDayOfWeek(Calendar.MONDAY);
    cal1.setTime(d1);
    cal2.setTime(d2);
    int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
    // subYear == 0 说明是同一年
    boolean isSameWeek = cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
    if (subYear == 0) {
        return isSameWeek;
    } else if (subYear == 1 && cal2.get(Calendar.MONTH) == Calendar.DECEMBER) {
        // subYear == 1 说明cal1比cal2大一年
        return isSameWeek;
    } else if (subYear == -1 && cal1.get(Calendar.MONTH) == Calendar.DECEMBER) {
        // subYear == 1 说明cal1比cal2小一年
        return isSameWeek;
    }
    return false;
}

public static void main(String[] args) {
    String date1 = "2022-12-31";
    String date2 = "2023-01-01";
    boolean sameWeek = isSameWeek(date1, date2);
    System.out.println("sameWeek:"+sameWeek);
}