时间工具:获取《月的第一周的第一天》、《月的最后一天》、《当日零点时间戳》

    /**
     * @return java.util.Date
     * @author xianghu.wang
     * @date 2019/3/9
     * @param: date
     * @description 获取指定时间所在月的第一周的第一天
     */
    public static Date getFirstDayOfWeekAndMonth(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
        // 月的第一天
        LocalDateTime firstOfMonth = localDateTime;
        // 月的第一周的第一天
        LocalDateTime firstOfWeekAndMonth = firstOfMonth;

        int dayOfMonth = localDateTime.getDayOfMonth();
        // 如果不是当月的第一天,向前推到月的第一天
        if (dayOfMonth != 1) {
            firstOfMonth = localDateTime.minusDays(dayOfMonth - 1);
        }
        // 如果不是周一,向后推到周一
        if (firstOfMonth.getDayOfWeek().getValue() != 1) {
            firstOfWeekAndMonth = firstOfMonth.plusDays(8 - firstOfMonth.getDayOfWeek().getValue());
        }

        Instant firstOfWeekAndMonthInstant = firstOfWeekAndMonth.atZone(zone).toInstant();
        return Date.from(firstOfWeekAndMonthInstant);
    }

    /**
     * @return java.util.Date
     * @author xianghu.wang
     * @date 2019/3/10
     * @param: date
     * @description 获取月的最后一天
     */
    public static Date getLastDayOfMonth(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime now = LocalDateTime.ofInstant(instant, zone);

        // 月的第后一天(假装该天是月的最后一天)
        LocalDateTime lastOfMonth = now;

        // 是否是闰年
        boolean leapYear = Year.of(lastOfMonth.getYear()).isLeap();
        // 该月的长度
        final int length = lastOfMonth.getMonth().length(leapYear);
        // 如果不是,向后推到最后一天
        if (lastOfMonth.getDayOfMonth() != length) {
            lastOfMonth = lastOfMonth.plusDays(length - lastOfMonth.getDayOfMonth());
        }

        Instant lastOfMonthInstant = lastOfMonth.atZone(zone).toInstant();
        return Date.from(lastOfMonthInstant);
    }

    /**
     * @return long
     * @author xianghu.wang
     * @date 2019/3/11
     * @param: date
     * @description 获取指定日期当日零点时间戳 13位
     */
    public static long getZeroTimeOfDay(Date date) {
        //ONE_DAY_MILLIONS 建议在工具类中定义成常量
        long ONE_DAY_MILLIONS = 24 * 60 * 60 * 1000;
        long redundant = date.getTime() % ONE_DAY_MILLIONS + TimeZone.getDefault().getRawOffset();
        return date.getTime() - redundant;
    }

猜你喜欢

转载自blog.csdn.net/Mathieu66/article/details/88376185