我需要以秒为单位添加特定时间。为此,我做到了:

Date startTime = dayStart(dateSelected);
startTime.setSeconds(startTime.getSeconds()+30);

但是,通过这种方式,我得到以下警报:

这行有多个标记
-不建议使用Date类型的setSeconds(int)方法
-不建议使用Date类型的getSeconds()方法

什么是不获取这些已过时的警报的更好方法?

最佳答案

tl; dr



不要使用该可怕的类java.util.Date。使用其替换Instant

myJavaUtilDate.toInstant().plusSeconds( 30 )

java.time

现代方法使用JSR 310中定义的java.time类,该类取代了可怕的传统日期时间类,例如CalendarDate

java - 为日期添加秒-LMLPHP

一天的开始



如果您想一天的第一时间,则需要一个LocalDate(日期)和一个ZoneId(时区)。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate localDate = LocalDate.now( z ) ;  // Get the current date as seen in a particular time zone.

获取该日期的开始。指定一个时区以获取ZonedDateTime。始终让java.time确定一天的第一时刻。某些区域中的某些日期并非从00:00:00开始。它们可能在其他时间(例如01:00:00)开始。
ZonedDateTime zdt = localDate.atStartOfDay( z ) ;

日期时间数学

您可以通过调用plus…minus…方法执行日期时间数学。

使用DurationPeriod类指定未附加到时间线上的时间跨度。
Duration d = Duration.ofSeconds( 30 ) ;

添加。
ZonedDateTime zdtLater = zdt.plus( d ) ;

或将这两行合并为1。
ZonedDateTime zdtLater = zdt.plusSeconds( 30 ) ;

转换中

如果需要与尚未更新为java.time的旧代码进行互操作,请调用添加到旧类中的新转换方法。
java.util.Date旧式类表示UTC中的时刻,分辨率为毫秒。它的替换是java.time.Instant,也是UTC中的一个时刻,但分辨率要高得多(纳秒)。

您可以从Instant中提取ZonedDateTime,从某个时区到UTC有效地进行调整。同一时刻,时间轴上的同一点,不同的挂钟时间。
Instant instant = zdtLater.toInstant() ;

关于java.time

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

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

现在位于Joda-Time中的maintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用兼容JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?
  • Java SE 8Java SE 9Java SE 10Java SE 11和更高版本-具有 bundle 实现的标准Java API的一部分。
  • Java 9添加了一些次要功能和修复。
  • Java SE 6Java SE 7
  • 大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
  • Android
  • 更高版本的java.time类的Android bundle 实现。
  • 对于早期的Android(ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。参见How to use ThreeTenABP…

  • ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如 Interval YearWeek YearQuarter more

    07-28 02:32
    查看更多