在使用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));
    }
}程序输出时间

当前北京时间
 

2、问题原因
我们可以输出以下sdf当前实用的时区是哪个。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.getTimeZone());
可以看到,程序当前,默认使用的时区的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));
    }
}
 
 
                     
            
        













 
                    

 
                 
                    