DateUtil.java 5.83 KB
package com.infoloop.tianting.utils;

import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public final class DateUtil extends DateUtils {

    public final static ZoneId CHINA_ZONE = ZoneId.of("Asia/Shanghai");

    public final static DateTimeFormatter YYYY = DateTimeFormatter
            .ofPattern("yyyy")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YM = DateTimeFormatter
            .ofPattern("yyyyMM")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter Y_M = DateTimeFormatter
            .ofPattern("yyyy-MM")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YYYY_MM_LEFT_SYMBOL = DateTimeFormatter
            .ofPattern("yyyy/MM")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YMD = DateTimeFormatter
            .ofPattern("yyyyMMdd")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YYYY_MM_DD = DateTimeFormatter
            .ofPattern("yyyy-MM-dd")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YYYY_MM_DD_UTC = DateTimeFormatter
            .ofPattern("yyyy-MM-dd");
    public final static DateTimeFormatter YYYY_MM_DD_LEFT_SYMBOL = DateTimeFormatter
            .ofPattern("yyyy/MM/dd")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter MM_DD_CN = DateTimeFormatter
            .ofPattern("MM月dd日")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter HH_MM_SS = DateTimeFormatter
            .ofPattern("HH:mm:ss")
            .withZone(CHINA_ZONE);

    public final static DateTimeFormatter YYYY_MM_DD_HH_MM = DateTimeFormatter
            .ofPattern("yyyy-MM-dd HH:mm")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YYYY_MM_DD_HH_MM_LEFT_SYMBOL = DateTimeFormatter
            .ofPattern("yyyy/MM/dd HH:mm")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YMDHMS = DateTimeFormatter
            .ofPattern("yyyyMMddHHmmss")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter Y_M_D_H_M_S = DateTimeFormatter
            .ofPattern("yyyy-MM-dd HH:mm:ss")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter Y_M_D_H_M_S_LEFT_SYMBOL = DateTimeFormatter
            .ofPattern("yyyy/MM/dd HH:mm:ss")
            .withZone(CHINA_ZONE);
    public final static DateTimeFormatter YMDHMSSSS = DateTimeFormatter
            .ofPattern("yyyyMMddHHmmssSSS")
            .withZone(CHINA_ZONE);
    private static final String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    private DateUtil() {
    }

    public static String formatDate(final long epochMillis) {
        if (epochMillis == 0) {
            return null;
        }
        return ZonedDateTime
                .ofInstant(Instant.ofEpochMilli(epochMillis), ZoneOffset.UTC.normalized())
                .format(DateTimeFormatter.ISO_INSTANT);
    }

    public static String formatDate(final long epochMillis, DateTimeFormatter formatter) {
        if (epochMillis == 0L) {
            return null;
        }
        return Instant.ofEpochMilli(epochMillis).atZone(CHINA_ZONE)
                .format(formatter);
    }

    public static String formatDateOfUtc(final long epochMillis, DateTimeFormatter formatter) {
        if (epochMillis == 0L) {
            return null;
        }
        return Instant.ofEpochMilli(epochMillis).atOffset(ZoneOffset.UTC)
            .format(formatter);
    }

    public static String formatDate(final LocalDate localDate, DateTimeFormatter formatter) {
        if (localDate == null) {
            return null;
        }
        return formatter.format(localDate);
    }

    public static String formatDate(final LocalDateTime localDateTime, DateTimeFormatter formatter) {
        if (localDateTime == null) {
            return null;
        }
        return formatter.format(localDateTime);
    }

    public static Long toEpochMilli(final String utcDate) {
        if (utcDate == null || utcDate.isEmpty()) {
            return null;
        }
        return Instant.parse(utcDate).toEpochMilli();
    }

    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    public static String parseDateToStr(final String format, final Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 增加 LocalDateTime ==> Date
     */
    public static Date toDate(LocalDateTime temporalAccessor) {
        ZonedDateTime zdt = temporalAccessor.atZone(CHINA_ZONE);
        return Date.from(zdt.toInstant());
    }

    /**
     * 增加 LocalDate ==> Date
     */
    public static Date toDate(LocalDate temporalAccessor) {
        LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
        return toDate(localDateTime);
    }

    public static LocalDate toLocalDate(long timestamp) {
       return Instant.ofEpochMilli(timestamp).atZone(CHINA_ZONE).toLocalDate();
    }

    public static LocalDateTime toLocalDateTime(long timestamp) {
        return Instant.ofEpochMilli(timestamp).atZone(CHINA_ZONE).toLocalDateTime();
    }

}