3

下面的代码:

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    
4

3 回答 3

7

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

DF.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(DF.format(new Date(0))); // outputs: 1970-01-01T00:00Z
于 2013-06-04T14:51:01.817 回答
1

你必须.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)));
于 2013-06-04T14:51:35.457 回答
1

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

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


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-22T09:13:43.880 回答