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