Kotlin/java - 如何将日期时间字符串转换为即时?

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)

Arv*_*ash 8

您可以组合日期和时间字符串来创建 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)

ONLINE DEMO

一些替代方法:

  1. 创建实例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)

ONLINE DEMO

  1. 按照Ole VV 的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)

ONLINE DEMO

  1. 组合日期和时间字符串以创建 ISO 8601 格式的日期时间字符串,并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)

ONLINE DEMO

  1. 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)

ONLINE DEMO

Trail: Date Time了解有关现代日期时间 API *的更多信息。检查此答案此答案以了解如何将API 与 JDBC 结合使用。java.time


* 如果您正在从事 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已提供java.time.