繁体   English   中英

如何将格式日期“MMddhhmmss”转换为“yyyy-MM-dd HH:mm:ss”?

[英]How to convert format date “MMddhhmmss” to “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 点)都不会改变?

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

java.time

我认为使用 java.time,现代 Java 日期和时间 API,您的解析会变得更加清晰。 我知道字符串中给出的小时是一天中的小时,所以 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);

Output 今天运行时:

2020-07-17T12:55:17

格式化 output

我向您展示了将 output 格式化为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 的小时。这适用于老式的SimpleDateFormat和现代的DateTimeFormatter 您没有告诉格式化程序您想要上午还是下午。 在这种情况下, SimpleDateFormat假定 AM,这就是为什么您的时间为 00:55:17。 大写HH表示一天中从 00 到 23 的小时。

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

链接

CalendarSimpleDateFormat是旧类,不再推荐。
使用java.time package 中的LocalDateTimeDateTimeFormatter类。

DateTimeFormatter from = DateTimeFormatter.ofPattern("MMddhhmmss");
DateTimeFormatter to12Hour = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
DateTimeFormatter to24Hour = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.format(from));
System.out.println(ldt.format(to12Hour));
System.out.println(ldt.format(to24Hour));

印刷

0716082236
2020-07-16 08:22:36 PM
2020-07-16 20:22:36

正如评论已经涵盖的那样: MMddhhmmss应该是使用大写HHMMddHHmmss


格式MMddHHmmss的字符串"1707125517"表示MM = 17dd = 07 不带年份解析时,年份默认为 1970 年,1970 年的第 17 个月解析为 1971 年的第5个月,这就是问题代码导致2020-05-07 (第 5 个月第 7 天)的原因。

您确定 Month = 17 的输入是您要解析的内容,并且格式模式是您想要的吗? 似乎月份和日期是颠倒的,因为你说"will be convert to "2020-07-17 00:55:17"" ,其中月份是 7 天是 17,所以也许你应该尝试格式化ddMMHHmmss

问题中的方法可以缩短为仅使用一个Calendar object 而不是两个:

protected static String paymentDatetime(String dateTime) {
    Calendar cal = Calendar.getInstance();
    int year = cal.get(Calendar.YEAR);
    try {
        cal.setTime(new SimpleDateFormat("ddMMHHmmss").parse(dateTime));
    } catch (ParseException e) {
        throw new IllegalArgumentException("Invalid date string: " + dateTime, e);
    }
    cal.set(Calendar.YEAR, year);
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
}

该方法也被更改为不忽略解析异常


不应使用旧的过时DateSimpleDateFormat类。 相反,使用较新的Java 8 时间 API类。

protected static String paymentDatetime(String dateTime) {
    DateTimeFormatter in = new DateTimeFormatterBuilder()
            .appendPattern("ddMMHHmmss")
            .parseDefaulting(ChronoField.YEAR, Year.now().getValue())
            .toFormatter();
    DateTimeFormatter out = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    return LocalDateTime.parse(dateTime, in).format(out);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM