首页 > 解决方案 > 如何将格式日期“MMddhhmmss”转换为“yyyy-MM-dd HH:mm:ss”?

问题描述

如何将日历日期转换为 yyyy-MM-dd HH:mm:ss 格式。

protected String paymentDatetime (String transmissionDateTime){
    long transactionDateTime = System.currentTimeMillis();
    Date now = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        SimpleDateFormat df = new SimpleDateFormat("MMddhhmmss");
        Calendar nowDate = Calendar.getInstance();
        nowDate.setTime(now);

        Calendar transmissionDate = Calendar.getInstance();
        transmissionDate.setTime(df.parse(transmissionDateTime));
        transmissionDate.set(Calendar.YEAR, nowDate.get(Calendar.YEAR));

        transactionDateTime = transmissionDate.getTime().getTime();
    } catch (ParseException e) {
        LOGGER.error("cannot parse transmission date time : " + transmissionDateTime);
    }
    return sdf.format(transactionDateTime);
}

我想得到String transmissionDateTime抛出的值,但实际上当我抛出 value = 1707 1255 17 (in AM) 时,将转换为“2020-07-17 00:55:17”。如何转换以使 AM 和 PM 每隔 12.00 或 00.00(12 点)都不会改变?

标签: javacalendarsimpledateformat

解决方案


不要在程序中将日期和时间作为字符串处理。处理并将它们存储为适当的日期时间对象。当您接受字符串输入时,将其解析为日期时间对象。只有当您需要提供字符串输出时,才将您的日期时间对象格式化为适当的字符串。

java.time

我认为使用现代 Java 日期和时间 API java.time,您的解析会变得更加清晰。我知道字符串中给出的小时是一天中的小时,所以 00 表示午夜 12 点,12 表示中午 12 点。

    Year thisYear = Year.now(ZoneId.systemDefault());
    DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
            .appendPattern("ddMMHHmmss")
            .parseDefaulting(ChronoField.YEAR, thisYear.getValue())
            .toFormatter();
    
    String transmissionDateTimeString = "1707125517";
    
    LocalDateTime transmissionDateTime
            = LocalDateTime.parse(transmissionDateTimeString, inputFormatter);
    
    System.out.println(transmissionDateTime);

今天运行时的输出:

2020-07-17T12:55:17

格式化输出

我向您展示了将输出格式化为2020-07-17 12:55:17.

  1. 使用格式化程序
  2. 只需用T空格替换

使用格式化程序:

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String output = transmissionDateTime.format(outputFormatter);

只需更换T

    String output = transmissionDateTime.toString().replace('T', ' ');

你的代码出了什么问题?

格式模式字符串中的小写hh是从 01 到 12 的 AM 或 PM 中的小时。这适用于老式SimpleDateFormat和现代DateTimeFormatter. 您没有告诉格式化程序您想要上午还是下午。在这种情况下SimpleDateFormat假设上午,这就是为什么你得到一个时间 og 00:55:17。大写HH是从 00 到 23 的一天中的小时。

此外,您似乎不小心在格式模式中交换了月份和日期以进行解析,MMddhhmmss. 当我调用你的方法时,我得到了2020-05-07 00:55:17. 月份和日期是错误的。你df解析1707125517Fri May 07 00:55:17 CET 1971. 一年中没有第 17 个月,但SimpleDateFormat令人困惑地推断,因此 1970 年的第 17 个月变成了 1971 年的第 5 个月。

链接


推荐阅读