如果做一个新的日期(0L),时代不是时代.为什么?

Ant*_*val 4 java date epoch

我的问题很简单:

如果我这样做:

public class Main {

public static void main(String[] args) throws Exception {
        Date d = new Date(0L );
        System.out.println(d);
}

}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:Thu Jan 01 01:00:00 CET 1970

根据文件,我期待:1970年1月1日00:00:00 CET 1970年

我想错了......

编辑:的确,我读得太快了.我应该在1970年1月1日00:00:00 GMT

那么,我如何强制使用GMT,并忽略所有当地时间?

编辑,解决方案:

public static void main(String[] args) throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("H:m:s:S");
SimpleTimeZone tz = new SimpleTimeZone(0,"ID");
sdf.setTimeZone(tz) ;
Date d = new Date(0L );
System.out.println( sdf.format(d));
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ols 6

大纪元定义为00:00:00 1970-1-1上UTC.由于CET 是UTC + 1,它等于你的时间凌晨1点.

如果你看一下Date(long)构造函数,你会发现它希望这个值是自纪元UTC以来的毫秒数:

分配Date对象并将其初始化以表示自标准基准时间(称为"epoch")以来的指定毫秒数,即1970年1月1日00:00:00 GMT.

关于你强迫GMT而不是当地时区的愿望:简而言之,Date实例总是使用GMT.如果你只想格式化输出String,那么它使用GMT就有一个DateFormat类,特别是它的setTimeZone()方法.

  • 日期始终存储为与GMT时期的偏移量.默认的toString()格式考虑了您的本地时区,但这仅用于演示.在内部,它只是与时代的偏移. (4认同)