如何使用 joda 在一个格式化程序中将两个相似的字符串解析为日期时间?

How to parse two similar string to datetime in one formatter with joda?

现在我有两种不同格式的日期字符串:

String date1 = "2018-10-12 18:01:01";// yyyy-MM-dd HH:mm:ss
String date2 = "2018-10-12 18:01";//yyyy-MM-dd HH:mm

我正在使用joda,我想将字符串转换为DateTime,基本的方法是使用两个格式化程序来解析它们中的每一个:

DateTimeFormatter formatter1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter formatter2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
DateTime dt1 = formatter1.parseDateTime(date1);
DateTime dt2 = formatter2.parseDateTime(date2);

上面的代码块工作正常但是它创建了两个格式化程序,因为日期格式非常相似(后者只是缺少秒),我想知道是否有一种方法可以只使用一个格式化程序来解析所有这些还是我必须使用两个格式化程序?

注意: 由于生产环境限制,我现在不能使用java8,所以我想根据joda

来回答

提前致谢!


我刚刚尝试了如下,得到了IllegalArgumentException: Invalid format

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dt1 = formatter.parseDateTime(date1);
DateTime dt2 = formatter.parseDateTime(date2);

你可以使用 DateTimeFormatterBuilder class,像这样。

  private DateTimeFormatter formatterBuilder() {
        return new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd HH:mm")
                .optionalStart().appendPattern(":ss").optionalEnd()
                .toFormatter();
    }

您可以使用 []

表明格式的某些部分是可选的
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm[:ss]");
LocalDateTime dateTime = LocalDateTime.parse("2018-10-12 18:01:01", formatter);
LocalDateTime dateTime1 = LocalDateTime.parse("2018-10-12 18:01", formatter);
System.out.println(dateTime + " " + dateTime1);

结果是

2018-10-12T18:01:01 2018-10-12T18:01

有关详细信息,请参阅 Patterns for Formatting and Parsing 部分。

两个选项:

  1. 通过 ThreeTen Backport 库使用 java.time,现代 Java 日期和时间 API。
  2. 像您已经在做的那样使用 Joda-Time。

ThreeTen 向后移植

Joda-Time 主页上的两句话:

Users are now asked to migrate to java.time (JSR-310).

Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).

好消息是即使使用 Java 6 或 7 也可以迁移。java.time 的开发人员(由 Stephen Colebourne 领导,也是 Joda-Time 的主要开发人员)也开发了ThreeTen Backport,java.time 的 backport for Java 6 和 7。见底部的 link。

Anton Balaniuc 已经在他的好回答中展示了代码,所以我在这里重复没有用。

乔达时间

    String date1 = "2018-10-12 18:01:01";// yyyy-MM-dd HH:mm:ss
    String date2 = "2018-10-12 18:01";//yyyy-MM-dd HH:mm
    DateTimeFormatter parser = new DateTimeFormatterBuilder()
                    .appendPattern("yyyy-MM-dd HH:mm")
                    .appendOptional(DateTimeFormat.forPattern(":ss").getParser())
                    .toFormatter();
    DateTime dt1 = parser.parseDateTime(date1);
    DateTime dt2 = parser.parseDateTime(date2);
    System.out.println("dt1: " + dt1);
    System.out.println("dt2: " + dt2);

在我的 Europe/Copenhagen 时区计算机上,此代码段的输出是:

dt1: 2018-10-12T18:01:01.000+02:00
dt2: 2018-10-12T18:01:00.000+02:00

如你所见,在格式中指定可选部分的关键是DateTimeFormatterBuilderappendOptional方法。

链接