3 回答

TA贡献1784条经验 获得超7个赞
我知道简单的方法是将时间差以毫秒为单位,然后将其转换为天。但是,我想知道这是否在所有情况下都有效(夏令时等)。
如果您的时间是从UTC日期得出的,或者它们仅仅是在同一系统上两次调用System.getCurrentTimeMillis()的时间差,则您将获得有效的毫秒数,与任何时区问题无关。(这就是为什么所有内容都应使用UTC作为存储格式的原因-从UTC->当地时间开始要容易得多;如果尝试采用其他方式,则需要将本地时区与当地时间一起存储-或尝试推断,g!)
至于将其转换为几天,您应该可以除以86400000...。但要注意,每隔一年左右偶尔会有一次leap秒。

TA贡献1884条经验 获得超4个赞
在Java 8中使用Joda-Time或新的java.time包。
这两个框架都使用Half-Open方法,其中开始是包含在内的,而结尾是排斥的。有时标注为[)。通常,这是定义时间跨度的最佳方法。
java.time
Java 8及更高版本中内置的java.time框架具有一个Period类,用于表示时间跨度,以年,月,日为单位。但是此类仅限于整天,不能表示小时,分钟和秒。
请注意,我们指定了时区,这对于确定日期至关重要。例如,巴黎的新天要比蒙特利尔早。
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
对于整天,则夏令时(DST)无关紧要。
如果要计算总天数,请使用ChronoUnit包含一些计算方法的枚举。注意,计算返回很长的时间。
long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above.
我曾问过要在java.time中进行一整段时间,包括小时,分钟,秒。不可能的,因为Java的8使用捆绑的库令人惊讶的解决办法的建议由梅诺尔德:使用Duration中发现了类javax.xml.datatype中的包。
乔达时代
这是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。
添加回答
举报