import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
@Slf4j
public class DateUtils {
private static final String TIME_END = " 00:00:00";
/**
* 距离当前相差
* @param start
* @return
*/
public static String between(long start) {
StringBuilder builder = new StringBuilder();
long millis = start - System.currentTimeMillis();
if (millis < 0) {
builder.append("超时:");
}
Duration between = Duration.ofMillis(Math.abs(millis));
long days = between.toDays();
long hours = between.toHours() - days *24;
long minutes = between.toMinutes() - between.toHours() * 60;
long seconds = between.getSeconds() - between.toMinutes() * 60;
builder = days > 0 ? builder.append(days + "天") :builder;
builder = hours > 0 ? hours > 9 ?builder.append(hours + "时"):builder.append("0" + hours + "时") :builder;
builder = minutes > 0 ? minutes > 9 ?builder.append(minutes + "分"):builder.append("0" + minutes + "分") :builder;
builder = seconds > 0 ? seconds > 9 ?builder.append(seconds + "秒"):builder.append("0" + seconds + "秒"):builder;
return builder.toString();
}
/**
* long格式化为指定格式
* @param timestamp
* @return
*/
public static String format(long timestamp) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return dateTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()));
}
/**
* Date转换为LocalDateTime
* @param date
*/
public static LocalDateTime date2LocalDateTime(Date date){
try {
Instant instant = date.toInstant();//An instantaneous point on the time-line.(时间线上的一个瞬时点。)
ZoneId zoneId = ZoneId.systemDefault();//A time-zone ID, such as {@code Europe/Paris}.(时区)
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
return localDateTime;
} catch (Exception e) {
log.error("date2LocalDateTime={}", e);
return null;
}
}
/**
* LocalDateTime转换为Date
* @param localDateTime
*/
public static Date localDateTime2Date( LocalDateTime localDateTime){
try {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
} catch (Exception e) {
log.error("localDateTime2Date={}", e);
return null;
}
}
/**
* 将时长转换成时分秒
* @param countDownTime
* @return
*/
public static String getTimeLengthView(long countDownTime) {
//两个时间点间相差的秒数
StringBuilder builder = new StringBuilder();
if (countDownTime <= 0) {
builder = builder.append("超时");
} else if (countDownTime < 60) {
builder = builder.append("<1分钟");
} else {
long hours = countDownTime/3600;
long minutes = (countDownTime - hours * 3600)/60;
long seconds = countDownTime - hours * 3600 - minutes * 60;
builder = hours > 0 ? hours > 9 ? builder.append(hours + "时") : builder.append("0" + hours + "时") : builder;
builder = minutes > 0 ? minutes > 9 ? builder.append(minutes + "分") : builder.append("0" + minutes + "分") : builder;
//builder = seconds > 0 ? seconds > 9 ? builder.append(seconds + "秒") : builder.append("0" + seconds + "秒") : builder;
//builder = StringUtils.isBlank(builder) ? builder.append("0秒") : builder;
}
return builder.toString();
}
/**
* 获取上一个月的时间 保留原格式
* , 如果 dataFlg 为true 直接返回
* @param startDate
* @param pattern
* @param dataFlg
* @return
*/
public static String getLastMonthTime(String startDate, String pattern, boolean dataFlg) {
if (dataFlg) {
return startDate;
}
return getLastMonthTime(startDate, pattern);
}
/**
* 获取上一个月的时间 保留原格式
* , 如果 dataFlg 为true 直接返回
* @param startDate
* @param pattern
* @return
*/
public static String getLastMonthTime(String startDate, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Calendar init = getCalendar(startDate, pattern, sdf);
init.add(Calendar.MONTH, -1);//当前时间前去一个月,即一个月前的时间
Date time = init.getTime();
return sdf.format(time);
}
/**
* 获取上一年的时间 保留原格式
* * , 如果 dataFlg 为true 直接返回
* @param startDate
* @param pattern
* @param dataFlg
* @return
*/
public static String getLastYearTime(String startDate, String pattern, boolean dataFlg) {
if (dataFlg) {
return startDate;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Calendar init = getCalendar(startDate, pattern, sdf);
init.add(Calendar.YEAR, -1);//当前时间减去一年,即一年前的时间
Date time = init.getTime();
return sdf.format(time);
}
/**
* 获取上一年的时间 保留原格式
* * , 如果 dataFlg 为true 直接返回
* @param startDate
* @param pattern
* @return
*/
public static String getLastYearTime(String startDate, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Calendar init = getCalendar(startDate, pattern, sdf);
init.add(Calendar.YEAR, -1);//当前时间减去一年,即一年前的时间
Date time = init.getTime();
return sdf.format(time);
}
public static Calendar getCalendar(String startDate, String pattern, SimpleDateFormat sdf) {
Calendar init = Calendar.getInstance();
Date parse = null;
try {
parse = sdf.parse(startDate);
} catch (Exception e) {
e.printStackTrace();
}
init.setTime(parse);
return init;
}
/**
* 获取上一年的时间 2019年第1季度 格式 保留原格式
* , 如果 dataFlg 为true 直接返回
* @param time
* @return
*/
public static String getLastYearTimeSeason(String time) {
if (StringUtils.isEmpty(time)) {
return "";
}
String year = StringUtils.substringBefore(time, "年");
Integer lastYear = Integer.valueOf(year) - 1;
if (lastYear <=0) {
return "";
}
return lastYear.toString() + "年" + StringUtils.substringAfter(time, "年");
}
/**
* 获取上一年的时间 2019年第1季度 格式 保留原格式
* , 如果 dataFlg 为true 直接返回
* @param time
* @param dataFlg
* @return
*/
public static String getLastYearTimeSeason(String time, boolean dataFlg) {
if (dataFlg) {
return time;
}
return getLastYearTimeSeason(time);
}
/**
* 获取上一月的时间 2019年第1季度 格式 保留原格式
* , 如果 dataFlg 为true 直接返回
* @param time
* @param dataFlg
* @return
*/
public static String getLastMonthTimeSeason(String time, boolean dataFlg) {
if (dataFlg) {
return time;
}
return getLastMonthTimeSeason(time);
}
/**
* 获取上一月的时间 2019年第1季度 格式 保留原格式
* , 如果 dataFlg 为true 直接返回
* @param time
* @return
*/
public static String getLastMonthTimeSeason(String time) {
if (StringUtils.isEmpty(time)) {
return "";
}
String season = StringUtils.substringBetween(time, "第", "季度");
Integer lastSeason = Integer.valueOf(season) - 1;
if (lastSeason ==0) {
String year = StringUtils.substringBefore(time, "年");
Integer lastYear = Integer.valueOf(year) - 1;
if (lastYear <=0) {
return "";
}
return lastYear.toString() + "年第4季度";
} else if (lastSeason < 0) {
return "";
}
return StringUtils.substringBefore(time, "年") + "年第" + lastSeason + "季度";
}
public static Integer secondToHour(Object num) {
if (null == num) {
return 0;
}
BigDecimal divide = null;
if (num instanceof BigDecimal) {
divide = ((BigDecimal) num).divide(BigDecimal.valueOf(3600), 1, BigDecimal.ROUND_HALF_UP);
}
if (num instanceof Integer) {
divide = BigDecimal.valueOf((Integer) num).divide(BigDecimal.valueOf(3600), 1, BigDecimal.ROUND_HALF_UP);
}
return divide.intValue();
}
/**
* 秒 转 分钟
* @param num
* @return
*/
public static Integer secondToMinutes(Object num) {
if (null == num) {
return 0;
}
BigDecimal divide = null;
if (num instanceof BigDecimal) {
divide = ((BigDecimal) num).divide(BigDecimal.valueOf(60), 1, BigDecimal.ROUND_HALF_UP);
}
if (num instanceof Integer) {
divide = BigDecimal.valueOf((Integer) num).divide(BigDecimal.valueOf(60), 1, BigDecimal.ROUND_HALF_UP);
}
return divide.intValue();
}
/**
* 获取当前 时间 下个月的第一天
*/
public static String getNextMonthTimeFirstDay(){
LocalDate date = LocalDate.now();
LocalDate firstday = date.with(TemporalAdjusters.firstDayOfNextMonth());
String format = firstday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
return format + TIME_END;
}
/**
* 获取当前 时间 下个季度的第一天
*/
public static String getNextQuarterTimeFirstDay(){
LocalDate date = LocalDate.now();
// LocalDate date = LocalDate.of(2020, d, 1);
// 123 456 789 10 11 12
int month = date.getMonth().getValue();
int del = month%3 == 0 ? 3 : month%3;
int plus = 4 - del ;;
LocalDate localDate = date.plusMonths(plus);
LocalDate firstday = localDate.with(TemporalAdjusters.firstDayOfMonth());
String format = firstday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
return format + TIME_END;
}
/**
* 获取当前 时间 下个年度的第一天
*/
public static String getNextYearTimeFirstDay(){
LocalDate date = LocalDate.now();
LocalDate firstday = date.with(TemporalAdjusters.firstDayOfNextYear());
String format = firstday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
return format + TIME_END;
}
/**
* 获取当前 时间 下周的第一天
*/
public static String getNextWeekTimeFirstDay() {
LocalDate today = LocalDate.now();
LocalDate monDay = today.with(DayOfWeek.MONDAY);
LocalDate nextWeek = monDay.plus(1, ChronoUnit.WEEKS); //使用变量赋值
return nextWeek + TIME_END;
}
}