如何找到两个Joda-Time DateTime实例之间的天数差异? “天数差异”是指如果开始是星期一而结束是星期二,我预计返回值为1,无论开始日期和结束日期的小时/分钟/秒 .
Days.daysBetween(start, end).getDays()
如果开始是在晚上并在早上结束,则给我0 .
我对其他日期字段也有同样的问题,所以我希望有一种通用的方法来“忽略”不太重要的字段 .
换句话说,2月到3月4日之间的月份也是1,而14:45到15:12之间的时间也是1 . 但是,14:01和14:55之间的小时差异为0 .
8 回答
令人讨厌的是,withTimeAtStartOfDay的答案是错误的,但只是偶尔 . 你要:
事实证明,“午夜/一天的开始”有时意味着凌晨1点(在某些地方以这种方式发生夏令时),Days.daysBetween无法正常处理 .
通过
LocalDate
回避整个问题 .天班
使用Days类与withTimeAtStartOfDay方法应该工作:
你可以使用LocalDate:
tl;博士
…要么…
java.time
仅供参考,Joda-Time项目现在是maintenance mode,该团队建议移民到java.time class .
相当于Joda-Time
DateTime
是ZonedDateTime
.显然,您希望按日期计算日期,这意味着您要忽略一天中的时间 . 例如,在午夜前一分钟开始到午夜后一分钟结束应该会导致一天 . 对于此行为,从
ZonedDateTime
中提取LocalDate
. LocalDate类表示没有时间且没有时区的仅日期值 .使用ChronoUnit枚举计算已用天数或其他单位 .
截断
至于你要求一个更通用的方法来计算你感兴趣的小时数增量作为小时的时间而不是60小时的 Span 的完整时间,使用
truncatedTo
方法 .这是你在同一天14:45到15:12的例子 .
对于按日期计算的天数,请截断为
ChronoUnit.DAYS
. 这是一个例子,从过去的五分钟到五分钟后的午夜,经历了1
的过去几天 .关于java.time
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,如java.util.Date,Calendar和SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类 .
要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 . 规格是JSR 310 .
您可以直接与数据库交换java.time对象 . 使用JDBC driver符合JDBC 4.2或更高版本 . 不需要字符串,不需要
java.sql.*
类 .从哪里获取java.time类?
Java SE 8,Java SE 9,Java SE 10以及之后
内置 .
具有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和Java SE 7
大部分java.time功能在ThreeTen-Backport中反向移植到Java 6和7 .
Android
更新版本的Android捆绑java.time类的实现 .
对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述) . 见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .
ThreeTen-Extra项目使用其他类扩展了java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .
接受的答案构建了两个
LocalDate
对象,如果您正在阅读大量数据,这些对象非常昂贵 . 我用这个:通过调用
getMillis()
,您可以使用已存在的变量 .MILLISECONDS.toDays()
然后,使用简单的算术计算,不会创建任何对象 .java.time.Period
使用java.time.Period类来count days .
由于Java 8计算差异更直观,使用
LocalDate
,LocalDateTime
来表示两个日期