【问题标题】:Make the java date independent of OS Date settings使 java 日期独立于操作系统日期设置
【发布时间】:2015-11-03 14:30:47
【问题描述】:

我使用 Java Swing 开发了一个桌面应用程序,需要一些功能,具体取决于日期。

现在的问题是,如果我这样做: System.out.println(new Date());

将打印此Tue Nov 03 16:29:11 EET 2015

现在,如果我更改 Windows 日历中的日期,此日期也会更改,并且我不需要 new Date() 来更改操作系统日期更改?我该怎么做?

【问题讨论】:

  • 拜托我的应用程序将部署在本地机器上并且没有互联网连接
  • 如果更改后不信任系统时间,为什么还要信任更改前的时间?
  • OS 只支持一个日期,Java 本身显然无法为您提供日期。你需要决定你想要哪个来源。
  • 如果没有 n/w 连接将很难实现

标签: java windows date calendar


【解决方案1】:

硬件时钟

在您的本地计算机中只有一个计时来源:内置在盒子中的硬件时钟,由主机操作系统 (OS) 管理。

JVM 从主机操作系统获取当前时刻,因此从硬件时钟获取。 JVM 维护自己的当前默认时区,通过它解释/调整那个时刻。但是,时间轴上的点是通过操作系统从您的硬件时钟报告的,Java 仅在该对话的收听端。

所以,是的,如果具有管理员权限的用户错误地更改了主机硬件时钟的设置,那么是的,Java 将报告错误的日期时间。

如果您的问题是,“如何在不信任本地计算机的情况下从本地计算机获取 Java 的当前时刻?”,这在逻辑上是不可能的。

如果准确确定当前时刻对您的应用至关重要,并且您不信任托管 JVM 的机器上的时钟,那么您将需要外部时间来源。

  • 通常这意味着通过互联网查询时间服务器。但是您说您的JVM 无法访问Internet。
  • 另一种方法是联系本地网络上的时间服务器。当然,这意味着信任该时间服务器的系统管理员会保持正确设置。请注意,传统的计算机时钟通常不可靠,每月漂移几秒钟或更糟。因此本地时间服务器必须与可靠的时间源保持同步。
  • 另一种选择是访问另一个主机外部的硬件时钟。例如,hereherehere 所讨论的 radio clockGPS/Galileo/GLONASS 卫星设备。


仅供参考,可怕的Date 现在是遗留的,不能使用。替换为Instant。两者都代表 UTC 的一个时刻(尽管 Date::toString 告诉你的谎言)。

Instant instant = Instant.now() ;  // Capture the current moment in UTC as determined by your host OS & host hardware.

要通过特定地区的人们使用的挂钟时间查看那个时刻,请应用时区 (ZoneId) 以获取 ZonedDateTime 对象。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多