使用java8新增的时间的特性,解决SimpleDateFormat的线程问题
DateTimeFormatter 代替 SimpleDateFormat
public class Java8DateUtil {
/**
* 时间单位(年)
*/
public static final String YEAR = "year";
/**
* 时间单位(月)
*/
public static final String MONTH = "month";
/**
* 时间单位(星期)
*/
public static final String WEEK = "week";
/**
* 时间单位(天)
*/
public static final String DAY = "day";
/**
* 时间单位(时)
*/
public static final String HOUR = "hour";
/**
* 时间单位(分)
*/
public static final String MINUTE = "minute";
/**
* 时间单位(秒)
*/
public static final String SECOND = "second";
/**
* 星期元素
* <p>
* 星期一
*/
public static final String MONDAY = "MONDAY";
/**
* 星期二
*/
public static final String TUESDAY = "TUESDAY";
/**
* 星期三
*/
public static final String WEDNESDAY = "WEDNESDAY";
/**
* 星期四
*/
public static final String THURSDAY = "THURSDAY";
/**
* 星期五
*/
public static final String FRIDAY = "FRIDAY";
/**
* 星期六
*/
public static final String SATURDAY = "SATURDAY";
/**
* 星期日
*/
public static final String SUNDAY = "SUNDAY";
/**
* 2015-05-20
*/
public static final String yyyy_MM_dd_Str = "yyyy-MM-dd";
/**
* 2015日05月20日
*/
public static final String yyyy年MM月dd日Str = "yyyy年MM月dd日";
/**
* 2015-05-20 13
*/
public static final String yyyy_MM_dd_HH_Str = "yyyy-MM-dd HH";
/**
* 2015日05月20日 13时
*/
public static final String yyyy年MM月dd日HH时Str = "yyyy年MM月dd日HH时";
/**
* 2015-05-20 13:29
*/
public static final String yyyy_MM_dd_HH_mm_Str = "yyyy-MM-dd HH:mm";
/**
* 2015日05月20日 13时29分
*/
public static final String yyyy年MM月dd日HH时mm分Str = "yyyy年MM月dd日HH时mm分";
/**
* 2015-05-20 13:29:35
*/
public static final String yyyy_MM_dd_HH_mm_ss_Str = "yyyy-MM-dd HH:mm:ss";
/**
* 2015日05月20日 13时29分35秒
*/
public static final String yyyy年MM月dd日HH时mm分ss秒Str = "yyyy年MM月dd日HH时mm分ss秒";
/**
* 05-20
*/
public static final String MM_dd_Str = "MM-dd";
/**
* 05-20
*/
public static final String MM月dd日Str = "MM月dd日";
/**
* 15日05月20日
*/
public static final String yy年MM月dd日Str = "yy年MM月dd日";
/**
* 13:29:35
*/
public static final String HH_mm_ss_Str = "HH:mm:ss";
/**
* 13时29分35秒
*/
public static final String HH时mm分ss秒Str = "HH时mm分ss秒";
/**
* 2015-05-20T13:29:35+08:00 格式
*/
public static final String yyyy_MM_dd_T_HH_mm_ssXXX_Str = "yyyy-MM-dd'T'HH:mm:ssXXX";
// 根据指定格式显示日期和时间
/**
* yyyy-MM-dd
*/
public static final DateTimeFormatter yyyyMMdd_EN = DateTimeFormatter.ofPattern(yyyy_MM_dd_Str);
/**
* yyyy-MM-dd HH
*/
public static final DateTimeFormatter yyyyMMddHH_EN = DateTimeFormatter.ofPattern(yyyy_MM_dd_HH_Str);
/**
* yyyy-MM-dd HH:mm
*/
public static final DateTimeFormatter yyyyMMddHHmm_EN = DateTimeFormatter.ofPattern(yyyy_MM_dd_HH_mm_Str);
/**
* yyyy-MM-dd HH:mm:ss
*/
public static final DateTimeFormatter yyyyMMddHHmmss_EN = DateTimeFormatter.ofPattern(yyyy_MM_dd_HH_mm_ss_Str);
/**
* 2015-05-20T13:29:35+08:00 格式
*/
public static final DateTimeFormatter yyyy_MM_dd_T_HH_mm_ssXXX = DateTimeFormatter.ofPattern(yyyy_MM_dd_T_HH_mm_ssXXX_Str);
/**
* HH:mm:ss
*/
public static final DateTimeFormatter HHmmss_EN = DateTimeFormatter.ofPattern(HH_mm_ss_Str);
/**
* yyyy年MM月dd日
*/
public static final DateTimeFormatter yyyyMMdd_CN = DateTimeFormatter.ofPattern(yyyy年MM月dd日Str);
/**
* yyyy年MM月dd日HH时
*/
public static final DateTimeFormatter yyyyMMddHH_CN = DateTimeFormatter.ofPattern(yyyy年MM月dd日HH时Str);
/**
* yyyy年MM月dd日HH时mm分
*/
public static final DateTimeFormatter yyyyMMddHHmm_CN = DateTimeFormatter.ofPattern(yyyy年MM月dd日HH时mm分Str);
/**
* yyyy年MM月dd日HH时mm分ss秒
*/
public static final DateTimeFormatter yyyyMMddHHmmss_CN = DateTimeFormatter.ofPattern(yyyy年MM月dd日HH时mm分ss秒Str);
/**
* HH时mm分ss秒
*/
public static final DateTimeFormatter HHmmss_CN = DateTimeFormatter.ofPattern(HH时mm分ss秒Str);
/**
* 本地时间显示格式:区分中文和外文显示
*/
private static final DateTimeFormatter shotDate = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
private static final DateTimeFormatter fullDate = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
private static final DateTimeFormatter longDate = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
private static final DateTimeFormatter mediumDate = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
/**
* 获取当前日期
*
* @return yyyy-MM-dd
* @author zero 2019/03/30
*/
public static String getNowDate_EN() {
return String.valueOf(LocalDate.now());
}
/**
* 获取当前日期
*
* @return 字符串yyyy-MM-dd HH:mm:ss
* @author zero 2019/03/30
*/
public static String getNowTime_EN() {
return LocalDateTime.now().format(yyyyMMddHHmmss_EN);
}
/**
* 获取当前时间(yyyy-MM-dd HH)
*/
public static String getNowTime_EN_yMdH() {
return LocalDateTime.now().format(yyyyMMddHH_EN);
}
/**
* 获取当前时间(yyyy年MM月dd日)
*/
public static String getNowTime_CN_yMdH() {
return LocalDateTime.now().format(yyyyMMddHH_CN);
}
/**
* 获取当前时间(yyyy-MM-dd HH:mm)
*/
public static String getNowTime_EN_yMdHm() {
return LocalDateTime.now().format(yyyyMMddHHmm_EN);
}
/**
* 获取当前时间(yyyy年MM月dd日HH时mm分)
*/
public static String getNowTime_CN_yMdHm() {
return LocalDateTime.now().format(yyyyMMddHHmm_CN);
}
/**
* 获取当前时间(HH时mm分ss秒)
*/
public static String getNowTime_CN_HHmmss() {
return LocalDateTime.now().format(HHmmss_CN);
}
/**
* 根据日期格式,获取当前时间
*
* @param formatStr 日期格式<br>
* <li>yyyy</li>
* <li>yyyy-MM-dd</li>
* <li>yyyy-MM-dd HH:mm:ss</li>
* <li>HH:mm:ss</li>
* @return
* @author zero 2019/03/30
*/
public static String getNowFormatTime(String formatStr) {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(formatStr));
}
/**
* 获取中文的当前日期
*
* @return yyyy年mm月dd日
* @author zero 2019/03/30
*/
public static String getNowFormatDate_CN() {
return LocalDate.now().format(yyyyMMdd_CN);
}
/**
* 获取中文当前时间
*
* @return yyyy年MM月dd日HH时mm分ss秒
* @author zero 2019/03/30
*/
public static String getNowFormatTime_CN() {
return LocalDateTime.now().format(yyyyMMddHHmmss_CN);
}
/**
* 简写本地当前日期:yy-M-dd<br>
* 例如:19-3-30为2019年3月30日
*
* @return 字符串yy-M-dd
* @author zero 2019/03/30
*/
public static String getNowLocalTime_shot() {
return LocalDateTime.now().format(shotDate);
}
/**
* 根据当地日期显示格式:yyyy年M月dd日 星期?(中国)
*
* @return 形如:2019年3月30日 星期六
* @author zero 2019/03/30
*/
public static String getNowLocalTime_full() {
return LocalDateTime.now().format(fullDate);
}
/**
* 根据当地显示日期格式:yyyy年M月dd日(中国)
*
* @return 形如 2019年3月30日
* @author zero 2019/03/30
*/
public static String getNowLocalTime_long() {
return LocalDateTime.now().format(longDate);
}
/**
* 根据当地显示日期格式:yyyy-M-dd(中国)
*
* @return 形如:2019-3-30
* @author zero 2019/03/30
*/
public static String getNowLocalTime_medium() {
return LocalDateTime.now().format(mediumDate);
}
/**
* 获取当前日期的节点时间(年,月,周,日,时,分,秒)
*
* @param node 日期中的节点元素(年,月,周,日,时,分,秒)
* @return 节点数字,如创建此方法的时间:年 2019,月 3,日 30,周 6
* @author zero 2019/03/30 星期六
*/
public static Integer getNodeTime(String node) {
LocalDateTime today = LocalDateTime.now();
Integer resultNode = null;
switch (node) {
case YEAR:
resultNode = today.getYear();
break;
case MONTH:
resultNode = today.getMonthValue();
break;
case WEEK:
resultNode = transformWeekEN2Num(String.valueOf(today.getDayOfWeek()));
break;
case DAY:
resultNode = today.getDayOfMonth();
break;
case HOUR:
resultNode = today.getHour();
break;
case MINUTE:
resultNode = today.getMinute();
break;
case SECOND:
resultNode = today.getSecond();
break;
default:
// 当前日期是当前年的第几天。例如:2019/1/3是2019年的第三天
resultNode = today.getDayOfYear();
break;
}
return resultNode;
}
/**
* 将英文星期转换成数字
*
* @param enWeek 英文星期
* @return int,如果数字小于0,则检查,看是否输入错误 or 入参为null
* @author zero 2019/03/30
*/
public static int transformWeekEN2Num(String enWeek) {
if (MONDAY.equals(enWeek)) {
return 1;
} else if (TUESDAY.equals(enWeek)) {
return 2;
} else if (WEDNESDAY.equals(enWeek)) {
return 3;
} else if (THURSDAY.equals(enWeek)) {
return 4;
} else if (FRIDAY.equals(enWeek)) {
return 5;
} else if (SATURDAY.equals(enWeek)) {
return 6;
} else if (SUNDAY.equals(enWeek)) {
return 7;
} else {
return -1;
}
}
/**
* 获取当前日期之后(之后)的节点事件<br>
* <ul>
* 比如当前时间为:2019-03-30 10:20:30
* </ul>
* <li>node="hour",num=5L:2019-03-30 15:20:30</li>
* <li>node="day",num=1L:2019-03-31 10:20:30</li>
* <li>node="year",num=1L:2020-03-30 10:20:30</li>
*
* @param node 节点元素(“year”,"month","week","day","huor","minute","second")
* @param num 第几天(+:之后,-:之前)
* @return 之后或之后的日期
* @author zero 2019/03/30
*/
public static String getAfterOrPreNowTime(String node, Long num) {
LocalDateTime now = LocalDateTime.now();
if (HOUR.equals(node)) {
return now.plusHours(num).format(yyyyMMddHHmmss_EN);
} else if (DAY.equals(node)) {
return now.plusDays(num).format(yyyyMMddHHmmss_EN);
}