Java System.currentTimeMillis()返回的值是否受日光节约和闰秒调整的影响?

Java System.currentTimeMillis()返回的值是否受日光节约和闰秒调整的影响?,java,datetime,time,dst,Java,Datetime,Time,Dst,我知道System.currentTimeMillis()给出了从历元开始的毫秒时间,它对系统的挂钟时间很敏感。我还知道,在测量时间的程序中,不建议使用System.currentTimeMillis()来计算经过的时间。 Java库为此提供了System.nanoTime() 我有两个关于系统的具体问题。currentTimeMillis(): 它会受到闰秒调整的影响吗?我认为答案是肯定的,因为系统的挂钟时间将因闰秒而调整 DST(夏令时)打开/关闭时是否会受到影响?当时间从23:59突然变为

我知道
System.currentTimeMillis()
给出了从历元开始的毫秒时间,它对系统的挂钟时间很敏感。我还知道,在测量时间的程序中,不建议使用
System.currentTimeMillis()
来计算经过的时间。 Java库为此提供了
System.nanoTime()

我有两个关于
系统的具体问题。currentTimeMillis()

  • 它会受到闰秒调整的影响吗?我认为答案是肯定的,因为系统的挂钟时间将因闰秒而调整
  • DST(夏令时)打开/关闭时是否会受到影响?当时间从23:59突然变为2:00时会发生什么?由于系统时钟实际上发生了变化,我认为答案再次是肯定的,但我想与社区核实一下

  • System.currentTimeMillis()
    返回的值是自历元以来经过的毫秒数。这个毫秒数就是:一个毫秒数


    假设在某一天,由于DST的原因,贵国决定立即从1:00改为2:00。这是否意味着1:00到2:00之间已经过去了1小时?没有。已经过了0毫秒。您的国家只确定毫秒值X表示为1:00,毫秒值X+1表示为2:00。时间的表示形式不会改变毫秒数。

    对你的两个问题的明确回答是:不,不

    作为对@ok about dst effects答案的补充,
    System.currentTimeMillis()
    不计算闰秒。在理论和实践上,这取决于操作系统。由于包含的大多数操作系统和Java虚拟机都遵循POSIX标准,因此(还存在互操作性和行为兼容性问题),闰秒甚至不允许对
    System.currentTimeMillis()
    产生任何影响

    您还可以通过比较
    System.currentTimeMillis()
    (除以1000)的值与您自己计算的1972-01-01T00:00:00以来经过的SI秒数来轻松验证这一点。现在差值必须为25秒

    以下讨论的更新:

    从长远来看(不计算),闰秒对
    系统.currentTimeMillis()没有影响,但短期内可能会有影响。我认为这是不相关的,因为这个时间源不是为了实现高精度和时间稳定性而设计的。
    
    此时间源的输出甚至会发生长达分钟的突然变化(例如,如果电脑长时间处于脱机状态)。如果人们要使用这个时间源并在闰秒内遇到困难问题,那么几乎可以肯定的是,在这个时间源与外部时间源(如NTP服务器)的任何重新同步过程中,他们也会遇到(更困难的)问题。

    系统时钟不一定在DST改变时改变。类Unix系统通常将其保持在UTC。@kiheru,以便系统托盘在DST触发后不会显示调整后的时间?用户可见时间会更改,但硬件时钟时间不会更改
    currentTimeMillis()
    on例如在使用上。这是自大纪元以来的时间,与时区无关。我不知道windows。有一件事可以以令人惊讶的方式改变返回的时间,那就是NTP守护进程(或手动)进行的时间调整。因此,两次后续的
    currentTimeMillis()
    调用的时差可能为负。除非对
    currentTimeMillis()
    使用TAI(或类似的时间刻度),否则它不是实际经过的SI毫秒数(不太可能)。要获得实际经过的毫秒数,需要添加事件之间的闰秒数差。如果您试图找出
    2012-06-30T23:59:59Z
    2012-07-01T00:00:00Z
    currentTimeMillis()
    返回
    1000
    ,但实际数字是
    2000
    @J.F.Sebastian,这是一个很好的评论,但我会小心使用TAI这个术语,它在1970年后以这种确切的形式出现——另见。这是基于史蒂夫·艾伦的研究工作。JB Nizet没有提到SI秒,只是“毫秒”;-)由于某些系统上存在闰秒,普通Unix时间戳可能会重复。你是说
    currentTimeMillis()
    是不同的(以避免任何影响)?@J.F.Sebastian根据我自己的经验
    currentTimeMillis()
    不会在闰秒内自动重复这些时间戳(导致短时间内出现不同的长值),但操作系统内核会将计时器设置回任意时间(非常)很快。因此,从长远来看,该方法不计算闰秒数,而且由于与其他类似系统的互操作性,因此不能计算闰秒数。旁注:NTP服务器在闰秒内重复时间戳-根据我在2012年7月1日的观察。您描述的是配置为NTP客户端的Windows行为。顺便说一句,您对闰秒数的计算d秒必须包括TAI时间(或等效时间)——此时比UTC早35秒。@J.F.Sebastian同意,UTC标度是1972年在无线电信号中引入的,因此我使用了两年前的近似值。让我们计算1972-01-01以来的SI秒,您将看到
    System.currentTimeMillis()
    不计算闰秒。非常直接和清晰。“有任何效果”和“不计算”不等效。闰秒前后和闰秒期间,时间戳可能会受到影响,具体取决于系统时钟如何考虑闰秒。