是否有适用于每个类似日期时间模式的主日期时间模式

is there master date time pattern which will work for every similar date time patterns

我的消费者收到的时间格式是 String,值为 20/5/14_9:22:2520/5/14_9:22:520/5/14_12:22:2520/10/14_9:2:25 等...

以上所有的日期时间模式都与 yy/MM/dd_HH:mm:ss 非常不同 并且可能有很多可能只有一位数的日、月、时、分 and/or 秒。

是否有我可以用于 DateTimeFormatter.ofPattern(format) 的主模式,它适用于上述所有模式??

图案看起来一样

      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy/M/dd_H:mm:s");
      LocalDate parsedDate = LocalDate.parse("20/5/14_9:22:25", formatter);
      System.out.println(parsedDate);
      parsedDate = LocalDate.parse("20/5/14_9:22:5", formatter);
      System.out.println(parsedDate);
      parsedDate = LocalDate.parse("20/10/14_9:22:25", formatter);
      System.out.println(parsedDate);  

输出

2020-05-14
2020-05-14
2020-10-14

与直觉相反但非常实际的是,对于数字一个模式字母,例如 MH,并不意味着一个数字,而是“尽可能多的数字”。所以 M 解析 510(甚至 05)。 H 解析 912 等。通过对比两个模式字母,例如 MMHH,表示恰好是两位数字,因此不适用于既不解析 5 个月,也不解析 9 小时。它需要 0509。或者如文档所述:

Number: If the count of letters is one, then the value is output using the minimum number of digits and without padding. Otherwise, the count of digits is used as the width of the output field, with the value zero-padded as necessary. …

因此,如果您需要接受一位数的星期几或一位数的分钟数,也请分别使用一个模式字母 dm

但是有一个小时的 29(就像你在问题的早期版本中所做的那样)是错误的。

文档 link: DateTimeFormatter

Scary Wombat的回答很中肯。我添加这个答案只是为了让你知道除了 LocalDate 之外,包 java.time 还有一个 LocalDateTime,你可以用它来处理日期和时间,如下所示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy/M/dd_H:mm:s");
        LocalDateTime ldt = LocalDateTime.parse("20/5/14_9:22:25", formatter);
        System.out.println(ldt);
        ldt = LocalDateTime.parse("20/5/14_9:22:5", formatter);
        System.out.println(ldt);
        ldt = LocalDateTime.parse("20/10/14_9:22:25", formatter);
        System.out.println(ldt);
    }
}

输出:

2020-05-14T09:22:25
2020-05-14T09:22:05
2020-10-14T09:22:25