我想要使用date对象的今天的日期,所以我在Date()
构造函数中传递了System.currentTimeInMillis
,但它将年份返回为121
然后我使用了Calendar
类,它解决了我的问题,但为什么Date()
类一开始就不起作用呢?
tl;dr
仅使用java.time类。切勿使用传统的Date
/Calendar
类。
java.time.LocalDate.now()
避免使用传统日期时间类
您使用的是与最早版本的Java捆绑在一起的糟糕的日期-时间类。这些课程是由不了解日期时间处理的人编写的,他们的设计选择非常糟糕。
几年前,随着JSR310的一致采用,Sun、Oracle和JCP社区放弃了这些类。我建议你也放弃它们。对于您的日期时间工作,请仅使用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 ) ;
如果您想要在特定时区看到当前时刻,请使用ZonedDateTime
。
ZonedDateTime now = ZonedDateTime.now( z ) ;
如果您希望当前时刻以UTC显示,请使用Instant
。
Instant now = Instant.now() ;
关于java.time
java.time框架构建在Java8及更高版本中。这些类取代了诸如java.util.Date
、Calendar
和&SimpleDateFormat
。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。
现在处于维护模式的JodaTime项目建议迁移到java.Time类。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*
类。休眠5&JPA 2.2支持java.time.
从哪里获得java.time类?
- Java SE 8、Java SE 9和Java SE 10,爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
- Java9带来了一些小功能和修复
- Java SE 6和Java SE 7
- 大多数Java.time功能都是向后移植到Java 6&7英寸ThreeTen背包
- Android
- java.time类的更高版本的Android(26+(捆绑实现
- 对于早期的Android(<26(,neneneba API去马赛克的过程带来了java.time功能的一个子集,该功能最初未内置于Android中。
- 如果降级不能满足您的需求,ThreeTenABP项目会将ThreeTen Backport(如上所述(适配到Android。请参阅如何使用ThreeTenABP…