new java.sql.Date(0)不对应1970年1月1日00:00:00



以下代码:

import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class FooMain {
    private static final DateFormat DF = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
    public static void main(String args[]) {
        System.out.println(DF.format(new Date(0)));
    }
}

打印出:

1970-01-01T01:00Z

不应该改成1970-01-01T00:00Z吗?我知道Unix纪元时间总是明确的,我们不必担心时区,但这里是我的时区,以防它很重要:

$ cat /etc/timezone 
Europe/Madrid    

new Date(0) 是否对应January 1, 1970, 00:00:00 GMT。问题是,默认情况下,DateFormat将在您的系统时区中打印日期。将格式化程序上的时区设置为GMT:

DF.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(DF.format(new Date(0))); // outputs: 1970-01-01T00:00Z

你必须.setTimeZone()你的SimpleDateFormat;缺省情况下,时区为系统时区:

final SimpleDateFormat fmt 
    = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(fmt.format(new Date(0)));

java.time

遗留的日期时间API (java.util日期时间类型及其格式化类型,SimpleDateFormat等)已经过时并且容易出错。建议完全停止使用它,并切换到java.time,现代日期时间API*

解决方案使用java.time,现代API:

import java.time.Instant;
public class Main {
    public static void main(String[] args) {
        // Recommended
        Instant epoch = Instant.EPOCH;
        System.out.println(epoch);
        // Alternatively,
        epoch = Instant.ofEpochMilli(0);
        System.out.println(epoch);
    }
}
输出:

1970-01-01T00:00:00Z
1970-01-01T00:00:00Z

了解java.time的更多信息,现代日期时间API*Trail: Date Time.


*出于任何原因,如果你必须坚持Java 6或Java 7,你可以使用ThreeTen-Backport,它支持大部分 Java。time功能到Java 6 &7. 如果你正在为一个Android项目工作,你的Android API级别仍然不符合Java-8,检查Java 8+可用的API,通过desugaring和如何在Android项目中使用ThreeTenABP。

相关内容

  • 没有找到相关文章

最新更新