Java 系统长度.currentTimeMillis

Java 系统长度.currentTimeMillis,java,time,timer,epoch,milliseconds,Java,Time,Timer,Epoch,Milliseconds,是否System.currentTimeMillis始终返回固定长度的值。在我的windows Core2中,它返回一个13位长的值 从其API: 以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位为毫秒,但值的粒度取决于底层操作系统,可能更大。例如,许多操作系统以几十毫秒为单位测量时间 它返回一个63位的二进制数(它实际上是一个64位的有符号数,总是正数,所以不会设置最高位)。许多前导数字将为零。将其转换为十进制时,通常会丢弃任何前导零。因此,小数位数会有所不同。System.curren

是否
System.currentTimeMillis
始终返回固定长度的值。在我的windows Core2中,它返回一个13位长的值

从其API:

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


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

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毫秒)

因此,在这两个日期之间,如果机器正确设置了当前时间,函数将始终返回13位十进制数字值

因此,假设在未来两个多世纪内,返回值为13位十进制数字,您是安全的。

准确地说(即,从2001-09-09T01:46:40 UTC到2286-11-20T17:46:39.999 UTC的任何日期的历元毫秒将有13位)。对于任何有兴趣知道如何得出这些数字的人来说,这是对答案的补充

通常,我会首先使用现代日期时间API编写解决方案,但在这种情况下,我会扭转这种模式,因为现代日期时间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
    }
}
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
    }
}
使用
java.time
,现代日期时间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
    }
}
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
小时)

了解更多关于
java.time
、来自的*


*无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用哪个backport将大部分Java.time功能移植到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

问它将包含多少个数字,我觉得这是一个有严重缺陷的问题。该值以自纪元以来的毫秒为单位。您可以计算出数字的数量作为当前时间的函数,但为什么?!将您的时间设置为1970,它会短得多。
System.currentTimeMillis()
返回一个Java
长的
。它的长度始终正好是64位,并且通常会有许多前导零。它是经过签名的,因此1970年之前的日期可以被storedIt签名,因为Java中的长是经过签名的。但是如果设计人员可以在签名和未签名之间进行选择,则签名将是一个很好的选择,因为恰好是t原因是这样的。是的,这是真的。我实际上是在评论帖子的
…部分,它总是积极的,注意到事实并非如此,从
系统返回的数字。currentTimeMillis()
总是积极的,因为在1970年(或者,实际上是1996年)之前不可能调用它。除非你有一台时间机器,或者对你的系统时钟做一些愚蠢的事情。但是,是的,更一般地说,你是对的,时间可以是负数。我想知道有多少开发人员编写了代码来处理14位以上的纪元。@ryanbwork用于精确地以毫秒为单位存储纪元。@ryanbwork我见过很多使用System.currentTimeMillis()
通过我的载体,我记不起对结果的十进制表示中的位数有任何限制(并不是说我不明白你的观点)。