package com.hq.schoolcj.util;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class DateUtils {
/**
* 时间格式(yyyy-MM-dd)
*/
public final static String DATE_PATTERN = "yyyy-MM-dd";
public final static String DATE_PATTERN_FOR_SECOND = "yyyy-MM-dd HH:mm:ss";
public final static String MM_DD_HH_MM = "MM月dd日 HH:mm";
public final static String MM_DD = "MM-dd";
public final static String HH_MM = "HH:mm";
public static final String DEFUALT_LONG_TIME_FORMAT = "yyyyMMddHHmmss";
public static String format(Date date) {
return format(date, DATE_PATTERN);
}
/**
* 计算两个日期的相差月份
* @param startDate 开始时间
* @param endDate 结束时间
* @return
*/
public static Integer getDifMonth(Date startDate, Date endDate){
if (startDate == null || endDate == null) {
return 0;
}
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.setTime(startDate);
end.setTime(endDate);
int result = end.get(Calendar.MONTH) - start.get(Calendar.MONTH);
int month = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12;
return Math.abs(month + result);
}
/**
* 日期转字符串
*
* @param date
* @param pattern
* @return
*/
public static String format(Date date, String pattern) {
if (date != null) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
}
/**
* 日期字符串转时间戳
*
* @param dateStr
* @return
*/
public static Integer transForMilliSecond(String dateStr) {
Date date = DateUtils.formatDate(dateStr);
return date == null ? null : DateUtils.transForMilliSecond(date);
}
/**
* 日期字符串转日期
*
* @param string
* @param pattern
* @return
*/
public static Date formatDate(String string, String pattern) {
if (StringUtils.isNotBlank(string)) {
try {
return new SimpleDateFormat(pattern).parse(string);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 字符串转日期
*
* @param string
* @return
*/
public static Date formatDate(String string) {
return formatDate(string, DATE_PATTERN);
}
/**
* 日期转时间戳 (秒)
*
* @param date
* @return
*/
public static Integer transForMilliSecond(Date date) {
if (date == null) {
return null;
}
return (int) (date.getTime() / 1000);
}
/**
* 时间戳转日期字符串"yyyy-MM-dd"
*
* @param ms
* @return
*/
public static String transForDate(Integer ms) {
String str = "";
if (ms != null) {
long msl = (long) ms * 1000;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if (ms != null) {
try {
str = sdf.format(msl);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return str;
}
/**
* 时间戳转日期字符串"yyyy-MM-dd"或"yyyy-MM-dd HH:mm:ss"
*精确到毫秒的字符串
* @param seconds
* @return
*/
public static String transForDate(String seconds, String pattern) {
if(seconds == null || seconds.isEmpty() || seconds.equals("null")){
return "";
}
if(pattern == null || pattern.isEmpty()){
pattern = "yyyy-MM-dd HH:mm:ss";
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(new Date(Long.valueOf(seconds)));
}
/**
* 订单有效期,获取当前时间完后day天后的时间
*
* @param day 推移时间
* @return 推移后的时间
*/
public static Date orderDateValidity(Long day) {
return getDateAfter(new Date(), day.intValue());
}
/***
*
* @param d
* :Base Date
* @param day
* :Delayed days
* @return
*/
public static java.util.Date getDateAfter(Date d, int day) {
Calendar now = Calendar.getInstance();
now.setTime(d);
now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
return now.getTime();
}
/**
* 给时间加上几个小时
*
* @param date 当前时间 格式:yyyy-MM-dd HH:mm:ss
* @param hour 需要加的时间
* @return
*/
public static String addDateHour(Date date, int hour) {
if (date == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR_OF_DAY, hour);
date = cal.getTime();
return format(date, DEFUALT_LONG_TIME_FORMAT);
}
/**
* 获取现在时间
*
* @return 返回时间类型 yyyy-MM-dd HH:mm:ss
*/
public static Date getNowDate() {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
ParsePosition pos = new ParsePosition(8);
Date currentTime_2 = formatter.parse(dateString, pos);
return currentTime_2;
}
/**
* 得到现在时间
*
* @return
*/
public static Date getNow() {
Date currentTime = new Date();
return currentTime;
}
/*
* 把时间戳装换为时间字符串
*
* */
public static String getDateString4LongTime(Long timeStamp) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(new Date(timeStamp));
}
public static String dateToString(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN_FOR_SECOND);
return sdf.format(date);
}
public static Date stringToDate(String date, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try {
return sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return new Date();
}
/***
*
* @param d : 基准时间
* @param day : 几天前
* @return
*/
public static Date getDateBefore(Date d, int day) {
Calendar now = Calendar.getInstance();
now.setTime(d);
now.set(Calendar.DATE, now.get(Calendar.DATE) - day);
return now.getTime();
}
public static Date parse(String string, String pattern) {
if (StringUtils.isNotBlank(string)) {
try {
return new SimpleDateFormat(pattern).parse(string);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
public static Date parse(String string) {
return parse(string, DATE_PATTERN);
}
/**
* 毫秒转化为xx小时xx分钟
*
* @param longTime
* @return
*/
public static String longTimeToString(Long longTime) {
if (longTime == null || longTime == 0L) {
return "";
}
int hour = (int) (longTime / (1000 * 60 * 60));
int min = (int) ((longTime % (1000 * 60 * 60)) / (1000 * 60));
if (hour < 1) {
return min + "分钟";
} else if (hour >= 1 && min == 0) {
return hour + "小时";
} else if (hour >= 1 && min > 0) {
return hour + "小时" + min + "分钟";
}
return "";
}
/**
* 日期转化为String
*
* @param date
* @return date string
* @author xuyidong
*/
public static String toString(Date date) {
if (null == date) {
return null;
}
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
return sdf.format(date);
} catch (Exception e) {
return null;
}
}
/**
* 指定日期加指定天数
*
* @param date
* @param dayNum
* @return
*/
public static String convertDate(Date date, int dayNum) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, dayNum);
Date date2 = calendar.getTime();
String dateFormat = sdf.format(date2);
return dateFormat;
}
/**
* 当前时间添加时间
* @param type 1代表 日 2代表 月 3代表 年
* @param num 数量
* @return
*/
public static Date convertDate(int type,Integer num){
if(num==null){
num=0;
}
SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN_FOR_SECOND);
Date nowDate = new Date();
try{
nowDate=sdf.parse(sdf.format(nowDate));
}catch (Exception e){
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(nowDate);
if(type==1){
calendar.add(Calendar.DATE, num);
}else if(type==2){
calendar.add(Calendar.MONTH, num);
}else if(type==3){
calendar.add(Calendar.YEAR, num);
}
Date date2 = calendar.getTime();
return date2;
}
public static void main(String[] args) {
// Date a = formatDate("2019-12-27", "yyyy-MM-dd");
// Date b = formatDate("2020-01-11", "yyyy-MM-dd");
// Integer difMonth = getDifMonth(a, b);
// System.out.println(difMonth);
// int i = new Date() - formatDate("2019-12-07 17:30:);
}
/**
* Date 转化为jdk8 LocalDate
*
* @param date
* @return LocalDate
* @author chen xin yu
* @date 2019-09-02 20:05
*/
public static LocalDate dateToLocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}
/**
* jdk8 LocalDate 转化为 Date
*
* @param localDate
* @return Date
* @author chen xin yu
* @date 2019-09-02 20:06
*/
public static Date LocalDateToDate(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
/**
* jdk8 LocalDateTime 转化为 Date
*
* @param localDateTime
* @return Date
* @author chen xin yu
* @date 2019-09-02 20:06
*/
public static Date LocalDateTimeToDate(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
/**
* Date 转化为jdk8 LocalDateTime
*
* @param date
* @return LocalDate
* @author chen xin yu
* @date 2019-09-02 20:05
*/
public static LocalDateTime dateToLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime;
}
/**
* 时间加上指定天数后的日期
*
* @param date 时间
* @param day 增加的天数
* @return date 返回最终时间零点的毫秒值
*/
public static Date datePlusDays(Date date, long day) {
//支付时间
LocalDateTime localDateTime = DateUtils.dateToLocalDateTime(date);
//订单有效期截止时间
LocalDate localDate = localDateTime.plusDays(day).toLocalDate();
return DateUtils.LocalDateToDate(localDate);
}
/**
* 天数转化为xx年xx月
*
* @param day 天数
* @return
*/
public static String dayToYearMonth(Long day) {
if (day == null || day == 0L) {
return "";
}
int year = (int) (day / 365);
int month = (int) ((day % 365)/30);
if (year < 1) {
return month + "个月";
} else if (year >= 1 && month == 0) {
return year + "年";
} else if (year >= 1 && month > 0) {
return year + "年" + month + "个月";
}
return "";
}
/**
* 按照指定格式返回当前时间,如果格式为空,则默认为yyyy-MM-dd
*
* @param dateFormat
* @return
*/
public static Date strToDate(String date, String dateFormat) {
if (date == null) {
return null;
}
if (org.apache.commons.lang.StringUtils.isBlank(dateFormat)) {
if (date.length() > 10) {
dateFormat = DEFUALT_LONG_TIME_FORMAT;
} else {
dateFormat = DATE_PATTERN;
}
}
try {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.parse(date);
} catch (Exception e) {
return null;
}
}
}