以下代码:
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。