需求:把2025-03-21 03:32:40PM转换成2025-03-21 15:32:40
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class TimeConverter {
public static void main(String[] args) {
// 原始时间字符串(12小时制带AM/PM)
String inputTime = "2025-03-21 03:32:40PM";
// 定义输入和输出的格式模式
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ssa", Locale.US);
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析原始时间字符串
LocalDateTime dateTime = LocalDateTime.parse(inputTime, inputFormatter);
// 格式化为24小时制
String outputTime = dateTime.format(outputFormatter);
System.out.println("转换结果: " + outputTime);
}
}
关键点解释:
- 使用Java 8的DateTimeFormatter代替旧的SimpleDateFormat,避免线程安全问题
- 模式字母说明:
hh:12小时制的小时(01-12)HH:24小时制的小时(00-23)a:AM/PM标记
- 自动处理AM/PM转换逻辑(PM时间会自动+12小时)
- 支持月份、日期、秒数的正确格式保持
- Java默认使用系统Locale,非英语环境可能无法识别"PM"格式
注意事项:
- 输入字符串必须严格符合格式要求(包括大小写)
- 小时数必须使用两位数字(03而不是3)
- AM/PM标记必须紧跟时间后面,中间不能有空格
如果要处理不同格式变体(比如大小写混合),可以使用DateTimeFormatterBuilder进行更灵活的配置。
public class RobustTimeConverter {
public static void main(String[] args) {
String[] testCases = {
"2025-03-21 03:32:40PM", // 标准格式
"2025-02-29 12:00:00AM", // 闰年测试
"2025-07-15 9:05:06PM" // 错误格式(小时应为两位)
};
DateTimeFormatter parser = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd ")
.appendValue(ChronoField.HOUR_OF_AMPM, 2)
.appendPattern(":mm:ssa")
.toFormatter(Locale.US);
DateTimeFormatter output = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
for (String input : testCases) {
try {
LocalDateTime dt = LocalDateTime.parse(input, parser);
System.out.println(input + " → " + dt.format(output));
} catch (DateTimeParseException e) {
System.err.println("无效格式: " + input);
System.err.println("错误详情: " + e.getMessage());
}
}
}
}
674

被折叠的 条评论
为什么被折叠?



