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

使java日期独立于OS日期设置,java,windows,date,calendar,Java,Windows,Date,Calendar,我使用JavaSwing开发了一个桌面应用程序,需要一些功能,具体取决于日期 现在的问题是,如果我这样做: System.out.println(新日期()) 将于2015年11月3日星期二16:29:11打印此 现在,如果我在Windows日历中更改日期,此日期也将更改,并且我不需要新日期()来随操作系统日期更改而更改?我怎么做?硬件时钟 本地计算机中只有一个计时来源:内置在机箱中的硬件时钟,由主机操作系统(OS)管理 源当前时刻来自主机操作系统,因此来自硬件时钟。JVM维护自己的当前默认时区

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

现在的问题是,如果我这样做:
System.out.println(新日期())

将于2015年11月3日星期二16:29:11打印此

现在,如果我在Windows日历中更改日期,此日期也将更改,并且我不需要
新日期()
来随操作系统日期更改而更改?我怎么做?

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

源当前时刻来自主机操作系统,因此来自硬件时钟。JVM维护自己的当前默认时区,通过该时区可以解释/调整该时刻。但时间轴上的时间点是通过操作系统从硬件时钟报告的,Java只在对话的监听端

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

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

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

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


仅供参考,可怕的
日期
现在是遗留的,不能使用。替换为
Instant
。两者都代表UTC中的一个时刻(尽管
Date::toString
对您撒了谎)

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

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

请注意,我的应用程序将部署在本地计算机上,并且没有internet连接。如果您不信任更改后的系统时间,为什么在更改前信任它?操作系统只支持一个日期,Java本身显然无法向您提供日期。你需要决定你想要哪一个来源。没有n/w连接将很难实现
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;