|
|
@@ -31,25 +31,25 @@ import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* TimeKit 用于简化 JDK 8 新增的时间 API
|
|
|
- *
|
|
|
+ *
|
|
|
* 新旧日期转换通过桥梁 Instant 进行,转成 LocalDate、LocalTime 需要先转成 LocalDateTime:
|
|
|
* 新转旧:LocalDateTime.atZone(ZoneId).toInstant() -> Instant -> Date.from(Instant)
|
|
|
* 旧转新:Date.toInstant() -> Instant -> LocalDateTime.ofInstant(Instant, ZoneId)
|
|
|
- *
|
|
|
+ *
|
|
|
* 经测试,SimpleDateFormat 比 DateTimeFormatter 对 pattern 的支持更好
|
|
|
* 对于同样的 pattern 值 "yyyy-MM-dd HH:mm:ss",前者可以转换 "2020-06-9 12:13:19"
|
|
|
* 后者却不支持,原因是 pattern 的 dd 位置只有数字 9,必须要是两位数字才能支持
|
|
|
- *
|
|
|
- *
|
|
|
+ *
|
|
|
+ *
|
|
|
* 所以:建议优先使用转换结果为 Date 的 parse 方法,使用 SimpleDateFormat 来转换
|
|
|
*/
|
|
|
public class TimeKit {
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 缓存线程安全的 DateTimeFormatter
|
|
|
*/
|
|
|
private static final Map<String, DateTimeFormatter> formaters = new SyncWriteMap<>();
|
|
|
-
|
|
|
+
|
|
|
public static DateTimeFormatter getDateTimeFormatter(String pattern) {
|
|
|
DateTimeFormatter ret = formaters.get(pattern);
|
|
|
if (ret == null) {
|
|
|
@@ -58,12 +58,12 @@ public class TimeKit {
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 结合 ThreadLocal 缓存 "非线程安全" 的 SimpleDateFormat
|
|
|
*/
|
|
|
private static final ThreadLocal<HashMap<String, SimpleDateFormat>> TL = ThreadLocal.withInitial(() -> new HashMap<>());
|
|
|
-
|
|
|
+
|
|
|
public static SimpleDateFormat getSimpleDateFormat(String pattern) {
|
|
|
SimpleDateFormat ret = TL.get().get(pattern);
|
|
|
if (ret == null) {
|
|
|
@@ -72,7 +72,7 @@ public class TimeKit {
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将当前时间转换成 String
|
|
|
* 例如:now("yyyy-MM-dd HH:mm:ss")
|
|
|
@@ -80,21 +80,21 @@ public class TimeKit {
|
|
|
public static String now(String pattern) {
|
|
|
return LocalDateTime.now().format(getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按 pattern "yyyy-MM-dd HH:mm:ss" 将当前时间转换成 String
|
|
|
*/
|
|
|
public static String now() {
|
|
|
return now("yyyy-MM-dd HH:mm:ss");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按 pattern "yyyyMMddHHmmssSSS" 将当前时间精确到毫秒转换成 String,常用于生成订单号等等单据的部分字符
|
|
|
*/
|
|
|
public static String nowWithMillisecond() {
|
|
|
return now("yyyyMMddHHmmssSSS");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 LocalDateTime 转换成 String
|
|
|
* 例如:format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss")
|
|
|
@@ -102,25 +102,25 @@ public class TimeKit {
|
|
|
public static String format(LocalDateTime localDateTime, String pattern) {
|
|
|
return localDateTime.format(getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public static String format(LocalDateTime localDateTime) {
|
|
|
return format(localDateTime, "yyyy-MM-dd HH:mm:ss");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 LocalDate 转换成 String
|
|
|
*/
|
|
|
public static String format(LocalDate localDate, String pattern) {
|
|
|
return localDate.format(getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 LocalTime 转换成 String
|
|
|
*/
|
|
|
public static String format(LocalTime localTime, String pattern) {
|
|
|
return localTime.format(getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 Date 转换成 String
|
|
|
* 例如:format(new Date(), "yyyy-MM-dd HH:mm:ss")
|
|
|
@@ -128,11 +128,11 @@ public class TimeKit {
|
|
|
public static String format(Date date, String pattern) {
|
|
|
return getSimpleDateFormat(pattern).format(date);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public static String format(Date date) {
|
|
|
return format(date, "yyyy-MM-dd HH:mm:ss");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 String 转换成 Date
|
|
|
*/
|
|
|
@@ -143,49 +143,49 @@ public class TimeKit {
|
|
|
throw new RuntimeException(e);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 String 转换成 LocalDateTime
|
|
|
*/
|
|
|
public static LocalDateTime parseLocalDateTime(String localDateTimeString, String pattern) {
|
|
|
return LocalDateTime.parse(localDateTimeString, getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 String 转换成 LocalDate
|
|
|
*/
|
|
|
public static LocalDate parseLocalDate(String localDateString, String pattern) {
|
|
|
return LocalDate.parse(localDateString, getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 按指定 pattern 将 String 转换成 LocalTime
|
|
|
*/
|
|
|
public static LocalTime parseLocalTime(String localTimeString, String pattern) {
|
|
|
return LocalTime.parse(localTimeString, getDateTimeFormatter(pattern));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 判断 A 的时间是否在 B 的时间 "之后"
|
|
|
*/
|
|
|
public static boolean isAfter(ChronoLocalDateTime<?> self, ChronoLocalDateTime<?> other) {
|
|
|
return self.isAfter(other);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 判断 A 的时间是否在 B 的时间 "之前"
|
|
|
*/
|
|
|
public static boolean isBefore(ChronoLocalDateTime<?> self, ChronoLocalDateTime<?> other) {
|
|
|
return self.isBefore(other);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 判断 A 的时间是否与 B 的时间 "相同"
|
|
|
*/
|
|
|
public static boolean isEqual(ChronoLocalDateTime<?> self, ChronoLocalDateTime<?> other) {
|
|
|
return self.isEqual(other);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.util.Date --> java.time.LocalDateTime
|
|
|
*/
|
|
|
@@ -194,12 +194,12 @@ public class TimeKit {
|
|
|
if (date instanceof java.sql.Date) {
|
|
|
date = new Date(date.getTime());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Instant instant = date.toInstant();
|
|
|
ZoneId zone = ZoneId.systemDefault();
|
|
|
return LocalDateTime.ofInstant(instant, zone);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.util.Date --> java.time.LocalDate
|
|
|
*/
|
|
|
@@ -208,13 +208,13 @@ public class TimeKit {
|
|
|
if (date instanceof java.sql.Date) {
|
|
|
date = new Date(date.getTime());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Instant instant = date.toInstant();
|
|
|
ZoneId zone = ZoneId.systemDefault();
|
|
|
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
|
|
|
return localDateTime.toLocalDate();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.util.Date --> java.time.LocalTime
|
|
|
*/
|
|
|
@@ -223,13 +223,13 @@ public class TimeKit {
|
|
|
if (date instanceof java.sql.Date) {
|
|
|
date = new Date(date.getTime());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Instant instant = date.toInstant();
|
|
|
ZoneId zone = ZoneId.systemDefault();
|
|
|
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
|
|
|
return localDateTime.toLocalTime();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.time.LocalDateTime --> java.util.Date
|
|
|
*/
|
|
|
@@ -238,7 +238,7 @@ public class TimeKit {
|
|
|
Instant instant = localDateTime.atZone(zone).toInstant();
|
|
|
return Date.from(instant);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.time.LocalDate --> java.util.Date
|
|
|
*/
|
|
|
@@ -247,7 +247,7 @@ public class TimeKit {
|
|
|
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
|
|
|
return Date.from(instant);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.time.LocalTime --> java.util.Date
|
|
|
*/
|
|
|
@@ -258,7 +258,7 @@ public class TimeKit {
|
|
|
Instant instant = localDateTime.atZone(zone).toInstant();
|
|
|
return Date.from(instant);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* java.time.LocalTime --> java.util.Date
|
|
|
*/
|
|
|
@@ -268,6 +268,29 @@ public class TimeKit {
|
|
|
Instant instant = localDateTime.atZone(zone).toInstant();
|
|
|
return Date.from(instant);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将 LocalDate 转为 int 类型
|
|
|
+ * <pre>
|
|
|
+ * 例子:
|
|
|
+ * toInt(LocalDate.now());
|
|
|
+ * toInt(LocalDateTime.now().toLocalDate());
|
|
|
+ * </pre>
|
|
|
+ */
|
|
|
+ public static int toInt(LocalDate localDate) {
|
|
|
+ return Integer.parseInt(TimeKit.format(localDate, "yyyyMMdd"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将 LocalDateTime 转为 long 类型
|
|
|
+ * <pre>
|
|
|
+ * 例子:
|
|
|
+ * toLong(LocalDateTime.now());
|
|
|
+ * </pre>
|
|
|
+ */
|
|
|
+ public static long toLong(LocalDateTime localDateTime) {
|
|
|
+ return Long.parseLong(TimeKit.format(localDateTime, "yyyyMMddHHmmss"));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|