我需要以秒为单位添加特定时间。为此,我做到了:
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类,该类取代了可怕的传统日期时间类,例如
Calendar
和Date
。一天的开始
如果您想一天的第一时间,则需要一个
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…
方法执行日期时间数学。使用
Duration
或Period
类指定未附加到时间线上的时间跨度。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类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如
Interval
, YearWeek
, YearQuarter
和more。