使用 java 8 解析 LocalDateTime 时出现问题
Problem with parse a LocalDateTime using java 8
我有这段代码,这是一个简单的字符串,我想将它解析为 LocalDateTime
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
public class DateClass {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String dateRaw = "2019-05-03 7:05:03";
DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("uuuu-mm-dd HH:mm:ss").toFormatter();
LocalDateTime date= LocalDateTime.parse(dateRaw, dtf);
System.out.println(date.toString());
}
}
当你运行时,我遇到了下一个错误:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-05-03 7:05:03' could not be parsed at index 11
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at lectordeachvio.DateClass.main(DateClass.java:18)
我做错了什么?为什么 de space 有问题????
您应该更改有关月份的模式,因为您使用的是分钟:
"uuuu-MM-dd HH:mm:ss"
请参阅docs。并按照提供的模式将示例日期小时部分从 7 更改为 07。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd H:mm:ss");
通过此更改您的程序输出:
2019-05-03T07:05:03
- 单一格式模式字母
H
将匹配 1 位或两位数的小时。也就是说,它将接受 7
、07
、13
等。另一方面,两个 HH
需要两个数字,例如 07
或 13
,所以不能单独解析7
。这就是您遇到异常的原因。
- 字符串的索引 11 不在 space 所在的位置。这是
7
所在的位置。索引从 0 开始。
- 正如其他人提到的,您还需要使用大写
MM
作为月份编号。小写 mm
表示小时。
- 顺便说一句,对于这种情况,您不一定需要
DateTimeFormatterBuilder
。 DateTimeFormatter.ofPattern
工作正常。
出于好奇,如果您的格式化程序仅用于解析,您可以省略所有重复的模式字母。这也有效:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s");
不过通常我们不希望这样。我们更愿意验证 有 两位数字表示分钟和秒,通常也用于月份和日期。放两个模式字母就可以做到这一点。
格式模式中关于 mm
的部分相关问题:Convert LocalDate in DD/MM/YYYY LocalDate [duplicate].
我有这段代码,这是一个简单的字符串,我想将它解析为 LocalDateTime
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
public class DateClass {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String dateRaw = "2019-05-03 7:05:03";
DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("uuuu-mm-dd HH:mm:ss").toFormatter();
LocalDateTime date= LocalDateTime.parse(dateRaw, dtf);
System.out.println(date.toString());
}
}
当你运行时,我遇到了下一个错误:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-05-03 7:05:03' could not be parsed at index 11
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at lectordeachvio.DateClass.main(DateClass.java:18)
我做错了什么?为什么 de space 有问题????
您应该更改有关月份的模式,因为您使用的是分钟:
"uuuu-MM-dd HH:mm:ss"
请参阅docs。并按照提供的模式将示例日期小时部分从 7 更改为 07。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd H:mm:ss");
通过此更改您的程序输出:
2019-05-03T07:05:03
- 单一格式模式字母
H
将匹配 1 位或两位数的小时。也就是说,它将接受7
、07
、13
等。另一方面,两个HH
需要两个数字,例如07
或13
,所以不能单独解析7
。这就是您遇到异常的原因。 - 字符串的索引 11 不在 space 所在的位置。这是
7
所在的位置。索引从 0 开始。 - 正如其他人提到的,您还需要使用大写
MM
作为月份编号。小写mm
表示小时。 - 顺便说一句,对于这种情况,您不一定需要
DateTimeFormatterBuilder
。DateTimeFormatter.ofPattern
工作正常。
出于好奇,如果您的格式化程序仅用于解析,您可以省略所有重复的模式字母。这也有效:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s");
不过通常我们不希望这样。我们更愿意验证 有 两位数字表示分钟和秒,通常也用于月份和日期。放两个模式字母就可以做到这一点。
格式模式中关于 mm
的部分相关问题:Convert LocalDate in DD/MM/YYYY LocalDate [duplicate].