Java LocalDateTime解析错误

时间:2014-12-25 02:39:40

标签: java date java-time

尝试了4个小时来解决这个问题。

:这有效

String date = "Jul-01-2014 09:10:12";
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US));

:这不会

String date = "JUL-01-2014 09:10:12";
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US));

唯一不同的是全部资本化的月份。七月的正确案例。 JUL或jul都不会起作用。我也试过'LLL'模式没有运气。我错过了什么?

4 个答案:

答案 0 :(得分:11)

显然,我需要花5个小时才能完成这项工作。 在编写扩展程序以提供解决方法时,我发现了这一点。

    String date = "01-JUL-2014 09:10:12";

    DateTimeFormatterBuilder fmb = new DateTimeFormatterBuilder();
    fmb.parseCaseInsensitive();
    fmb.append(DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm:ss"));

    LocalDateTime dt = LocalDateTime.parse(date, fmb.toFormatter());

适用于所有案例样式。

答案 1 :(得分:1)

official API支持它看起来不像。

Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   G       era                         text              AD; Anno Domini; A
   u       year                        year              2004; 04
   y       year-of-era                 year              2004; 04
   D       day-of-year                 number            189
   M/L     month-of-year               number/text       7; 07; Jul; July; J
   d       day-of-month                number            10

每年的唯一选择是,并没有明确提及任何支持三个大​​写字母月份的格式。

将它转换回Java可以尊重的格式并不是非常困难;然而,它涉及到一点点的日期并将它放回一个字符串中。

下面的解决方案并不像使用第三方那样优雅或干净,但额外的好处是,根本不需要依赖第三方库来获取此代码。

public String transformToNormalizedDateFormat(final String input) {
    String[] components = input.split("-");
    String month = components[0];
    if(month.length() > 3) {
        throw new IllegalArgumentException("Was not a date in \"MMM\" format: " + month);
    }
    // Only capitalize the first letter.
    final StringBuilder builder = new StringBuilder();
    builder.append(month.substring(0, 1).toUpperCase())
            .append(month.substring(1).toLowerCase())
            .append("-");
    final StringJoiner stringJoiner = new StringJoiner("-");
    Arrays.stream(components, 1, components.length).forEach(stringJoiner::add);
    builder.append(stringJoiner.toString());
    return builder.toString();
}

答案 2 :(得分:1)

尝试使用DateTimeFormatterBuilder并使解析器不区分大小写。别忘了指定区域设置。否则MMM在默认语言环境中可能无法解析月份缩写:

DateTimeFormatter format = new DateTimeFormatterBuilder()
  .parseCaseInsensitive()
  .appendPattern("dd-MMM-yyyy")
  .toFormatter(Locale.ENGLISH);

LocalDate.parse("03-jun-2015", format);

答案 3 :(得分:0)

根据定义,

M需要July; Jul; 07。您可能想尝试(解决方案有点难看):

date = Character.toUpperCase(date.charAt(0)) + date.substring(1).toLowerCase();
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US));

或者您可以尝试使用apache-commons中的WordUtils作为capitalize