总是System.currentTimeMillis
返回一个固定长度的值。在我的 Windows Core2 中,它返回一个 13 位长的值。
从它的API:
以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。
总是System.currentTimeMillis
返回一个固定长度的值。在我的 Windows Core2 中,它返回一个 13 位长的值。
从它的API:
以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。
System.currentTimeMillis()
返回自纪元以来的毫秒数,即自 1970 年 1 月 1 日 UTC 午夜以来。
您可以检查自纪元以来的毫秒数首次为 13 位十进制数字。这发生在
2001 年 9 月 9 日 01:46:40.000 UTC(自纪元以来 1'000'000'000'000 毫秒)
您还可以检查自纪元以来的毫秒数最后一次是 13 位十进制数字。这将发生在
2286 年 11 月 20 日 17:46:39.999 UTC(自纪元以来 9'999'999'999'999 毫秒)
因此,在这两个日期之间,假设机器正确设置了当前时间,该函数将始终返回 13 位十进制数字值。
因此,假设在接下来的两个世纪中返回值是 13 位十进制数字,您是安全的。
它返回一个 63 位二进制数(它实际上是一个 64 位有符号数,始终为正数,因此从不设置最高位)。许多前导数字将为零。将其转换为十进制时,通常会丢弃任何前导零。因此,小数位数会有所不同。
投票最多的答案(即从 2001-09-09T01:46:40 UTC 到 2286-11-20T17:46:39.999 UTC 的任何日期的纪元毫秒数将有 13 位数字)是准确的。对于任何有兴趣了解如何得出这些数字的人来说,这是对该答案的补充。
通常,我首先使用现代日期时间 API 编写解决方案,但在这种情况下,我将反转模式java.time
,因为现代日期时间 API 于 2014 年 3 月发布(在投票最多的答案发布 2 年后)。
使用旧的日期时间 API:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
System.out.println(sdf.format(new Date(1000000000000L))); // 2001-09-09T01:46:40.000Z
System.out.println(sdf.format(new Date(9999999999999L))); // 2286-11-20T17:46:39.999Z
}
}
使用java.time
现代日期时间 API:
import java.time.Instant;
public class Main {
public static void main(String[] args) {
System.out.println(Instant.ofEpochMilli(1000000000000L)); // 2001-09-09T01:46:40Z
System.out.println(Instant.ofEpochMilli(9999999999999L)); // 2286-11-20T17:46:39.999Z
}
}
Z
输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC
时区(时区偏移量为+00:00
小时)。
从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 desugaring和How to use ThreeTenABP in Android Project。