Lef*_*eff 5 java kotlin zoneddatetime
我正在尝试从日期和时间字符串创建 Instant 的实例。日期的格式如下yyyy-MM-dd。所以这些值可能如下所示:
val date = "2021-11-25"
val time = "15:20"
Run Code Online (Sandbox Code Playgroud)
我试图从这两个字符串中创建一个有效的瞬间,如下所示:
val dateTime = "${date}T${time}:00"
val instantDateTime = ZonedDateTime.parse(dateTime,
DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(defaultTimeZone)
).toInstant()
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
val instantDateTime = Instant.from(DateTimeFormatter .ISO_OFFSET_DATE_TIME.withZone(defaultTimeZone).parse(dateTime))
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,我得到:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2021-11-25T15:20:00' could not be parsed at index 19
Run Code Online (Sandbox Code Playgroud)
您可以组合日期和时间字符串来创建 ISO 8601 格式的日期时间字符串,您可以解析该字符串LocalDateTime,然后Instant使用适用的ZoneId. 请注意,现代日期时间 API 基于ISO 8601DateTimeFormatter ,只要日期时间字符串符合 ISO 8601 标准,就不需要显式使用对象。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
2021-11-25T15:20:00Z
Run Code Online (Sandbox Code Playgroud)
LocalDateTime可以按照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);
}
}
Run Code Online (Sandbox Code Playgroud)
ZonedDateTime建议创建using实例。您可以尝试使用此方法的另一种变体是使用.ZonedDateTime#of(LocalDate, LocalTime, ZoneId)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());
// Alternatively
// ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime)),
// ZoneId.systemDefault());
Instant instant = zdt.toInstant();
System.out.println(instant);
}
}
Run Code Online (Sandbox Code Playgroud)
ZonedDateTime使用DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.systemDefault()).演示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
从Trail: Date Time了解有关现代日期时间 API *的更多信息。检查此答案和此答案以了解如何将API 与 JDBC 结合使用。java.time
* 如果您正在从事 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已提供对java.time.