带有AM/PM的java日期格式转换

需求:把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);
    }
}

关键点解释:

  1. 使用Java 8的DateTimeFormatter代替旧的SimpleDateFormat,避免线程安全问题
  2. 模式字母说明:
    • hh:12小时制的小时(01-12)
    • HH:24小时制的小时(00-23)
    • a:AM/PM标记
  3. 自动处理AM/PM转换逻辑(PM时间会自动+12小时)
  4. 支持月份、日期、秒数的正确格式保持
  5. Java默认使用系统Locale,非英语环境可能无法识别"PM"格式

注意事项:

  1. 输入字符串必须严格符合格式要求(包括大小写)
  2. 小时数必须使用两位数字(03而不是3)
  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());
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值