如果想要 Date 替换为新的日期类,通过原 Date 类新增的方法以及几个新增的类可以很方便的把 Date 类型转换为新的日期LocalTime,LocalDate,LocalDateTime 类型.不过转换的时候需要指定时区
Date date = new Date();
// 可以指定时区,这里指定 ZoneId.SHORT_IDS的("CTT", "Asia/Shanghai");
LocalTime localTime = date.toInstant().atZone(ZoneId.of("CTT", ZoneId.SHORT_IDS)).toLocalTime();
LocalDate localDate = date.toInstant().atZone(ZoneId.of("CTT", ZoneId.SHORT_IDS)).toLocalDate();
// 也可以使用当前系统的默认时区
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
现在的 OOM框架已经支持使用jdk1.8的新日期类,以 Mybatis 为例,在其 3.4.5 版本已经支持.下面是一些新日期类型与字符串转换的基本使用方法.
/**
* @author YoonaLt
* LocalDateTime 与 LocalDate 都提供了 plus***(加),minus***(减)等方法
*/
public class DateTest {
private static final String DETAIL_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
private static final String PROBABLY_FORMAT_STRING = "yyyy-MM-dd";
private static final String DETAIL_REGEX = "(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])";
private static final String PROBABLY_REGEX = "\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0|1])";
/**
* 获取当前月份长度, 28 or 29 or 30 or 31
*/
public static int getLengthOfMonth(LocalDate localDate) {
return localDate.lengthOfMonth();
}
/**
* 获取当前月份长度, 28 or 29 or 30 or 31
*/
public static int getLengthOfMonth(LocalDateTime localDateTime) {
return getLengthOfMonth(localDateTime.toLocalDate());
}
/**
* 获取当前年份天数, 365 or 366
*/
public static int getLengthOfYear(LocalDate localDate) {
return localDate.lengthOfYear();
}
/**
* 获取当前年份天数, 365 or 366
*/
public static int getLengthOfYear(LocalDateTime localDateTime) {
return getLengthOfYear(localDateTime.toLocalDate());
}
/**
* 格式化 LocalDate 为 String
*
* @param localDate 将要格式化的日期
* @return 例如, 2020-04-03
*/
public static String localDateToString(LocalDate localDate) {
return DateTimeFormatter.ofPattern(PROBABLY_FORMAT_STRING).format(localDate);
}
/**
* 格式化 LocalDateTime 为 String
*
* @param localDateTime 将要格式化的日期
* @return 例如, 2020-04-03 14:12:02
*/
public static String localDateTimeToString(LocalDateTime localDateTime) {
return DateTimeFormatter.ofPattern(DETAIL_FORMAT_STRING).format(localDateTime);
}
/**
* 字符串格式化为日期,字符串必须符合 yyyy-MM-dd 格式
*
* @param s 将要 LocalDate 化的字符串
* @return LocalDate
*/
public static LocalDate stringToLocalDate(String s) {
return stringNotNull(s) && Pattern.matches(PROBABLY_REGEX, s) ?
LocalDate.parse(s, DateTimeFormatter.ofPattern(PROBABLY_FORMAT_STRING)) : null;
}
/**
* 字符串格式化为日期,字符串必须符合 "yyyy-MM-dd HH:mm:ss" 格式
* 不支持 24:00:00 格式,需要转换为 00:00:00
*
* @param s 将要 LocalDateTime 化的字符串
* @return LocalDateTime
*/
public static LocalDateTime stringToLocalDateTime(String s) {
return stringNotNull(s) && Pattern.matches(PROBABLY_REGEX + " " + DETAIL_REGEX, s) ?
LocalDateTime.parse(s, DateTimeFormatter.ofPattern(DETAIL_FORMAT_STRING)) : null;
}
private static boolean stringNotNull(String s) {
return null != s && s.length() > 0 && !"NULL".equals(s) && !"null".equals(s) && !"''".equals(s) && !"\"\"".equals(s);
}
}
由于本人水平有限,难免会出现错误,欢迎指正.