package com.test.spring.boot.logger.server.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* @ClassName DateUtils
* @Description
* @Author huyix
* @Date 2023/3/9 14:07
* @Version 1.0
**/
public class DateUtils {
/**
* 默认的日期格式
*/
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DATE_FORMAT_YYYY = "yyyy";
public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";
public static final String DATE_FORMAT_YYYYMM = "yyyyMM";
public static final String YYYYMMDD_CHINESE = "yyyy年MM月dd日";
public static final String DATE_FORMAT_YYYY_MM = "yyyy-MM";
public static final String DATE_FORMAT_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static final String DATE_FORMAT_YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS";
public static final String DATE_FORMAT_YYYYMMDD_HHMMSS = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_FORMAT_MDHM = "M月d日H时m分";
public static final String DATE_FORMAT_YYYYMMDDHHMM = "yyyyMMddHHmm";
public static final String DATE_FORMAT_YYYYMMDD_HHMM = "yyyy-MM-dd HH:mm";
public static final Locale LOCALE = Locale.CHINA;
private static final Object lock = new Object();
private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();
/**
* 将TemporalAccessor格式化成指定格式的字符串
*
* @param temporal 时间
* @param pattern 格式
* @return
*/
public static String format(TemporalAccessor temporal, String pattern) {
if (temporal == null){
return null;
}
return DateTimeFormatter.ofPattern(pattern).format(temporal);
}
/**
* 将date格式化成指定格式的字符串
*
* @param pattern 格式
* @return
*/
public static String formatDate(Date date, String pattern) {
return format(LocalDateTime.from(date.toInstant()), pattern);
}
/**
* 将dateStr解析成LocalDateTime类型
*
* @param dateStr 时间
* @param pattern 时间格式
* @return
*/
public static LocalDateTime parse(String dateStr, String pattern) {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
}
/**
* 将dateStr解析成Date类型,兼容
*
* @param dateStr 时间
* @return
*/
public static Date parseToDate(String dateStr) {
ZonedDateTime zonedDateTime = ZonedDateTime.of(parse(dateStr, DATE_FORMAT_YYYYMMDD_HHMMSS),
ZoneId.systemDefault());
return toDate(zonedDateTime);
}
/**
* 时间相差天数
*
* @param smdate
* @param bdate
* @return
*/
public static long daysBetween(Date smdate, Date bdate) {
final LocalDateTime localDate1 = LocalDateTime.from(smdate.toInstant());
final LocalDateTime localDate2 = LocalDateTime.from(bdate.toInstant());
return daysBetween(localDate1, localDate2);
}
/**
* 时间相差天数
*
* @param localDate1
* @param localDate2
* @return
*/
public static long daysBetween(LocalDateTime localDate1, LocalDateTime localDate2) {
return Math.abs(localDate1.until(localDate2, ChronoUnit.DAYS));
}
/**
* 时间相差天数
* @param localDate1
* @param localDate2
* @return
*/
public static long daysBetween(LocalDate localDate1, LocalDate localDate2) {
return Math.abs(localDate1.until(localDate2, ChronoUnit.DAYS));
}
/**
* 获取当前时间:java.util.date格式
*
* @return
*/
public static Date now() {
return toDate(Instant.now());
}
/**
* 获取时间:java.util.date格式
*
* @param temporal
* @return
*/
private static Date toDate(TemporalAccessor temporal) {
return Date.from(Instant.from(temporal));
}
/**
* 获取时间:LocalDate格式
*
* @param date
* @return
*/
public static LocalDateTime toLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* 获取时间:LocalDate格式
*
* @param date
* @return
*/
public static LocalDate toLocalDate(Date date) {
return toLocalDateTime(date).toLocalDate();
}
/**
* localDate 转让成date
*
* @param date
* @return
*/
public static Date LocalDateTime2Date(LocalDateTime date) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = date.atZone(zoneId);
return Date.from(zdt.toInstant());
}
/**
* localDate 转让成date
*
* @param date
* @return
*/
public static Date LocalDate2Date(LocalDate date) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = date.atStartOfDay(zoneId);
return Date.from(zdt.toInstant());
}
public static String format(Date date, String pattern) {
return getSdf(pattern).format(date);
}
public static Date parse2date(String dateStr, String pattern) {
try {
return getSdf(pattern).parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException("格式化日期异常", e);
}
}
private static SimpleDateFormat getSdf(final String pattern) {
ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);
// 此处的双重判断和同步是为了防止sdfMap这个单例被多次put重复的sdf
if (tl == null) {
synchronized (lock) {
tl = sdfMap.get(pattern);
if (tl == null) {
// Map中还没有这个pattern的sdf才会生成新的sdf并放入map
// SimpleDateFormat
tl = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
// LOGGER.info("thread: " + Thread.currentThread() +
// " init pattern: " + pattern);
return new SimpleDateFormat(pattern);
}
};
sdfMap.put(pattern, tl);
}
}
}
return tl.get();
}
}
时间格式化工具
于 2023-03-09 14:52:25 首次发布