日期格式化
日期的格式化使用SimpleDateFormat。
/**
* 日期工具类
*/
public final class DateUtils {
private DateUtils() {}
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
/**
* 日期格式化, 默认格式: yyyy-MM-dd HH:mm:ss
* @param date 日期
* @return str
*/
public static String format(Date date) {
return format(date, DATE_TIME);
}
/**
* 按指定格式格式化日期
* @param date 日期
* @param pattern 格式
* @return str
*/
public static String format(Date date, String pattern) {
if (date == null) {
return "";
}
if (pattern == null || pattern.isEmpty()) {
pattern = DATE_TIME;
}
return new SimpleDateFormat(pattern).format(date);
}
/**
* 将字符串转为日期
* @param dateStr 日期字符串
* @return date
*/
public static Date parse(String dateStr) {
return parse(dateStr, DATE_TIME);
}
/**
* 按照指定格式将字符串转为日期
* @param dateStr 日期字符串
* @param pattern 格式
* @return date
*/
public static Date parse(String dateStr, String pattern) {
if (dateStr == null || dateStr.isEmpty()) {
return null;
}
if (pattern == null || pattern.isEmpty()) {
pattern = DATE_TIME;
}
try {
return new SimpleDateFormat(pattern).parse(dateStr);
} catch (ParseException e) {
// write log
return null;
}
}
public static void main(String[] args) {
System.out.println(format(new Date()));
System.out.println(parse("2016-12-01 10:00:00"));
}
}
每次要进行日期格式化的时候,就新建一个SimpleDateFormat对象。 这种方式代价比较大。
将SimpleDateFormat改为static类型:
/**
* 日期工具类
*/
public final class DateUtils {
private DateUtils() {}
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
private static SimpleDateFormat sdf = new SimpleDateFormat();
private static SimpleDateFormat applyPattern(String pattern) {
if (!sdf.toPattern().equals(pattern)) {
sdf.applyPattern(pattern);
}
return sdf;
}
/**
* 日期格式化, 默认格式: yyyy-MM-dd HH:mm:ss
* @param date 日期
* @return str
*/
public static String format(Date date) {
return format(date, DATE_TIME);
}
/**
* 按指定格式格式化日期
* @param date 日期
* @param pattern 格式
* @return str
*/
public static String format(Date date, String pattern) {
if (date == null) {
return "";
}
if (pattern == null || pattern.isEmpty()) {
pattern = DATE_TIME;
}
return applyPattern(pattern).format(date);
}
/**
* 将字符串转为日期
* @param dateStr 日期字符串
* @return date
*/
public static Date parse(String dateStr) {
return parse(dateStr, DATE_TIME);
}
/**
* 按照指定格式将字符串转为日期
* @param dateStr 日期字符串
* @param pattern 格式
* @return date
*/
public static Date parse(String dateStr, String pattern) {
if (dateStr == null || dateStr.isEmpty()) {
return null;
}
if (pattern == null || pattern.isEmpty()) {
pattern = DATE_TIME;
}
try {
return applyPattern(pattern).parse(dateStr);
} catch (ParseException e) {
// write log
return null;
}
}
public static void main(String[] args) {
System.out.println(format(new Date()));
System.out.println(parse("2016-12-01 10:00:00"));
}
}
这种方式大大减少了SimpleDateFormat对象的创建,但是由于对象是类共享的,每个线程都可以调用SimpleDateFormat的方法对其进行修改,所以会存在并发问题。
一种解决方式是加上synchronized。
synchronized (DateUtils.class) {
return applyPattern(pattern).format(date);
}
高并发的时候,效率低。改为ThreadLocal方式实现:
/**
* 日期工具类
*/
public final class DateUtils {
private DateUtils() {}
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
/**
* SimpleDateFormat并非线程安全的, 如果创建一个static类型的, 会存在并发问题。
* 如果在每个方法里都新建一个, 代价太大。
* 所以此处使用threadlocal方式, 为每个线程新建一个SimpleDateFormat
*/
private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat(DATE_TIME);
}
};
private static SimpleDateFormat getDateFormat(String pattern) {
SimpleDateFormat sdf = threadLocal.get();
if (!sdf.toPattern().equals(pattern)) {
sdf.applyPattern(pattern);
}
return sdf;
}
/**
* 日期格式化, 默认格式: yyyy-MM-dd HH:mm:ss
* @param date 日期
* @return str
*/
public static String format(Date date) {
return format(date, DATE_TIME);
}
/**
* 按指定格式格式化日期
* @param date 日期
* @param pattern 格式
* @return str
*/
public static String format(Date date, String pattern) {
if (date == null) {
return "";
}
if (pattern == null || pattern.isEmpty()) {
pattern = DATE_TIME;
}
return getDateFormat(pattern).format(date);
}
/**
* 将字符串转为日期
* @param dateStr 日期字符串
* @return date
*/
public static Date parse(String dateStr) {
return parse(dateStr, DATE_TIME);
}
/**
* 按照指定格式将字符串转为日期
* @param dateStr 日期字符串
* @param pattern 格式
* @return date
*/
public static Date parse(String dateStr, String pattern) {
if (dateStr == null || dateStr.isEmpty()) {
return null;
}
if (pattern == null || pattern.isEmpty()) {
pattern = DATE_TIME;
}
try {
return getDateFormat(pattern).parse(dateStr);
} catch (ParseException e) {
// write log
return null;
}
}
public static void main(String[] args) {
System.out.println(format(new Date()));
System.out.println(parse("2016-12-01 10:00:00"));
}
}
字符串转为LocalDateTime
DateTimeFormatter.ofPattern(pattern).parse(str, LocalDateTime::from)
,
如果不带时间,转换会出错,如:str=2016-12-12。
日期格式化需要使用下面这种方式:
DateTimeFormatter.ofPattern("yyyy-MM-dd").parse("2016-12-12", LocalDate::from)
,