你可以将日期和时间字符串组合成ISO 8601格式的日期时间字符串,然后可以将其解析为
LocalDateTime
,再使用适当的
ZoneId
转换为
Instant
。请注意,现代日期时间API基于
ISO 8601,只要日期时间字符串符合ISO 8601标准,就不需要显式使用
DateTimeFormatter
对象。
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
String strDate = "2021-11-25";
String strTime = "15:20";
String strDateTime = strDate + "T" + strTime;
LocalDateTime ldt = LocalDateTime.parse(strDateTime);
Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(instant);
}
}
输出:
2021-11-25T15:20:00Z
在线演示
一些替代方法:
- 可以像daniu建议的那样,单独解析日期和时间字符串,并使用它们创建
LocalDateTime
实例。
演示:
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
String strDate = "2021-11-25";
String strTime = "15:20";
LocalDateTime ldt = LocalDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime));
Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(instant);
}
}
在线演示
- 按照Ole V.V.的建议,使用
ZonedDateTime#of(LocalDate, LocalTime, ZoneId)
创建ZonedDateTime
实例。你也可以尝试使用ZonedDateTime#of(LocalDateTime, ZoneId)
这种方法的另一种变体。
演示:
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
String strDate = "2021-11-25";
String strTime = "15:20";
ZonedDateTime zdt = ZonedDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime),
ZoneId.systemDefault());
Instant instant = zdt.toInstant();
System.out.println(instant);
}
}
在线演示
- 将日期和时间字符串合并为 ISO 8601 格式的日期时间字符串,并使用
DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.systemDefault())
解析为 ZonedDateTime
。
演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String strDate = "2021-11-25";
String strTime = "15:20";
DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.systemDefault());
ZonedDateTime zdt = ZonedDateTime.parse(strDate + "T" + strTime, dtf);
Instant instant = zdt.toInstant();
System.out.println(instant);
}
}
在线演示
- 通过解析日期和时间字符串创建
LocalDateTime
实例,并使用LocalDateTime#toInstant
获取所需的Instant
。
演示:
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
String strDate = "2021-11-25";
String strTime = "15:20";
LocalDateTime ldt = LocalDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime));
Instant instant = ldt.toInstant(ZoneId.systemDefault().getRules().getOffset(ldt));
System.out.println(instant);
}
}
在线演示
从教程:日期时间了解更多关于现代日期时间API*的内容。查看这个答案和这个答案,学习如何在JDBC中使用java.time
API。
* 如果您正在开发 Android 项目,而您的 Android API 级别仍未符合 Java-8,请查看 通过去糖化可用的 Java 8+ APIs。请注意,Android 8.0 Oreo 已经提供了对java.time
的支持。
LocalDate
和LocalTime
更加清晰,然后再通过LocalDateTime.of()
组合它们。这样你就可以避免与中间字符串搭配使用。 - daniuZonedDateTime.of(LocalDate, LocalTime, ZoneId)
直接组合成一个ZonedDateTime
。 - Ole V.V.