23

总是System.currentTimeMillis返回一个固定长度的值。在我的 Windows Core2 中,它返回一个 13 位长的值。

从它的API:

以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

4

3 回答 3

50

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 位十进制数字,您是安全的。

于 2012-02-05T12:37:36.390 回答
2

它返回一个 63 位二进制数(它实际上是一个 64 位有符号数,始终为正数,因此从不设置最高位)。许多前导数字将为零。将其转换为十进制时,通常会丢弃任何前导零。因此,小数位数会有所不同。

于 2012-02-05T12:35:07.813 回答
0

投票最多的答案(即从 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 desugaringHow to use ThreeTenABP in Android Project

于 2021-05-22T16:32:35.013 回答