0

如何在java中将字符串“2020-09-02T12:22:53.9”转换为日期格式2020-09-02T12:22:53.9?

String dateString = "2020-09-02T12:22:53.9";
String tz = "America/Mexico_City";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-mm hh:mm:ss.S");
ZoneId zoneId = ZoneId.of(tz);
Instant instant = Instant.parse(dateString);
ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(dateTimeInTz.format(dtf));

此代码在行中抛出一个java.time.format.DateTimeParseException: Text '2020-09-02T12:22:53.9' could not be parsed at index 21表单Instant instant = Instant.parse(dateString);

4

2 回答 2

2

你的格式不正确。您在该月使用mm, 而不是MM,。此外,您错过了格式中的文字T。请注意,您需要使用HH24 小时格式时间。

由于您的日期时间字符串没有时区信息,因此您必须将日期时间字符串解析为LocalDateTime,然后LocalDateTime#atZone将其转换为ZonedDateTime(如果需要ZonedDateTime),如下所示:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateString = "2020-09-02T12:22:53.9";

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:ss.S");

        String tz = "America/Mexico_City";
        ZoneId zoneId = ZoneId.of(tz);

        // Parse the given date-time string to LocalDateTime
        LocalDateTime ldt = LocalDateTime.parse(dateString, dtf);

        // Convert the LocalDateTime to ZonedDateTime
        ZonedDateTime dateTimeInTz = ldt.atZone(zoneId);

        // Display ZonedDateTime in its default format
        System.out.println(dateTimeInTz);

        // Display ZonedDateTime in your custom format
        System.out.println(dateTimeInTz.format(dtf));
    }
}

输出:

2020-02-09T12:22:53.900-06:00[America/Mexico_City]
2020-09-02T12:22:53.9

或者,您可以使用ZoneIdwithDateTimeFormatter本身,然后您可以将给定的日期时间字符串直接解析ZonedDateTime为如下所示:

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateString = "2020-09-02T12:22:53.9";

        String tz = "America/Mexico_City";
        ZoneId zoneId = ZoneId.of(tz);

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:ss.S").withZone(ZoneId.of(tz));

        // Parse the given date-time string into ZonedDateTime
        ZonedDateTime dateTimeInTz = ZonedDateTime.parse(dateString, dtf);

        // Display ZonedDateTime in its default format
        System.out.println(dateTimeInTz);

        // Display ZonedDateTime in your custom format
        System.out.println(dateTimeInTz.format(dtf));
    }
}

输出:

2020-02-09T12:22:53.900-06:00[America/Mexico_City]
2020-09-02T12:22:53.9
于 2020-09-24T20:11:29.723 回答
1

无需格式化程序

我认为您的日期字符串位于 America/Mexico_City 时区,并且您希望在同一时区输出,因此是相同的日期和时间。我进一步认为,在您的程序内部,您希望将时间点表示为Instant. Instant从您的日期字符串来回的完整圆圈可能会:

    String tz = "America/Mexico_City";
    ZoneId zoneId = ZoneId.of(tz);
    
    String dateString = "2020-09-02T12:22:53.9";
    
    Instant instant = LocalDateTime.parse(dateString).atZone(zoneId).toInstant();
    System.out.println(instant);
    
    ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
    System.out.println(dateTimeInTz.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

输出:

2020-09-02T17:22:53.900Z
2020-09-02T12:22:53.9

您的输入和相同的输出采用 ISO 8601 格式。LocalDateTime解析 ISO 8601 格式,没有时区或偏移量作为默认值,即没有任何显式格式化程序。为了以相同格式打印ZonedDateTime背面,我们使用内置的DateTimeFormatter.ISO_LOCAL_DATE_TIME. 您现在可能已经意识到,无需指定我们自己的格式模式字符串是一种极大的解脱。

你的代码出了什么问题?

Arvind Kumar Avinash 已经报告了您的格式模式字符串中的错误。更根本的是,您无法将字符串解析为Instant,或者更准确地说,它需要更多的东西来做到这一点。原因是 Java 和Instant该类不知道也无法猜测您打算使用哪个时区。您的日期字符串包含没有任何时区的日期和时间。AnInstant是一个时间点,在概念上没有任何日期或时间。您的字符串可以代表不同时区的不同时间点,因此只有指定时区才能确定时间点。

该类可以解析的是 UTC 中的日期和Instant时间由. 这种字符串的一个例子是在上面的输出中,. 由于您的字符串不是UTC(因此没有得到),因此这种观察对您的情况没有帮助。ZInstant2020-09-02T17:22:53.900ZZ

关联

于 2020-09-25T00:16:29.787 回答