1. 概述

在这个快速教程中,我们将**解释如何使用Java将String转换为Instant**,借助java.time包中的类。首先,我们将通过LocalDateTime类实现解决方案。然后,我们将利用Instant类获取时区内的一个瞬间。

2. 使用LocalDateTime

java.time.LocalDateTime表示没有时区的日期和/或时间。它是一个本地时间对象,意味着它只在特定上下文中有效,不能在该上下文之外使用。这个上下文通常是代码执行的机器。

要从String获取时间,我们可以使用DateTimeFormatter创建格式化的对象,并将此格式器传递给LocalDateTimeparse方法。此外,我们也可以自定义格式器或使用DateTimeFormatter类提供的预定义格式器。

让我们看看如何使用LocalDateTime.parse()String获取时间:

String stringDate = "09:15:30 PM, Sun 10/09/2022"; 
String pattern = "hh:mm:ss a, EEE M/d/uuuu"; 
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US); 
LocalDateTime localDateTime = LocalDateTime.parse(stringDate, dateTimeFormatter);

在上述示例中,我们使用LocalDateTime类,这是表示带有时间的日期的标准类,来解析日期String。我们也可以使用java.time.LocalDate仅表示没有时间的日期。

3. 使用Instant

java.time.Instant类是日期时间API的主要类之一,它封装了时间线上的一个点。它类似于java.util.Date类,但提供了纳秒级精度

在下一个示例中,我们将使用之前的LocalDateTime获取一个带有指定ZoneId的瞬间:

String stringDate = "09:15:30 PM, Sun 10/09/2022"; 
String pattern = "hh:mm:ss a, EEE M/d/uuuu"; 
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US); 
LocalDateTime localDateTime = LocalDateTime.parse(stringDate, dateTimeFormatter); 
ZoneId zoneId = ZoneId.of("America/Chicago"); 
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId); 
Instant instant = zonedDateTime.toInstant();

在此示例中,我们首先创建一个ZoneId对象,用于标识时区,然后提供LocalDateTimeInstant之间的转换规则。

接下来,我们使用ZonedDateTime,它封装了一个带有时区和相应偏移量的日期和时间。ZonedDateTime类是日期时间API中最接近java.util.GregorianCalendar类的类。最后,我们使用ZonedDateTime.toInstant()方法获取一个Instant,它将时区中的时刻调整为UTC。

4. 总结

在这篇快速教程中,我们解释了**如何使用Java将String转换为Instant**,利用了java.time包中的类。如往常一样,代码片段可在GitHub上找到。