时间末尾多了.000Z?

在这里插入图片描述
最近群里有小伙伴问到这个问题,这边正好遇到过,记录一下。

这里最后边的“Z”是协调世界时中0时区的标志。协调世界时,即UTC,又称世界统一时间、世界标准时间、国际协调时间。
如果时间是以协调世界时(UTC)表示,则在时间后面直接加上一个“Z”。因此,“09:30 UTC”就写作“09:30Z”或是“0930Z”

而我们所在地方(中国大陆)使用的是东八区的时间,比0时区早了8小时。

下面介绍几种处理这种带时区的字符串变成我们熟悉的:

public class DateTimeTest {
    public static void main(String[] args) throws ParseException {
        final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 设定一个0时区2月9号16点的时间字符串
        String date = "2020-03-09T16:00:00.19Z";
        // 第一种方法
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
        Date d = format.parse(date.replace("Z", " UTC"));
        System.out.println(df.format(d)); // 2020-03-10 00:00:00

        // 第二种方法,直接用Java8的Instant
        Instant instant = Instant.parse(date);
        // System.out.println(LocalDateTime.ofInstant(instant, ZoneId.systemDefault()));
        long time = instant.toEpochMilli();
        Date dateTime = new Date(time);
        System.out.println(df.format(dateTime)); // 2020-03-10 00:00:00

        // 第三种,其实这种和第一种差不多
        SimpleDateFormat fmt = new SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(fmt.parse(date));

        // 第三种,使用joda time
        Date jtd = ISODateTimeFormat.dateTime().parseDateTime(date).toDate();
        System.out.println(jtd);
    }
}

Output:

2020-03-10 00:00:00
2020-03-10 00:00:00
Tue Mar 10 00:00:00 CST 2020
Tue Mar 10 00:00:00 CST 2020

我们看到0时区9号16点的已经变成我们我们熟悉的东八区时间了。

发布了60 篇原创文章 · 获赞 176 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/E09620126/article/details/104775781