Java日期格式化实现过程
作者:@zcc@
本文介绍了在Java中处理日期格式yyyyMMddHHmmss的方法,包括使用java.time包(Java8+)和SimpleDateFormat(Java7及以下),详细说明了格式化和解析时间的示例代码,并强调了线程安全和异常处理的重要性,还讨论了常见错误及其解决方法,以及如何生成唯一标识符
在 Java 中处理日期格式 yyyyMMddHHmmss(即年-月-日-时-分-秒,无分隔符),可以通过 java.time 包(Java 8+)或 SimpleDateFormat(Java 7 及以下)实现。
以下是详细说明和示例代码:
1. Java 8+:使用java.time包
推荐使用 Java 8 的 java.time 包,它更现代、线程安全且功能更强大。
1.1 格式化当前时间为yyyyMMddHHmmss
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateFormatter {
public static void main(String[] args) {
// 当前时间
LocalDateTime now = LocalDateTime.now();
// 定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
// 格式化为字符串
String formattedTime = now.format(formatter);
System.out.println("当前时间(yyyyMMddHHmmss): " + formattedTime);
}
}
输出示例:
当前时间(yyyyMMddHHmmss): 20250612154603
1.2 将yyyyMMddHHmmss字符串解析为LocalDateTime
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateFormatter {
public static void main(String[] args) {
// 输入字符串
String input = "20250612154603";
// 定义解析格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
// 解析为 LocalDateTime
LocalDateTime dateTime = LocalDateTime.parse(input, formatter);
System.out.println("解析后的日期时间: " + dateTime);
}
}
输出示例:
解析后的日期时间: 2025-06-12T15:46:03
2. Java 7 及以下:使用SimpleDateFormat
对于旧版 Java,可以使用 SimpleDateFormat,但需注意线程安全问题。
2.1 格式化当前时间为yyyyMMddHHmmss
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatter {
public static void main(String[] args) {
// 当前时间
Date now = new Date();
// 定义格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
// 格式化为字符串
String formattedTime = formatter.format(now);
System.out.println("当前时间(yyyyMMddHHmmss): " + formattedTime);
}
}
输出示例:
当前时间(yyyyMMddHHmmss): 20250612154603
2.2 将yyyyMMddHHmmss字符串解析为Date
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatter {
public static void main(String[] args) {
try {
// 输入字符串
String input = "20250612154603";
// 定义解析格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
// 解析为 Date
Date date = formatter.parse(input);
System.out.println("解析后的日期时间: " + date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
输出示例:
解析后的日期时间: Wed Jun 12 15:46:03 CST 2025
3. 注意事项
| 符号 | 含义 | 示例 |
|---|---|---|
| yyyy | 四位数的年份 | 2025 |
| YYYY | ISO 周历年 2024(可能跨年) | 谨慎使用,仅用于周相关场景 |
| MM | 两位数的月份(01-12) | 06 |
| dd | 两位数的日期(01-31) | 12 |
| HH | 24小时制的小时(00-23) | 15 |
| hh | 12小时制的小时(01-12) | 15 |
| mm | 分钟(00-59) | 49 |
| ss | 秒(00-59) | 33 |
| SSS | 毫秒(000-999) | 123 |
线程安全:
SimpleDateFormat不是线程安全的,在多线程环境中需每次创建新实例或使用synchronized。DateTimeFormatter是线程安全的,推荐优先使用。
异常处理:
- 使用
SimpleDateFormat.parse()时需捕获ParseException。
4. 常见错误及解决方法
错误 1:格式模式与输入字符串不匹配
- 原因:输入字符串的格式与定义的
DateTimeFormatter或SimpleDateFormat不一致。 - 解决:检查格式模式是否正确,例如
yyyyMMddHHmmss不能用于2025-06-12 15:46:03。
错误 2:解析非法日期(如 20250230)
- 原因:输入字符串包含非法日期(如 2 月 30 日)。
- 解决:捕获异常并处理非法输入。
5. 扩展:生成唯一标识符
yyyyMMddHHmmss 常用于生成唯一标识符(如订单号、文件名)。
可以结合序列号或 UUID:
// 示例:生成订单号
String orderNumber = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + "-001";
System.out.println("订单号: " + orderNumber);
输出示例:
订单号: 20250612154603-001
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
