java中date代替_Java:为什么Date构造函数不推荐,我用什么来代替?

本文探讨了Java中日期时间处理的最佳实践,建议避免使用过时的java.util.Date和java.util.Calendar类,转而采用Joda-Time库或Java 8中引入的新java.time包。通过示例代码展示了如何使用这些现代API来处理不同时区下的日期和时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当Java第一次启动和发展时, java.util.Date , java.util.Calendar和java.text.SimpleDateFormat类被冲得太快了。 这些课程没有很好的devise或实施。 试图改进,因此你已经发现的弃用。 不幸的是,改进的尝试很大程度上失败 你应该完全避免这些类 。 它们在Java 8中被新类所取代。

在你的代码中的问题

java.util.Date具有date和时间部分。 您忽略了代码中的时间部分。 因此,Date类将按照JVM的默认时区定义的那一天开始,并将该时间应用于Date对象。 所以你的代码的结果将取决于它运行的是哪台机器或者哪个时区被设置。 可能不是你想要的。

如果您只想要date,而不需要时间部分,例如出生date,则可能不想使用Date对象。 您可能只想以YYYY-MM-DD ISO 8601格式存储date的string。 或者使用Joda-Time中的LocalDate对象(见下文)。

乔达时间

在Java中学习的第一件事: 避免与Java捆绑在一起的臭名昭着的java.util.Date&java.util.Calendar类 。

正如在user3277382的答案中正确指出的那样 ,在Java 8中使用Joda-Time或新的java.time。*包 。

Joda-Time中的示例代码2.3

DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" ); DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway ); DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" ); DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork ); DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC ); LocalDate birthDate = new LocalDate( 1985, 1, 1 );

转储到控制台…

System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway ); System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork ); System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt ); System.out.println( "birthDate: " + birthDate );

当运行…

birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00 birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00 birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z birthDate: 1985-01-01

java.time

在这种情况下, java.time的代码与Joda-Time的代码几乎相同。

我们得到一个时区( ZoneId ),并构造一个分配给该时区的date – 时间对象( ZonedDateTime )。 然后,使用不可变对象模式,我们基于旧对象的同一时刻(自时代以来的纳秒数)创build新的date时间,但分配了其他时区。 最后我们得到一个没有时间和时区的LocalDate ,但是在确定这个date的时候会注意到这个时区的适用情况(比如在奥斯陆的一个新的一天比在纽约早)。

ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" ); ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway ); ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" ); ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork ); ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar. Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC. LocalDate localDate_Norway = zdt_Norway.toLocalDate();

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.Date , Calendar和SimpleDateFormat 。

Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

Java SE 8 , Java SE 9和更高版本

内置。

带有捆绑实现的标准Java API的一部分。

Java 9增加了一些小function和修复。

Java SE 6和Java SE 7

大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。

Android的

ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。

请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如Interval , YearWeek , YearQuarter 等等 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值