如何使用Joda在一个格式化程序中解析两个类似于datetime的字符串?

时间:2018-10-12 11:15:01

标签: java jodatime datetime-format datetime-parsing

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

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);

3 个答案:

答案 0 :(得分:3)

您可以使用[]

表示格式的某些部分是可选的
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 :(得分:2)

两个选项:

  1. 通过ThreeTen Backport库使用现代Java日期和时间API java.time。
  2. 像以前一样使用Joda-Time。

ThreeTen Backport

Joda-Time主页上的两句话:

  

现在要求用户迁移到java.time(JSR-310)。

     

请注意,Joda-Time被认为是很大程度上“完成”的项目。   没有计划进行重大增强。如果使用Java SE 8,请迁移   到java.time(JSR-310)。

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

安东·巴拉纽克(Anton Balaniuc)已经在他的良好答案中显示了该代码,因此我在这里没有重复这一点。

Joda-Time

    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);

在欧洲/哥本哈根时区的计算机上,此代码段的输出为:

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

如您所见,以格式指定可选部分的关键是appendOptional的{​​{1}}方法。

链接

答案 2 :(得分:0)

您可以使用DateTimeFormatterBuilder类,类似这样。

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