日期(System.currentTimeInMillis)不工作



我想要使用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.DateCalendar和&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 8Java SE 9Java SE 10爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9带来了一些小功能和修复
  • Java SE 6Java 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…

相关内容

  • 没有找到相关文章

最新更新