MM/dd/yyyy HH:mm:ss 海外格式转国内格式

在 Java 中,将 MM/dd/yyyy HH:mm:ss 格式的日期时间字符串转换为 yyyy-MM-dd HH:mm:ss 格式,

可以使用以下两种方法(分别针对 Java 8+ 和旧版本):


方法 1:使用 java.time 包(Java 8+ 推荐)

代码示例
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateFormatConverter {
    public static void main(String[] args) {
        // 原始格式
        String inputDate = "07/15/2024 14:30:45";
        
        // 定义输入和输出的格式化器
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        
        // 解析原始字符串为 LocalDateTime
        LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter);
        
        // 格式化为目标字符串
        String outputDate = dateTime.format(outputFormatter);
        
        System.out.println("转换结果: " + outputDate); 
        // 输出: 2024-07-15 14:30:45
    }
}
特点
  • 线程安全DateTimeFormatter 是线程安全的,可全局共享。
  • 简洁性:代码直观,无需处理 DateCalendar 的复杂性。

方法 2:使用 SimpleDateFormat(旧版 Java)

代码示例
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatConverterLegacy {
    public static void main(String[] args) {
        // 原始格式
        String inputDate = "07/15/2024 14:30:45";
        
        // 定义输入和输出的格式
        SimpleDateFormat inputFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        try {
            // 解析原始字符串为 Date
            Date date = inputFormat.parse(inputDate);
            
            // 格式化为目标字符串
            String outputDate = outputFormat.format(date);
            
            System.out.println("转换结果: " + outputDate); 
            // 输出: 2024-07-15 14:30:45
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
特点
  • 线程不安全SimpleDateFormat 实例不能在多线程中共享。
  • 兼容性:适用于 Java 7 及更低版本。

关键注意事项

1. 格式符号的严格匹配
  • 确保输入字符串与模式完全匹配(如分隔符 /- 需保持一致)。
  • 例如,输入 07-15-2024 14:30:45(分隔符为 -)与模式 MM/dd/yyyy 不匹配,会解析失败。
2. 异常处理
  • 解析时需捕获 DateTimeParseException(Java 8+)或 ParseException(旧版本)。

  • 示例(Java 8+):

    try {
        LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter);
    } catch (DateTimeParseException e) {
        System.err.println("日期格式错误: " + e.getMessage());
    }
    
3. 时区问题
  • 若输入字符串包含时区信息(如 MM/dd/yyyy HH:mm:ss z),需使用 ZonedDateTime 替代 LocalDateTime

  • 示例:

    String inputDate = "07/15/2024 14:30:45 CST";
    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss z");
    ZonedDateTime zonedDateTime = ZonedDateTime.parse(inputDate, inputFormatter);
    
4. 性能优化(高频调用场景)
  • java.time:可复用 DateTimeFormatter 实例(线程安全)。

  • SimpleDateFormat:避免重复创建实例,需通过 ThreadLocal 包装解决线程安全问题:

    private static final ThreadLocal<SimpleDateFormat> inputFormat = 
        ThreadLocal.withInitial(() -> new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"));
    
    // 使用方式
    Date date = inputFormat.get().parse(inputDate);
    

常见问题

Q1:输入字符串的月份或日期为单数字(如 7/5/2024)能否解析?
  • 可以MMdd 模式支持单数字输入(如 7 会解析为 07),但输出时会自动补零(如 2024-07-05)。
Q2:如何处理 12 小时制时间?
  • 若输入是 MM/dd/yyyy hh:mm:ss a(如 07/15/2024 02:30:45 PM),需调整模式:

    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a");
    

总结

场景推荐方法线程安全代码示例
Java 8+ 项目java.timeLocalDateTime + DateTimeFormatter
旧版 Java(≤7)SimpleDateFormat❌(需封装)SimpleDateFormat + Date

优先使用 java.time 方案,避免遗留类的线程安全问题,并保持代码简洁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值