tl; dr
将过时的java.util.Date
对象转换为它们的替换java.time.Instant
。然后将经过时间计算为Duration
。
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString():PT2H34M56S
d.toMinutes():154
d.toMinutesPart():34
ISO 8601格式: PnYnMnDTnHnMnS
明智的标准ISO 8601定义了跨度的简洁文本表示形式,以年,月,日,小时等表示。该跨度称为持续时间。格式是PnYnMnDTnHnMnS
其中P
装置“周期”,则T
分开的时间部分的时间部分,并且在是数字后跟一个字母之间。
例子:
P3Y6M4DT12H30M5S
三年零六个月四天十二小时三十分钟五秒
PT4H30M
四个半小时
java.time
该java.time内置到Java 8及更高版本的框架取代了麻烦老java.util.Date
/ java.util.Calendar
班。新课程的灵感取自于成功的Joda-Time框架,该框架旨在作为其继任者,其概念相似但经过重新架构。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅教程。
时刻
该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
Instant instant = Instant.now() ; // Capture current moment in UTC.
最好避免使用Date
/ 等旧类Calendar
。但是,如果您必须与尚未更新为java.time的旧代码进行互操作,请来回转换。调用添加到旧类中的新转换方法。要从a java.util.Date
移到an Instant
,请致电Date::toInstant
。
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
时间跨度
java.time类将这种表示时间跨度的想法分为两半:年,月,日,小时,分钟,秒:
这是一个例子。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
转储到控制台。
二者Period
并Duration
用ISO 8601标准,用于产生其值的字符串表示。
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
现在:2015-11-26T00:46:48.016-05:00 [美国/蒙特利尔]至未来:2015-11-26T00:46:48.016-05:00 [美国/蒙特利尔] = PT1H3M
Java 9添加了一些方法来Duration
获取天数,小时数,分钟数和秒数。
您可以获取整个“持续时间”中的天数或小时数,分钟数或秒数或毫秒或纳秒数的总数。
long totalHours = duration.toHours();
在Java 9中,Duration
该类获得了用于返回天,小时,分钟,秒,毫秒/纳秒各个部分的新方法。调用to…Part
方法:toDaysPart()
,toHoursPart()
等等。
ChronoUnit
如果您只关心更简单的较大时间粒度,例如“经过的天数”,请使用ChronoUnit
枚举。
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
另一个例子。
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
关于java.time
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
乔达时代
更新:Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。我保留此部分的历史记录。
Joda-Time库使用ISO 8601作为其默认值。它的Period
类解析并生成这些PnYnMnDTnHnMnS字符串。
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
渲染:
period: PT4H30M