在使用SimpleDateFormat 对日期进行格式化的时候,输出结果比预期结果晚了8个小时。

目录

1、问题代码

2、问题原因

3、UTC与GMT的区别 

4、修正代码


1、问题代码

当然,根据不同的JDK版本或者系统环境不同,输出结果可能不同。

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

public class Main {

    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(date));
    }
}

程序输出时间

JAVA将当前日期格式化为字符串晚了8个小时_java

当前北京时间 

 

JAVA将当前日期格式化为字符串晚了8个小时_java_02

 2、问题原因

我们可以输出以下sdf当前实用的时区是哪个。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.getTimeZone());

JAVA将当前日期格式化为字符串晚了8个小时_jvm_03

 可以看到,程序当前,默认使用的时区的Etc/UTC。

3、UTC与GMT的区别 

GMT

从19 世纪中叶起,世界上以英国皇家格林尼治天文台公布的时间为标准时间,即“格林尼治标准时间(Greenwich Mean Time)”,简称GMT。

UTC

世界标准时间(Coordinated Universal Time),又称世界统一时间、国际协调时间、协调世界时,简称UTC,由原子钟提供,非常精确。

GMT与UTC存在秒差。因此,从1972 年1 月1日起,世界各国改以UTC为世界标准时间。现在人们通常所说的北京时间,表示为GMT+8,即北京时间比世界标准时间快8小时,也即时差为8小时。

4、修正代码

我们可以给SimpleDateFormat指定一个时区为GMT+8即可输出当前正确的日期时间。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Main {

    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        System.out.println(sdf.format(date));
    }
}

JAVA将当前日期格式化为字符串晚了8个小时_java_04