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);
}
}
02-28
145