使java日期独立于OS日期设置

时间:2015-11-03 14:30:47

标签: java windows date calendar

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

现在问题是如果我这样做: C2

将打印此public T GetClassInstance<T>(DateTime start) where T : IHasStartTime, new()

现在,如果我在Windows日历中更改日期,这个日期也会发生变化,我不需要System.out.println(new Date());更改操作系统日期更改吗?我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

硬件时钟

本地计算机中只有一种计时源:内置于主机中的硬件时钟,由主机操作系统(OS)管理。

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

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

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

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

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

photo of a couple of external radio clock devices


仅供参考,可怕的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 ) ;