在日常项目中经常会碰到日期与字符串之间的相互转换,有很多工具包都提供了相关的功能,如commons-lang3.jar,该包中提供了DateUtils、DateFormatUtils2个类来实现,是线程安全的,还有org.joda.time等架包。在Java8当中又新增了一个包java.time,其中包含了LocalDate、LocalTime、LocalDateTime分别应用于不同的场景,并且都是线程安全的,该包中提供了很多非常实用的方法,比如:plusDays()、plusMonths()等,有了这些方法之后我们就无需考虑跨年跨月的问题了。
可以在这些工具包的基础上再提供一个工具类,用来处理各种类型之间的转换:
package date;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
/**
* java.util.Date、String、java.time.LocalDate之间的相互转换(日期,不考虑时分秒)
*/
public class ConvertUtil {
private static final String NORMAL_DATE_PATTERN = "yyyy-MM-dd";
/**
* String --> Date
*/
public static Date stringToDate(String dateStr) throws Exception{
return DateUtils.parseDate(dateStr, NORMAL_DATE_PATTERN);
}
/**
* Date --> String
*/
public static String dateToString(Date date){
return DateFormatUtils.format(date, NORMAL_DATE_PATTERN);
}
/**
* String --> LocalDate
*/
public static LocalDate stringToLocalDate(String dateStr){
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(NORMAL_DATE_PATTERN);
return LocalDate.parse(dateStr, dtf);
}
/**
* LocalDate --> String
*/
public static String localDateToString(LocalDate localDate){
return localDate.toString(); //默认格式为yyyy-MM-dd
}
/**
* Date --> LocalDate
* 方法一、Date类型不能直接转换成LocalDate,只能转换成LocalDateTime,再转成LocalDate,中间利用Instant类
* 方法二、Date先转成String,再由String转成LocalDate(利用parse方法)
*/
public static LocalDate dateToLocalDate(Date date){
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone).toLocalDate();
}
/**
* LocalDate --> Date
* 转换方法同上类似
*/
public static Date localDateToDate(LocalDate localDate){
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay(zone).toInstant();
return Date.from(instant);
}
public static void main(String[] args) {
System.out.println(ConvertUtil.dateToLocalDate(new Date()).toString());
LocalDate localDate = LocalDate.now();
System.out.println(ConvertUtil.localDateToDate(localDate));
}
}