使用 Joda-Time 或 Java 8 中的新 java.time 包。
两个框架都使用 Half-Open 方法,其中开始是inclusive,而结束是exclusive。有时记为[)。这通常是定义时间跨度的最佳方法。
java.time
Java 8 及更高版本中内置的 java.time 框架有一个 Period 类,用于将时间跨度表示为年数、月数和天数。但是这个类仅限于整天,没有小时、分钟和秒的表示。
请注意,我们指定了一个时区,这对于确定日期至关重要。例如,Paris 的新一天比Montréal 早。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );
然后:2001-01-01。现在:2015-09-07。期间:P14Y8M6D。天数:5362
一整天,Daylight Saving Time (DST) 是无关紧要的。
如果您想要计算总天数,请使用包含一些计算方法的 ChronoUnit 枚举。请注意,计算返回一个 long。
long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above.
I have asked 关于在 java.time 中做一个完整的时间段,包括小时、分钟、秒。从 Java 8 开始不可能。使用 Meno Hochschild 的捆绑库 was suggested 的一个令人惊讶的解决方法是:使用在 javax.xml.datatype package 中找到的 Duration 类。
乔达时间
这是 Joda-Time 2.3 中的一些示例代码。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );
调用toString 会得到一个由ISO 8601 标准定义的字符串表示形式PnYnMnDTnHnMnS。