Java 日期(System.currentTimeInMillis)不工作

Java 日期(System.currentTimeInMillis)不工作,java,date,java-calendar,Java,Date,Java Calendar,我希望使用date对象获得今天的日期,因此我在date()构造函数中传递了System.currentTimeInMillis,但它将年份返回为121 然后我使用了Calendarclass,它解决了我的问题,但是为什么Date()class一开始不起作用呢?tl;博士 仅使用java.time类。切勿使用传统的日期/日历类 java.time.LocalDate.now() 避免遗留日期时间类 您使用的是与最早版本的Java捆绑在一起的糟糕的日期时间类。这些课程是由不了解日期时间处理的人编写

我希望使用date对象获得今天的日期,因此我在
date()
构造函数中传递了
System.currentTimeInMillis
,但它将年份返回为121

然后我使用了
Calendar
class,它解决了我的问题,但是为什么
Date()
class一开始不起作用呢?

tl;博士 仅使用java.time类。切勿使用传统的
日期
/
日历

java.time.LocalDate.now()
避免遗留日期时间类 您使用的是与最早版本的Java捆绑在一起的糟糕的日期时间类。这些课程是由不了解日期时间处理的人编写的,他们的设计选择非常糟糕

Sun、Oracle和JCP社区在几年前一致采用JSR310后放弃了这些类。我建议你也放弃它们。对于日期时间工作,只使用java.time类

121 + 1900 = 2021 ➥ 回答您的具体问题:在这些遗留类的许多问题中,一年被表示为1900年结束。引用Javadoc:

年份y由整数y-1900表示

因此,在2021年的121年业绩基础上再加上1900年。谜团解开了。但没关系,只需继续使用java.time即可

java.time 如果只需要日期,而不需要一天中的时间和时区,请使用
LocalDate

LocalDate today = LocalDate.now() ;
最好指定一个期望/预期的时区来感知当前日期,而不是隐式地依赖JVM的当前默认时区。在任何一个特定的时刻,世界各地的日期都因时区而异,日本东京的“明天”,而美国俄亥俄州托莱多的“昨天”

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
如果希望当前时刻显示在特定时区中,请使用
zoneDateTime

ZonedDateTime now = ZonedDateTime.now( z ) ;
如果希望当前时刻以UTC显示,请使用
Instant

Instant now = Instant.now() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • 带来了一些小功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • Android(26+)的更高版本捆绑了java.time类的实现

    • 对于早期的Android(
      2021-1900=121
      你为什么不首先阅读Javadocs?这个日期表示的年份,减去1900。
      new date()
      使用
      System.currentTimeMillis()
      为你提供当前时间。你为什么不切换到已经非常旧的“new”呢java.time API?java.util.Date和相关类(如Calendar)已被取代多年。我建议您不要使用
      Date
      。该类设计拙劣且早已过时。请使用
      LocalDate
      或适当的类。即使您坚持使用
      Date
      ,也要远离它的
      getYear
      method。这个方法和大多数其他方法已经被弃用了24年,因为它们跨时区工作不可靠。