使用 java.time.temporal.ChronoUnit 时出现 DateTimeParseException
DateTimeParseException while using java.time.temporal.ChronoUnit
我对堆栈溢出和编程都是新手。我正在尝试使用 Java 8 来查找时间戳值和当前时间戳值之间的时间差。
以下是我的 Scala 代码片段:
println(ChronoUnit.MILLIS.between(Instant.parse("1534274986"), Instant.now()))
它工作正常,直到我有一个测试用例,其中 Human DateTime 的纪元归结为 08/14/18 19:06:17
。在那种情况下,我得到一个错误:
Execution exception[[DateTimeParseException: Text '08/14/18 19:06:17' could not be parsed at index 0]]
请帮助我理解为什么会出现这样的错误。谢谢。
LocalDateTime
的 .parse()
方法在默认情况下相当有限。这就是为什么你 运行 进入上面发布的那个错误。但是您可以通过在两者之间使用 FormatterBuilder 设计和应用您自己的特定格式化程序来解决此问题:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("MM/dd/yy[ HH:mm:ss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
LocalDateTime localDateTime1 = LocalDateTime.parse("08/14/18 19:06:17", formatter);
LocalDateTime localDateTime2 = LocalDateTime.parse("08/14/18 19:08:19", formatter);
System.out.println(ChronoUnit.MILLIS.between(localDateTime1, localDateTime2));
// Result: 122000 ms
您也可以将格式化时间与当前本地时间进行比较:
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println(ChronoUnit.MILLIS.between(localDateTime1, currentDateTime));
如果您更喜欢使用 Instant
,您可以轻松地从上面解析的 LocalDateTime
个实例中创建自己的实例:
import java.time.*;
LocalDateTime currentDateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.of("US/Eastern");
ZonedDateTime zonedDateTime = ZonedDateTime.of(currentDateTime, zoneId);
Instant instant = zonedDateTime.toInstant();
我对堆栈溢出和编程都是新手。我正在尝试使用 Java 8 来查找时间戳值和当前时间戳值之间的时间差。
以下是我的 Scala 代码片段:
println(ChronoUnit.MILLIS.between(Instant.parse("1534274986"), Instant.now()))
它工作正常,直到我有一个测试用例,其中 Human DateTime 的纪元归结为 08/14/18 19:06:17
。在那种情况下,我得到一个错误:
Execution exception[[DateTimeParseException: Text '08/14/18 19:06:17' could not be parsed at index 0]]
请帮助我理解为什么会出现这样的错误。谢谢。
LocalDateTime
的 .parse()
方法在默认情况下相当有限。这就是为什么你 运行 进入上面发布的那个错误。但是您可以通过在两者之间使用 FormatterBuilder 设计和应用您自己的特定格式化程序来解决此问题:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("MM/dd/yy[ HH:mm:ss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
LocalDateTime localDateTime1 = LocalDateTime.parse("08/14/18 19:06:17", formatter);
LocalDateTime localDateTime2 = LocalDateTime.parse("08/14/18 19:08:19", formatter);
System.out.println(ChronoUnit.MILLIS.between(localDateTime1, localDateTime2));
// Result: 122000 ms
您也可以将格式化时间与当前本地时间进行比较:
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println(ChronoUnit.MILLIS.between(localDateTime1, currentDateTime));
如果您更喜欢使用 Instant
,您可以轻松地从上面解析的 LocalDateTime
个实例中创建自己的实例:
import java.time.*;
LocalDateTime currentDateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.of("US/Eastern");
ZonedDateTime zonedDateTime = ZonedDateTime.of(currentDateTime, zoneId);
Instant instant = zonedDateTime.toInstant();