我的消费者收到的时间格式是String
值20/5/14_9:22:25
或20/5/14_9:22:5
或20/5/14_12:22:25
或20/10/14_9:2:25
等...
以上所有内容都具有非常不同的日期时间模式,yy/MM/dd_HH:mm:ss
并且可能有许多具有单个数字日、月、小时、分钟和/或秒的可能性。
是否有一个我可以使用的主模式,DateTimeFormatter.ofPattern(format)
它适用于上述所有模式?
我的消费者收到的时间格式是String
值20/5/14_9:22:25
或20/5/14_9:22:5
或20/5/14_12:22:25
或20/10/14_9:2:25
等...
以上所有内容都具有非常不同的日期时间模式,yy/MM/dd_HH:mm:ss
并且可能有许多具有单个数字日、月、小时、分钟和/或秒的可能性。
是否有一个我可以使用的主模式,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
与直觉相反但非常实用的是,对于数字,一个模式字母,例如M
or H
,并不意味着一个数字,而是“尽可能多的数字”。所以M
解析5
和10
(甚至05
)。H
解析9
和12
等。相比之下,两个模式字母,例如MM
or HH
,正好表示两位数,因此对于解析 5 个月和 9 小时都不起作用。它需要05
or 09
。或者正如文档所说:
数字:如果字母数为 1,则使用最小位数输出值且不进行填充。否则,位数将用作输出字段的宽度,必要时将值补零。…</p>
因此,如果您需要接受一位数的月份日期或一位数的小时分钟,也请分别使用一个模式字母d
和m
。
但是有一个小时29
(就像你在问题的早期版本中所做的那样)是错误的。
文档链接: DateTimeFormatter
可怕袋熊的答案是中肯的。我添加这个答案只是为了让你知道,除了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