-1
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
String dateStr = "2017-03-09T18:30:00.000Z";
Date date = formatter.parse(dateStr);
System.out.println("here");
System.out.println(date);  
4

1 回答 1

1

谢谢我知道问题是缺少'Z'。Z 应该用单引号作为 T

不!不!不!

'Z'在模式中使用会将 makeZ视为字符文字而不是其预期含义。Z日期时间字符串中的2017-03-09T18:30:00.000Z是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC时区(时区偏移量为+00:00小时)。

此外,现代日期时间 API * 基于ISO 8601DateTimeFormatter ,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用对象。

演示:

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.parse("2017-03-09T18:30:00.000Z");
        System.out.println(instant);
    }
}

输出:

2017-03-09T18:30:00Z

出于任何原因,如果您需要将此对象转换Instant为 的对象java.util.Date,您可以执行以下操作:

Date date = Date.from(instant);

从Trail: Date Time了解有关现代日期时间 API 的更多信息。

使用旧版 API:

旧的日期时间 API(java.util日期时间类型及其格式类型SimpleDateFormat)已过时且容易出错。建议完全停止使用它并切换到java.time现代日期时间 API。只是为了完整起见,我在下面使用旧的日期时间 API 编写了一个解决方案。

用于X处理Z您的日期时间字符串。查看文档页面以了解有关符号的更多信息。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX", Locale.ENGLISH);
        Date date = sdf.parse("2017-03-09T18:30:00.000Z");
        System.out.println(date);// Note: will display date-time in your local timezone
    }
}

在我的时区输出:

Thu Mar 09 18:30:00 GMT 2017

请注意,该java.util.Date对象不是像现代日期时间类型那样的真实日期时间对象;相反,它表示自称为“纪元” January 1, 1970, 00:00:00 GMT(或 UTC)的标准基准时间以来的毫秒数。当您打印 的对象时java.util.Date,其toString方法会返回 JVM 时区中的日期时间,根据此毫秒值计算得出。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat并从中获取格式化的字符串,例如

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf.format(date));

* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-11T19:50:13.547 回答