Java8的日期处理

介绍Java8中对始建于日期的各种处理

Posted by qin4zhang on August 10, 2019

注意

想法及时记录,实现可以待做。

示例介绍

java8提供了一系列全新的处理时间日期的方法,下面就来列举工作中常用的示例吧。

    /**
     * 默认时区是东八区
     */
    private final static String DEFAULT_ZONE_ID = "Asia/Shanghai";

将字符串格式的时间转为时间戳

    /**
     * 将字符串格式的时间转为时间戳
     *
     * @param time    时间字符串
     * @param pattern 格式化
     * @param zoneId  时区
     * @return 时间戳
     */
    public static long formatter(String time, String pattern, String zoneId) {
        if (StringUtil.isBlank(time)) {
            throw new IllegalArgumentException("Invalid time");
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.parse(time, formatter).atZone(ZoneId.of(zoneId)).toInstant().toEpochMilli();
    }

    /**
     * 将字符串格式的时间转为时间戳
     *
     * @param time    时间字符串
     * @param pattern 格式化
     * @return 时间戳
     */
    public static long formatter(String time, String pattern) {
        return formatter(time, pattern, DEFAULT_ZONE_ID);
    }

格式化时间戳,格式化出来的字符串可以带时区

    /**
     * 格式化时间戳,格式化出来的字符串可以带时区
     *
     * @param timestamp 时间戳
     * @param pattern   格式化
     * @param zoneId    时区
     * @return 格式化后的字符串
     */
    public static String formatter(long timestamp, String pattern, String zoneId) {
        if (timestamp < 0) {
            throw new IllegalArgumentException("Invalid milliseconds");
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.of(zoneId)).format(formatter);
    }

    /**
     * 东八区的时间戳格式化
     *
     * @param timestamp 时间戳
     * @param pattern   格式化
     * @return 格式化后的字符串
     */
    public static String formatter(long timestamp, String pattern) {
        return formatter(timestamp, pattern, DEFAULT_ZONE_ID);
    }

获取指定时间所在的是第几个季度

    /**
     * 获取指定时间所在的是第几个季度
     * <p>
     * The quarter-of-year has values from 1 to 4
     *
     * @param timestamp 给定的时间戳
     * @return 获取指定时间所在的是第几个季度
     */
    public static int getQuarterPositionOfTime(long timestamp) {
        return LocalDate.from(Instant.ofEpochMilli(timestamp).atZone(ZoneId.of(DEFAULT_ZONE_ID))).get(IsoFields.QUARTER_OF_YEAR);
    }

比当前月份更前的月份月末

    /**
     * 比当前月份更前的月份月末
     * <p>
     * 比如 1 -> 上个月,2 ->上上个月,0 -> 当月,-1 -> 下一个月
     *
     * @param monthsToSubtract monthsToSubtract the months to subtract, may be negative
     * @return 当前月份偏移的月份的最后一天最后一毫秒
     */
    public static long getSubtractMonthEndTime(long monthsToSubtract) {
        LocalDate date = LocalDate.now().minusMonths(monthsToSubtract);
        LocalDate endDate = date.with(TemporalAdjusters.lastDayOfMonth());
        LocalDateTime endTime = endDate.atTime(23, 59, 59, 999999999);
        return endTime.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
    }

比当前月份更前的月份月初

    /**
     * 比当前月份更前的月份月初,
     * <p>
     * 比如 1 -> 上个月,2 ->上上个月,0 -> 当月,-1 -> 下一个月
     *
     * @param monthsToSubtract the months to subtract, may be negative
     * @return 当前月份偏移的月份的第一天凌晨
     */
    public static long getSubtractMonthStartTime(long monthsToSubtract) {
        LocalDate date = LocalDate.now().minusMonths(monthsToSubtract);
        LocalDate startDate = date.with(TemporalAdjusters.firstDayOfMonth());
        LocalDateTime startTime = startDate.atTime(0, 0, 0, 0);
        return startTime.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
    }

获取指定时间戳的所在月份的第1日00:00:00时间戳

    /**
     * 获取指定时间戳的所在月份的第1日00:00:00时间戳
     *
     * @param timestamp 给定的时间戳
     * @return 获取指定时间戳的所在月份的第1日00:00:00时间戳
     **/
    public static long getFirstDayOfMonth(long timestamp) {
        LocalDate today = LocalDate.from(Instant.ofEpochMilli(timestamp).atZone(ZoneId.of(DEFAULT_ZONE_ID)));
        //本月的第一天
        LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth(), 1);
        LocalDateTime time = firstDay.atTime(0, 0, 0, 0);
        return time.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
    }

获取指定时间戳所在的「周一」00:00:00时间戳

    /**
     * 获取指定时间戳所在的「周一」00:00:00时间戳
     *
     * @param timestamp 给定的时间戳
     * @return 获取指定时间戳所在的「周一」00:00:00时间戳
     **/
    public static long getMondayOfWeek(long timestamp) {
        LocalDate date = LocalDate.from(Instant.ofEpochMilli(timestamp).atZone(ZoneId.of(DEFAULT_ZONE_ID))).with(DayOfWeek.MONDAY);
        LocalDateTime time = date.atTime(0, 0, 0, 0);
        return time.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
    }