前言
一般我们在操作日期相关方法时,都会使用SimpleDateFormat,但SimpleDateFormat是线程不安全的类,如果我们要定义为static则必须要加锁,才能保证线程安全,如果不定义为static,即每次在方法使用时自己new一个出来,这两种方式无论哪一种,都显得不太优雅。
JDK8之前我们通常借助ThreadLocal来实现,像如下这样:
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
JDK8新的时间类API
JDK8之后,我们可以使用LocalDateTime代替Calendar,DateTimeFormatter 代替SimpleDateFormat,Instant 代替Date,下面给出了一些常用的方法,以供参考
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
public class DateUtil {
private static final DateTimeFormatter DATE_TIME_FORMATTER_DAY = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter DATE_TIME_FORMATTER_HOUR = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
private static final DateTimeFormatter DATE_TIME_FORMATTER_MIN = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
private static final DateTimeFormatter DATE_TIME_FORMATTER_SEC = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static LocalDate dateToLocalDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
public static LocalDateTime dateToLocalDateTime(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
public static Date localDateToDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
}
public static String formatNowOfDay() {
return LocalDateTime.now().format(DATE_TIME_FORMATTER_DAY);
}
public static String formatNowOfHour() {
return LocalDateTime.now().format(DATE_TIME_FORMATTER_HOUR);
}
public static String formatNowOfMin() {
return LocalDateTime.now().format(DATE_TIME_FORMATTER_MIN);
}
public static String formatNowOfSec() {
return LocalDateTime.now().format(DATE_TIME_FORMATTER_SEC);
}
public static long diffMillis(String start, String end) {
LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
return Duration.between(startTime, endTime).toMillis();
}
public static long diffSec(String start, String end) {
LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
return Duration.between(startTime, endTime).toMillis() / 1000;
}
public static long diffMin(String start, String end) {
LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
return Duration.between(startTime, endTime).toMinutes();
}
public static long diffHour(String start, String end) {
LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
return Duration.between(startTime, endTime).toHours();
}
public static long diffDay(String start, String end) {
LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
return Duration.between(startTime, endTime).toDays();
}
public static String minusDay(String time, int days) {
return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(days, ChronoUnit.DAYS).format(DATE_TIME_FORMATTER_SEC);
}
public static String minusHours(String time, int hours) {
return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(hours, ChronoUnit.HOURS).format(DATE_TIME_FORMATTER_SEC);
}
public static String minusMin(String time, int minutes) {
return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(minutes, ChronoUnit.MINUTES).format(DATE_TIME_FORMATTER_SEC);
}
public static String minusSeconds(String time, int seconds) {
return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(seconds, ChronoUnit.SECONDS).format(DATE_TIME_FORMATTER_SEC);
}
}
|