时间转换工具
在Java开发中,时间处理是一个常见的需求,无论是记录日志、数据库操作还是前后端交互,正确地格式化和解析时间是至关重要的。本文将通过介绍一个实用的时间转换工具类DateUtil,来展示如何高效且线程安全地进行日期与字符串之间的转换,以及日期的简单计算。代码如下:
public class DateUtil {
private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
public static final String DATE_FORMAT = "yyyy-MM-dd";
public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DATETIME_FULL = "yyyyMMddHHmmssSSS";
public static final String DATETIME_UTC = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static final ThreadLocal<Map<String, DateFormat>> dateFormatThreadLocal = ThreadLocal.withInitial(ConcurrentHashMap::new);
public DateUtil() {
}
private static DateFormat getDateFormat(String pattern) {
if (pattern == null || pattern.trim().isEmpty()) {
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
Map<String, DateFormat> dateFormatMap = dateFormatThreadLocal.get();
DateFormat dateFormat = dateFormatMap.get(pattern);
if (dateFormat == null) {
synchronized (dateFormatThreadLocal) {
dateFormat = dateFormatMap.get(pattern);
if (dateFormat == null) {
dateFormat = new SimpleDateFormat(pattern);
dateFormatMap.put(pattern, dateFormat);
}
}
}
return dateFormat;
}
/**
* 将 Date 对象格式化为字符串。
*
* @param date 需要被格式化的 Date 对象。
* @return 格式化后的日期字符串,格式为"yyyy-MM-dd"。
*/
public static String formatDate(Date date) {
return format(date, DATE_FORMAT);
}
/**
* 将 Date 对象格式化为字符串。
*
* @param date 需要被格式化的 Date 对象。
* @return 格式化后的日期字符串,格式为"yyyy-MM-dd HH:mm:ss"。
*/
public static String formatDateTime(Date date) {
return format(date, DATETIME_FORMAT);
}
/**
* 将 Date 对象格式化为字符串。
*
* @param date 需要被格式化的 Date 对象。
* @return 格式化后的日期字符串,格式为"yyyyMMddHHmmssSSS"。
*/
public static String formatDateTimeFull(Date date) {
return format(date, DATETIME_FULL);
}
/**
* 将 Date 对象格式化为字符串。
*
* @param date 需要被格式化的 Date 对象。
* @return 格式化后的日期字符串,格式为"yyyy-MM-dd'T'HH:mm:ss'Z'"。
*/
public static String formatDateTimeUTC(Date date) {
return format(date, DATETIME_UTC);
}
/**
* 将 Date 对象格式化为字符串。
*
* @param date 需要被格式化的 Date 对象。
* @return 格式化后的日期字符串,格式为指定的日期格式。
*/
public static String format(Date date, String patten) {
return getDateFormat(patten).format(date);
}
/**
* 解析日期时间字符串为Date对象。
*
* @param dateString 待解析的日期时间字符串,格式为"yyyy-MM-dd"。
* @return 返回解析后的Date对象。
*/
public static Date parseDate(String dateString) {
return parse(dateString, DATE_FORMAT);
}
/**
* 解析日期时间字符串为Date对象。
*
* @param dateString 待解析的日期时间字符串,格式为"yyyy-MM-dd HH:mm:ss"。
* @return 返回解析后的Date对象。
*/
public static Date parseDateTime(String dateString) {
// 使用预定义的日期时间格式解析字符串
return parse(dateString, DATETIME_FORMAT);
}
/**
* 解析日期时间字符串为Date对象。
*
* @param dateString 待解析的日期时间字符串,格式为"yyyyMMddHHmmssSSS"。
* @return 返回解析后的Date对象。
*/
public static Date parseDateTimeFull(String dateString) {
return parse(dateString, DATETIME_FULL);
}
/**
* 解析日期时间字符串为Date对象。
*
* @param dateString 待解析的日期时间字符串,格式为"yyyy-MM-dd'T'HH:mm:ss'Z'"。
* @return 返回解析后的Date对象。
*/
public static Date parseDateTimeUTC(String dateString) {
return parse(dateString, DATETIME_UTC);
}
/**
* 解析日期时间字符串为Date对象。
*
* @param dateString 待解析的日期时间字符串,格式为指定的日期格式。
* @return 返回解析后的Date对象。
*/
public static Date parse(String dateString, String pattern) {
try {
return getDateFormat(pattern).parse(dateString);
} catch (Exception var3) {
logger.warn("parse date error, dateString = {}, pattern={}; errorMsg = {}", dateString, pattern, var3.getMessage());
return null;
}
}
public static Date addYears(Date date, int amount) {
return add(date, Calendar.YEAR, amount);
}
public static Date addMonths(Date date, int amount) {
return add(date, Calendar.MONTH, amount);
}
public static Date addDays(Date date, int amount) {
return add(date, Calendar.DATE, amount);
}
public static Date addMinutes(Date date, int amount) {
return add(date, Calendar.MINUTE, amount);
}
private static Date add(Date date, int calendarField, int amount) {
if (date == null) {
return null;
} else {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(calendarField, amount);
return c.getTime();
}
}
}
示例代码
Date now = new Date();
String formattedDate = DateUtil.formatDate(now); // 格式化日期
System.out.println(formattedDate);
String futureDateStr = DateUtil.formatDate(DateUtil.addDays(now, 7)); // 计算一周后日期并格式化
System.out.println(futureDateStr);
Date parsedDate = DateUtil.parseDate("2023-12-9"); // 解析字符串为日期
System.out.println(parsedDate);