我想知道java.util.Date
和java.time.LocalDate
之间的区别。
我听说java.time.LocalDate
带来了用户环境时间,而不是服务器时间,但我想知道这是否属实。
换句话说,如果用户操纵他或她的系统时间,我想知道它是否算作更改时间,而不是服务器时间。
避免java.util.Date
主要区别在于:对于新代码,您应该使用LocalDate
来表示日历日期,而不是java.util.Date
。Date
设计不佳且早已过时,但绝对没有理由想要使用它。
用户环境时间与服务器时间
LocalDate
为您提供了设置的日期(而将Date
设置为特定日期并非易事,但也有可能(。尝试将LocalDate
(或Date
(设置为"今天"或"现在"取决于以下几件事:
- 您从中获取时间的时钟,同样取决于您的设置/体系结构
- 时区
Localdate.now(desriedTimeZone)
和new Date()
都将从运行它们的计算机上获取时间。因此,如果您在用户的计算机上运行了一个 Java 客户端,并且用户篡改了该计算机上的时钟,它们都可能给您一个错误的时间。
另一方面,如果客户端已连接到您控制的服务器,则从该服务器获取当前日期和时间应该不难(除了产生的延迟,可能远小于一秒(。
java.util.Date 自 JDK1.0 起在 Core java API 中,但 java.time.LocalDate 是在 Java 1.8 版本的 Java API 中引入的。
LocalDate 表示 ISO 格式 (yyyy-MM-dd( 中没有时间的日期。它可用于存储生日和发薪日等日期。
实际上,Java 1.8 中引入了这个新的 Time-Date 来提供不变性和线程安全性。并提供各种支持最常见操作的实用方法。
您可以参考以下内容以获取更多详细信息:
Java 中两个日期之间的差异
使用 Java 8 日期时间
关于java.util.Date
和java.time.LocalDate
之间差异的一般问题,我建议您花时间阅读相应的javadoc,或有关过渡到Java 8time
API的文章。 有很多差异:太多了,无法一一列举。
(一般建议不要在新代码中使用java.util.Date
:将其视为遗留类。
关于我认为您正在询问有关"操纵"时钟的具体问题,java.util.Date
和java.time.LocalDate
都从用户机器上的系统时钟中获取时间信息。 因此,如果用户一直在"操纵"系统时钟来报告虚假的时间信息,那么这两个类都将报告该虚假信息。
更一般地说,如果用户操纵了时钟,Java SE 类库中没有类会报告值得信任的信息。 (即使有这样的类,用户也可以修改相关的Java库来规避它。 如果你把智能放到你的代码中,用户也可以规避这一点。
请注意,这不是特定于 Java 的问题。 在由不可信用户控制的机器上运行的任何应用程序都可能受到干扰......无论编程语言如何。 如果您向用户提供软件以在他们的机器上运行,那么您就放弃了对他们可以使用它做什么的控制权。 (如果他们足够努力的话。
最后,如果您尝试解决的问题是用户的本地时钟与互联网时间源不同步,那么对于应用程序来说,这并不是真正的问题。 用户(或其系统人员(应该解决这个问题。