java.time
该java.util.Date
对象不是像现代日期时间类型那样的真实日期时间对象;相反,它表示自称为“纪元” January 1, 1970, 00:00:00 GMT
(或 UTC)的标准基准时间以来的毫秒数。当您打印 的对象时java.util.Date
,其toString
方法会返回 JVM 时区中的日期时间,根据此毫秒值计算得出。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat
并从中获取格式化字符串。
请注意,旧的日期时间 API(java.util
日期时间类型及其格式化 API SimpleDateFormat
)已过时且容易出错。建议完全停止使用它并切换到java.time
现代日期时间 API *。
java.time
使用现代日期时间 API 的演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String args[]) {
Instant instant = Instant.ofEpochMilli(0);
System.out.println(instant);
// If you need the corresponding date-time representing your timezone
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.of("America/New_York"));
System.out.println(zdt);
}
}
输出:
1970-01-01T00:00:00Z
1969-12-31T19:00-05:00[America/New_York]
AnInstant
代表时间线上的一个瞬时点。输出中的Z
代表 Zulu,它代表 UTC(时区偏移量+00:00
)。
从Trail: Date Time了解有关现代日期时间 API *的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。