工具类如下:
package cn.com.valsong.framework.util;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Year;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
/**
* 使用ThreadLocal来避免线程安全问题
*
* Date工具类
*
* @author valsong
*
*/
public class DateUtils {
private DateUtils() {
}
private static final ZoneId ZONE_ID = ZoneId.systemDefault();
/**
* LocalDateTime转化为Date
*
* @param localDateTime
* @return
*/
public static Date toDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZONE_ID).toInstant());
}
/**
* LocalDateTime转化为Date
*
* @param localDateTime
* @return
*/
public static Date toDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());
}
/**
* Date转化为LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime toLocalDateTime(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);
}
/**
* LocalDate转化为LocalDateTime
*
* @param localDate
* @return
*/
public static LocalDateTime toLocalDateTime(LocalDate localDate) {
return LocalDateTime.of(localDate, LocalTime.MIN);
}
/**
* Date转化为LocalDate
*
* @param date
* @return
*/
public static LocalDate toLocalDate(Date date) {
return date.toInstant().atZone(ZONE_ID).toLocalDate();
}
/**
* Date转化为字符串
*
* @param date
* @param formatter
* @return
*/
public static String format(Date date, DateFormatter formatter) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);
return formatter.getDateTimeFormatter().format(localDateTime);
}
/**
* 字符串转化为Date
*
* @param text
* @param formatter
* @return
*/
public static Date parse(String text, DateFormatter formatter) {
return formatter.parse(text);
}
public static enum DateFormatter {
/**
* 格式yyyy
*
* @author Val Song Dec 17, 2017 7:21:12 PM
*
*/
YEAR_FORMATTER(DateTimeFormatter.ofPattern("yyyy", Locale.CHINA)) {
@Override
public Date parse(String text) {
Year year = Year.parse(text, dateTimeFormatter);
return Date.from(year.atDay(1).atStartOfDay(ZONE_ID).toInstant());
}
},
/**
*
* 格式yyyy-MM
*
* @author Val Song Dec 17, 2017 7:21:30 PM
*
*/
YEAR_MONTH_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM", Locale.CHINA)) {
@Override
public Date parse(String text) {
YearMonth yearMonth = YearMonth.parse(text, dateTimeFormatter);
return Date.from(yearMonth.atDay(1).atStartOfDay(ZONE_ID).toInstant());
}
},
/**
*
* 格式yyyy-MM-dd
*
* @author Val Song Dec 17, 2017 7:26:25 PM
*
*/
DATE_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA)) {
@Override
public Date parse(String text) {
LocalDate localDate = LocalDate.parse(text, dateTimeFormatter);
return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());
}
},
/**
* 格式yyyy-MM-dd HH:mm:ss
*
* @author Val Song Dec 17, 2017 7:26:39 PM
*
*/
DATE_TIME_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA)) {
@Override
public Date parse(String text) {
LocalDateTime localDateTime = LocalDateTime.parse(text, dateTimeFormatter);
return Date.from(localDateTime.atZone(ZONE_ID).toInstant());
}
},
/**
* 格式yyyyMMdd_HHmmss
*
* @author Val Song Dec 17, 2017 7:26:59 PM
*
*/
YYYYMMDD_HHMMSS_FORMATTER(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss", Locale.CHINA)) {
@Override
public Date parse(String text) {
LocalDateTime localDateTime = LocalDateTime.parse(text, dateTimeFormatter);
return Date.from(localDateTime.atZone(ZONE_ID).toInstant());
}
};
protected DateTimeFormatter dateTimeFormatter;
private DateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
public DateTimeFormatter getDateTimeFormatter() {
return dateTimeFormatter;
}
public abstract Date parse(String text);
}
}
测试类如下:
package cn.com.valsong.framework.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.junit.Assert;
import org.junit.Test;
import cn.com.valsong.framework.util.DateUtils.DateFormatter;
/**
* DateUtilsTest
*
* @author Val Song
* Dec 17, 2017 7:38:11 PM
*
*/
public class DateUtilsTest {
private SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
private SimpleDateFormat yearMonthFormat = new SimpleDateFormat("yyyy-MM");
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private SimpleDateFormat yyyyMMdd_HHmmssFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
@Test
public void formatTest() {
Date now = new Date();
Assert.assertEquals(yearFormat.format(now), DateUtils.format(now, DateFormatter.YEAR_FORMATTER));
Assert.assertEquals(yearMonthFormat.format(now), DateUtils.format(now, DateFormatter.YEAR_MONTH_FORMATTER));
Assert.assertEquals(dateFormat.format(now), DateUtils.format(now, DateFormatter.DATE_FORMATTER));
Assert.assertEquals(dateTimeFormat.format(now), DateUtils.format(now, DateFormatter.DATE_TIME_FORMATTER));
Assert.assertEquals(yyyyMMdd_HHmmssFormat.format(now), DateUtils.format(now, DateFormatter.YYYYMMDD_HHMMSS_FORMATTER));
}
@Test
public void parseTest() throws ParseException {
String yearStr = "2017";
String yearMonthStr = "2017-12";
String dateStr = "2017-12-17";
String dateTimeStr = "2017-12-17 19:47:05";
String yyyyMMdd_HHmmssStr = "20171217_194705";
Assert.assertEquals(yearFormat.parse(yearStr), DateUtils.parse(yearStr, DateFormatter.YEAR_FORMATTER));
Assert.assertEquals(yearMonthFormat.parse(yearMonthStr), DateUtils.parse(yearMonthStr, DateFormatter.YEAR_MONTH_FORMATTER));
Assert.assertEquals(dateFormat.parse(dateStr), DateUtils.parse(dateStr, DateFormatter.DATE_FORMATTER));
Assert.assertEquals(dateTimeFormat.parse(dateTimeStr), DateUtils.parse(dateTimeStr, DateFormatter.DATE_TIME_FORMATTER));
Assert.assertEquals(yyyyMMdd_HHmmssFormat.parse(yyyyMMdd_HHmmssStr), DateUtils.parse(yyyyMMdd_HHmmssStr, DateFormatter.YYYYMMDD_HHMMSS_FORMATTER));
}
}