package com.nuiiqk.common.util;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DateUtils {
public static final String STARTTIME = " 00:00:00";
public static final String ENDTIME = " 23:59:59";
public final static String FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
public final static String[] REPLACE_STRING = new String[] {"GMT+0800", "GMT+08:00"};
public final static String SPLIT_STRING = "(中国标准时间)";
public static Logger log = LoggerFactory.getLogger(DateUtils.class);
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private final static String in_formate_s = "yyyy-MM-dd";
private final static String in2_formate_s = "yyyy-MM-dd HH:mm:ss";
private final static String out_formate_s = "MM/dd/yyyy";
private final static String out3_formate_s = "MM/dd/yyyy HH:mm:ss";
private static 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 DateUtils() {}
public static String getToDayStartTime() {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
Date date = new Date(System.currentTimeMillis());
return formate.format(date);
}
public static String getToDayEndTime() {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
Date date = new Date(System.currentTimeMillis());
return formate.format(date);
}
public static String getYestodayStartTime() {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
Date date = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L);
return formate.format(date);
}
public static String getYestodayEndTime() {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
Date date = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L);
return formate.format(date);
}
public static String getOneDayStartTime(String oneDay) {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
Date date = new Date(oneDay);
return formate.format(date);
}
public static String getOneDayStartTime(Date oneDay) {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
return formate.format(oneDay);
}
public static String getOneDayEndTime(String oneDay) {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
Date date = new Date(oneDay);
return formate.format(date);
}
public static String getOneDayEndTime(Date oneDay) {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
return formate.format(oneDay);
}
public static Date getWeekStartTime() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return cal.getTime();
}
public static Date strToDateTime(String dateTime) {
Date date = null;
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = format.parse(dateTime);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static Long dateToStamp(String s) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(s);
long ts = date.getTime();
return ts;
}
public static String dateTimeToStr(Date dateTime) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(dateTime);
}
public static String getWeekStartTimeStr() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
return formate.format(cal.getTime());
}
public static Date getWeekEndTime() {
Calendar cal = Calendar.getInstance();
cal.setTime(getWeekStartTime());
cal.add(Calendar.DAY_OF_WEEK, 7);
return cal.getTime();
}
public static String getWeekEndTimeStr() {
Calendar cal = Calendar.getInstance();
cal.setTime(getWeekStartTime());
cal.add(Calendar.DAY_OF_WEEK, 7);
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
return formate.format(cal.getTime());
}
public static String getLastWeekStartTimeStr() {
int weeks = -1;
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 * weeks);
Date monday = currentDate.getTime();
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
return formate.format(monday);
}
public static Date getMonthStartTime() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
return cal.getTime();
}
public static String getMonthStartTimeStr() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
return formate.format(cal.getTime());
}
public static Date getMonthEndTime() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, 24);
return cal.getTime();
}
public static String getMonthEndTimeStr() {
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, 24);
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
return formate.format(cal.getTime());
}
public static int getCurrentMonthDay() {
Calendar a = Calendar.getInstance();
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
public static int getDayByTwoDay(String sj1, String sj2) {
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
Long day = 0L;
try {
Date date = myFormatter.parse(sj1);
Date mydate = myFormatter.parse(sj2);
day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
} catch (Exception e) {
return 0;
}
return day.intValue();
}
public static int getSecondByTwoDay(Date lastDate, Date date) {
Long second = 0L;
try {
second = (lastDate.getTime() - date.getTime()) / 1000;
} catch (Exception e) {
return 0;
}
return second.intValue();
}
public static int getDaysByWeek(String dateTime) throws ParseException {
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat.parse(dateTime);
cal.setTime(date);
int day = cal.get(Calendar.DAY_OF_WEEK);
day = day - 1;
if (day == 0) {
day = 7;
}
return day;
}
public static int getDaysByMonth(String dateTime) throws ParseException {
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat.parse(dateTime);
cal.setTime(date);
int day = cal.get(Calendar.DAY_OF_MONTH);
return day;
}
public static int getDaysByYearMonth(int year, int month) {
Calendar a = Calendar.getInstance();
a.set(Calendar.YEAR, year);
a.set(Calendar.MONTH, month - 1);
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
public static Integer getYears() {
Calendar calendar = new GregorianCalendar(TimeZone.getDefault());
return calendar.get(Calendar.YEAR);
}
public static Integer getMonth() {
Calendar calendar = new GregorianCalendar(TimeZone.getDefault());
return calendar.get(Calendar.MONTH) + 1;
}
public static Integer getDay() {
Calendar calendar = new GregorianCalendar(TimeZone.getDefault());
return calendar.get(Calendar.DAY_OF_MONTH);
}
@SuppressWarnings("unused")
public static String getTime(double hour) {
Calendar calendar = new GregorianCalendar(TimeZone.getDefault());
long time = (long)(System.currentTimeMillis() + hour * 60 * 60 * 1000L);
Date date = new Date(time);
SimpleDateFormat formate = new SimpleDateFormat("yyyyMMddHHmmss");
String format = formate.format(date);
return format;
}
private static int getMondayPlus() {
Calendar cd = Calendar.getInstance();
int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1;
if (dayOfWeek == 1) {
return 0;
} else {
return 1 - dayOfWeek;
}
}
public static Date getDate(String date, int day) {
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
try {
Date beforeDate = formate.parse(date);
cal.setTime(beforeDate);
cal.add(Calendar.DAY_OF_MONTH, day);
Date newDate = cal.getTime();
return newDate;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static String formateDate(Date date, String code) {
SimpleDateFormat formate = new SimpleDateFormat(code);
return formate.format(date);
}
public static ArrayList<String> getDaysByN(int intervals, String formatStr) {
ArrayList<String> pastDaysList = new ArrayList<>();
for (int i = intervals - 1; i >= 0; i--) {
pastDaysList.add(getPastDate(i, formatStr));
}
return pastDaysList;
}
public static String getPastDate(int past, String formatStr) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat(formatStr);
String result = format.format(today);
return result;
}
public static List<String> getDayBetweenDates(String begin, String end) {
Date dBegin = strToDateTime(begin);
Date dEnd = strToDateTime(end);
List<String> lDate = new ArrayList<>();
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
lDate.add(sd.format(dBegin));
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime())) {
calBegin.add(Calendar.DAY_OF_MONTH, 1);
lDate.add(sd.format(calBegin.getTime()));
}
return lDate;
}
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
long diff = endDate.getTime() - nowDate.getTime();
long day = diff / nd;
long hour = diff % nd / nh;
long min = diff % nd % nh / nm;
return day + "天" + hour + "小时" + min + "分钟";
}
public static String dateChange(String inDate) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return "";
}
return new SimpleDateFormat(out_formate_s).format(new SimpleDateFormat(in_formate_s).parse(inDate));
}
public static String dateChange2(String inDate) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return "";
}
return new SimpleDateFormat(in_formate_s).format(new SimpleDateFormat(out_formate_s).parse(inDate));
}
public static String dateChange3(String inDate) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return "";
}
return new SimpleDateFormat(in2_formate_s).format(new SimpleDateFormat(out3_formate_s).parse(inDate));
}
public static String dateChange4(String inDate) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return "";
}
return new SimpleDateFormat(in2_formate_s).format(new SimpleDateFormat(out3_formate_s).parse(inDate));
}
public static Date dateChange1(String inDate) throws ParseException {
return new SimpleDateFormat(in2_formate_s).parse(inDate);
}
public static String dateChange(Date inDate) throws ParseException {
if (inDate == null) {
return "";
}
return new SimpleDateFormat(in2_formate_s).format(inDate);
}
public static String dateChange5(Date inDate) throws ParseException {
if (inDate == null) {
return "";
}
return new SimpleDateFormat(in_formate_s).format(inDate);
}
public static Date dateChange6(String inDate) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return null;
}
return new SimpleDateFormat(out_formate_s).parse(inDate);
}
public static Date dateChange7(String inDate) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return null;
}
return new SimpleDateFormat(in_formate_s).parse(inDate);
}
public static Date stringToDate(String inDate, String format) throws ParseException {
if (org.apache.commons.lang3.StringUtils.isBlank(inDate)) {
return null;
}
return new SimpleDateFormat(format).parse(inDate);
}
public static String dateToString(Date inDate, String format) throws ParseException {
if (inDate == null) {
return "";
}
return new SimpleDateFormat(format).format(inDate);
}
public static String normTime(String time) {
if (StringUtils.isEmpty(time)) {
return "";
}
int index = time.indexOf(".0");
if (index >= 0) {
time = time.substring(0, index);
}
return time;
}
public static boolean isDeadLine(String deadLine) {
boolean result = false;
String start = deadLine.substring(0, deadLine.indexOf("|"));
String end = deadLine.substring(deadLine.indexOf("|") + 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date startDate = sdf.parse(start);
Date endDate = sdf.parse(end);
Calendar calendar = Calendar.getInstance();
calendar.setTime(endDate);
calendar.add(Calendar.DAY_OF_YEAR, 1);
endDate = calendar.getTime();
Date now = new Date();
if (now.after(startDate) && now.before(endDate)) {
result = true;
}
} catch (Exception e) {
log.info("Exception ", e);
}
return result;
}
public static String getNowDateTime() {
return getNowDateTimeFormatter("yyyy-MM-dd HH:mm:ss");
}
public static String getYesterdayDateTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return LocalDateTime.now(ZoneId.of("Asia/Shanghai")).minusDays(1).format(formatter);
}
public static String getYesterdayDate() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1).format(formatter);
}
public static String getNowDate() {
return getNowDateTimeFormatter("yyyy-MM-dd");
}
public static String dateTimeTODate(String timeStr) {
return getDateTimeToFormatter(timeStr, "yyyy-MM-dd");
}
public static int getNowYear() {
return LocalDate.now(ZoneId.of("Asia/Shanghai")).getYear();
}
public static int getNowDayOfMonth() {
return LocalDateTime.now(ZoneId.of("Asia/Shanghai")).getDayOfMonth();
}
public static int getNowDayOfWeek() {
return LocalDate.now(ZoneId.of("Asia/Shanghai")).getDayOfWeek().getValue();
}
public static String getNowTime() {
return getNowDateTimeFormatter("HH:mm:ss");
}
public static int getNowHour() {
return LocalDateTime.now(ZoneId.of("Asia/Shanghai")).getHour();
}
public static String getMicroTimestamp() {
return String.valueOf(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
}
public static String getTimestamp() {
return String.valueOf(LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")));
}
public static String getNowDateTimeFormatter(String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.now(ZoneId.of("Asia/Shanghai")).format(formatter);
}
public static String getDateTimeToFormatter(String timeStr, String pattern) {
if (StringUtils.isEmpty(timeStr)) {
return "";
}
LocalDateTime time = LocalDateTime.parse(timeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return time.format(formatter);
}
public static String getDateToFormatter(String timeStr, String pattern) {
if (StringUtils.isEmpty(timeStr)) {
return "";
}
LocalDate time = LocalDate.parse(timeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return time.format(formatter);
}
public static String getTimeToFormatter(String timeStr, String pattern) {
if (StringUtils.isEmpty(timeStr)) {
return "";
}
LocalTime time = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm:ss"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return time.format(formatter);
}
public static String getDateTimeCode() {
return getNowDateTimeFormatter("yyyyMMddHHmmssSSS");
}
public static LocalDateTime parseDateTime(String timeStr) {
return LocalDateTime.parse(timeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
public static LocalDate parseDate(String timeStr) {
return LocalDate.parse(timeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
public static LocalTime parseTime(String timeStr) {
return LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm:ss"));
}
public static boolean dateTimeAfterNow(String timeStr) {
return parseDateTime(timeStr).isAfter(LocalDateTime.now());
}
public static boolean dateAfterNow(String timeStr) {
return parseDate(timeStr).isAfter(LocalDate.now());
}
public static boolean timeAfterNow(String timeStr) {
return parseTime(timeStr).isAfter(LocalTime.now());
}
public static boolean dateTimeBeforeNow(String timeStr) {
return parseDateTime(timeStr).isBefore(LocalDateTime.now());
}
public static boolean dateBeforeNow(String timeStr) {
return parseDate(timeStr).isBefore(LocalDate.now());
}
public static boolean timeBeforeNow(String timeStr) {
return parseTime(timeStr).isBefore(LocalTime.now());
}
public static boolean dateTimeAfterDateTime(String t1, String t2) {
return parseDateTime(t1).isAfter(parseDateTime(t2));
}
public static boolean dateAfterDate(String t1, String t2) {
return parseDate(t1).isAfter(parseDate(t2));
}
public static boolean timeAfterTime(String t1, String t2) {
return parseTime(t1).isAfter(parseTime(t2));
}
public static boolean dateTimeBeforeDateTime(String t1, String t2) {
return parseDateTime(t1).isBefore(parseDateTime(t2));
}
public static boolean dateBeforeDate(String t1, String t2) {
return parseDate(t1).isBefore(parseDate(t2));
}
public static boolean timeBeforeTime(String t1, String t2) {
return parseTime(t1).isBefore(parseTime(t2));
}
public static boolean dateTimeAfterNowDate(String timeStr) {
return parseDateTime(timeStr).toLocalDate().isAfter(LocalDate.now().plusDays(-1));
}
public static long differ(String startStr, String endStr, TimeUnit unit) throws Exception {
LocalDateTime start = parseDateTime(startStr);
LocalDateTime end = parseDateTime(endStr);
Duration duration = Duration.between(start, end);
long res;
if (TimeUnit.DAYS == unit) {
res = duration.toDays();
} else if (TimeUnit.HOURS == unit) {
res = duration.toHours();
} else if (TimeUnit.MINUTES == unit) {
res = duration.toMinutes();
} else if (TimeUnit.MILLISECONDS == unit) {
res = duration.toMillis();
} else if (TimeUnit.NANOSECONDS == unit) {
res = duration.toNanos();
} else {
throw new Exception("unsupport unit: " + unit);
}
return res;
}
}