java日期工具类




import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

import java.sql.Timestamp;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;

import org.joda.time.format.DateTimeFormat;

import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;

/**
 * 日期工具类
 *
 */
public class DateUtils {

    public static final String msf = "yyyyMMddHHmmssSSS";
    public static final String sf = "yyyyMMddHHmmss";
    public static final String mf = "yyyyMMddHHmm";
    public static final String hf = "yyyyMMddHH";
    public static final String df = "yyyyMMdd";
    public static final String Mf = "yyyyMM";
    public static final String M_F = "yyyy/MM";
    public static final String M_D_F = "yyyy/MM/dd";
    public static final String yf = "yyyy";
    public static final String yyyy_D_MM = "yyyy.MM";


    public static final String yyyy_MM_dd_HH_mm_ss_SSS = "yyyy-MM-dd HH:mm:ss:SSS";
    public static final String yyyy_MM_dd_HH_mm_ss_D_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String MM_dd_HH_mm_ss = "MM-dd HH:mm:ss";
    public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
    public static final String yyyy_MM_dd = "yyyy-MM-dd";
    public static final String yyyy_MM = "yyyy-MM";
    public static final String yyyyMMddHHmmss = "yyyy/MM/dd HH:mm:ss";
    public static final String CN_YYYY_MM_DD = "yyyy年MM月dd日";
    public static final String yyyy_MM_dd_HH = "yyyy-MM-dd HH";

    public static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    /**
     * 格式化时间
     *
     * @param date    Date 需要格式化的时间
     * @param pattern 时间格式
     * @return 格式化后的字符串
     */
    public static String formatDate(Date date, String pattern) {
        return new DateTime(date).toString(pattern);
    }

    /**
     * 获取时间戳的long类型
     *
     * @param timeStamp
     * @return 格式化后的字符串
     */
    public static Long getTimeStampvalue(Timestamp timeStamp) {
        return timeStamp.getTime();
    }

    /**
     * 格式化时间
     *
     * @param ts      Timestamp 需要格式化的时间
     * @param pattern 时间格式
     * @return 格式化后的字符串
     */
    public static String formatTimestamp(Timestamp ts, String pattern) {
        if (ts == null) {
            return "";
        }
        return new DateTime(ts).toString(pattern);
    }

    /**
     * 解析时间字符串
     *
     * @param dateStr 时间字符串
     * @param pattern 相应的格式
     * @return 解析后的Date
     */
    public static Date parseDate(String dateStr, String pattern) {
        org.joda.time.format.DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(pattern);
        return DateTime.parse(dateStr, dateTimeFormatter).toDate();
    }

    /**
     * 增加/减少 天数
     *
     * @param date 时间
     * @param days 增加(正整数)或减少(负整数)的天数
     * @return 增加后的时间
     */
    public static Date addDays(Date date, int days) {
        DateTime dateTime = new DateTime(date);
        DateTime dt = dateTime.plusDays(days);
        return dt.toDate();
    }

    /**
     * 增加/减少 月
     *
     * @param date   时间
     * @param months 增加(正整数)或减少(负整数)的月
     * @return 增加后的时间
     */
    public static Date addMonths(Date date, int months) {
        DateTime dateTime = new DateTime(date);
        DateTime dt = dateTime.plusMonths(months);
        return dt.toDate();
    }

    /**
     * 增加/减少 年份
     *
     * @param date  时间
     * @param years 增加(正整数)或减少(负整数)的年份
     * @return 增加后的时间
     */
    public static Date addYears(Date date, int years) {
        DateTime dateTime = new DateTime(date);
        DateTime dt = dateTime.plusYears(years);
        return dt.toDate();
    }

    /**
     * 增加/减少 分钟
     *
     * @param date    时间
     * @param minutes 增加(正整数)或减少(负整数)的分钟
     * @return 增加后的时间
     */
    public static Date addMinutes(Date date, int minutes) {
        DateTime dateTime = new DateTime(date);
        DateTime dt = dateTime.plusMinutes(minutes);
        return dt.toDate();
    }

    /**
     * 增加/减少 小时
     *
     * @param date  时间
     * @param hours 增加(正整数)或减少(负整数)的分钟
     * @return 增加后的时间
     */
    public static Date addHour(Date date, int hours) {
        DateTime dateTime = new DateTime(date);
        DateTime dt = dateTime.plusHours(hours);
        return dt.toDate();
    }

    /**
     * 计算该日期所属月份的最后一天
     *
     * @param dateStr 查询月份(格式: yyyy-MM-DD)
     * @return 该月最后一天
     */
    public static String getLastDayOfMonth(String dateStr) {
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        Date date = parseDate(dateStr, yyyy_MM_dd);
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
        LocalDateTime endOfDay = localDateTime.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
        Date lastDay = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
        return formatDate(lastDay, yyyy_MM_dd);
    }

    /**
     * 计算该日期所属月份的第一天
     *
     * @param dateStr 查询月份(格式: yyyy-MM-DD)
     * @return 该月最后一天
     */
    public static String getFirstDayOfMonth(String dateStr) {
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        Date date = parseDate(dateStr, yyyy_MM_dd);
        return getFirstDayOfMonth(date, yyyy_MM_dd);
    }

    /**
     * 计算该日期(Date)所属月份的第一天
     *
     * @param date 日期
     * @return 该月第一天
     */
    public static String getFirstDayOfMonth(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
        LocalDateTime firstDateTime = localDateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
        Date firstDay = Date.from(firstDateTime.atZone(ZoneId.systemDefault()).toInstant());
        return formatDate(firstDay, pattern);
    }

    /**
     * 计算该日期(Date)所属月份的最后一天
     *
     * @param date 日期
     * @return 该月最后一天
     */
    public static String getLastDayOfMonth(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
        LocalDateTime firstDateTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
        Date firstDay = Date.from(firstDateTime.atZone(ZoneId.systemDefault()).toInstant());
        return formatDate(firstDay, pattern);
    }

    /**
     * 计算返回两个月份之间的所有月份的集合
     *
     * @param startMonth yyyyMM
     * @param endMonth   yyyyMM
     * @return List of yyyyMM
     */
    public static List<String> calcMonthBetweenMonth(String startMonth, String endMonth) {
        List<String> monthList = new ArrayList<>();
        LocalDate startDate = parseDate(startMonth, Mf).toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate endDate = parseDate(endMonth, Mf).toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        long months = ChronoUnit.MONTHS.between(startDate, endDate);
        for (long x = 0; x <= months; x++) {
            Date start = parseDate(startMonth, Mf);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(start);
            calendar.add(Calendar.MONTH, (int) x);
            String month = formatDate(calendar.getTime(), Mf);
            monthList.add(month);
        }
        return monthList;
    }

    /**
     * 获取当年的第一天
     */
    public static Date getCurrentFirstOfYear() {
        Calendar currCal = Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return getFirstOfYear(currentYear);
    }

    /**
     * 获取某年第一天日期
     *
     * @param year 年份
     * @return Date
     */
    public static Date getFirstOfYear(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        return calendar.getTime();
    }

    /**
     * string转localdatetime
     *
     * @param str
     * @return
     */
    public static LocalDateTime parseLocalDateTime(String str) {
        if (org.apache.commons.lang3.StringUtils.isEmpty(str)) return null;
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(yyyy_MM_dd);
        try {
            LocalDate date = LocalDate.parse(str, dateFormatter);
            LocalTime time = LocalTime.parse("00:00:00");
            LocalDateTime dateTime = date.atTime(time);
            System.out.println(dateTime);
            return dateTime;
        } catch (DateTimeParseException e) {
            throw new DataPreservationException("时间日期格式转化异常");
        }
    }

    /**
     * string转localdate
     *
     * @param str
     * @return
     */
    public static LocalDate parseLocalDate(String str) {
        if (StringUtils.isEmpty(str)) return null;
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(yyyy_MM_dd);
        return LocalDate.parse(str, dateFormatter);
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值