Java 三月份两个日期之间天数的错误差异
我试图计算三月份两个日期之间的天数,但我得到了错误的结果 当Java 三月份两个日期之间天数的错误差异,java,android,datetime,Java,Android,Datetime,我试图计算三月份两个日期之间的天数,但我得到了错误的结果 当dateBefore为2017年3月1日且dateAfter为2017年3月31日时,diff为29天,但应为30天(31-1) 我建议不要使用java.util.Date。有点尴尬。如果允许使用第三方库,我建议使用JSR-310后端口 因为您使用的是Android,所以您需要像在标准Java 7项目中一样包含此库,即使您使用的是jack编译器,因为Android SDK中还没有时间 安装程序 在应用程序的build.gradledep
dateBefore
为2017年3月1日且dateAfter
为2017年3月31日时,diff
为29天,但应为30天(31-1)
我建议不要使用
java.util.Date
。有点尴尬。如果允许使用第三方库,我建议使用JSR-310后端口
因为您使用的是Android,所以您需要像在标准Java 7项目中一样包含此库,即使您使用的是jack编译器,因为Android SDK中还没有时间
安装程序
在应用程序的build.gradle
dependencies列表中,您可以添加threeten库的Android自适应:
compile "com.jakewharton.threetenabp:threetenabp:1.0.4"
…如果您需要能够运行使用Three-Ten的标准Java单元测试,您可以通过添加此项来排除Android部分,并包括Three-Ten库本身(如果您使用Roboelectric,可能没有必要,但我不能100%确定):
然后,您需要在应用程序中初始化Android库:
// e.g. in your Application subclass
@Override
public void onCreate() {
AndroidThreeTen.init(this);
}
用法
现在您可以执行以下操作:
LocalDate dateBefore = LocalDate.of(2017, 3, 1);
LocalDate dateAfter = LocalDate.of(2017, 3, 31);
long daysBetween = ChronoUnit.DAYS.between(dateBefore, dateAfter);
assertEquals(30, daysBetween);
我建议不要使用
java.util.Date
。有点尴尬。如果允许使用第三方库,我建议使用JSR-310后端口
因为您使用的是Android,所以您需要像在标准Java 7项目中一样包含此库,即使您使用的是jack编译器,因为Android SDK中还没有时间
安装程序
在应用程序的build.gradle
dependencies列表中,您可以添加threeten库的Android自适应:
compile "com.jakewharton.threetenabp:threetenabp:1.0.4"
…如果您需要能够运行使用Three-Ten的标准Java单元测试,您可以通过添加此项来排除Android部分,并包括Three-Ten库本身(如果您使用Roboelectric,可能没有必要,但我不能100%确定):
然后,您需要在应用程序中初始化Android库:
// e.g. in your Application subclass
@Override
public void onCreate() {
AndroidThreeTen.init(this);
}
用法
现在您可以执行以下操作:
LocalDate dateBefore = LocalDate.of(2017, 3, 1);
LocalDate dateAfter = LocalDate.of(2017, 3, 31);
long daysBetween = ChronoUnit.DAYS.between(dateBefore, dateAfter);
assertEquals(30, daysBetween);
这是唯一的日期吗?你必须告诉我们确切的输入才能知道。我的猜测是,你正在经历一段时间,当时钟在你考虑的任何时区前进时,导致的时差略小于30*24小时。但是如果没有更多的信息,我们不可能知道。顺便说一句,2017年3月12日星期日是“夏令时”…谢谢大家。现在我试着使用joda Times这是唯一的日期吗?你必须给我们显示准确的输入,让我们知道。我的猜测是,你正在经历一段时间,当时钟在你考虑的任何时区前进时,导致的时差略小于30*24小时。但是如果没有更多的信息,我们不可能知道。顺便说一句,2017年3月12日星期日是“夏令时”…谢谢大家。现在我尝试使用joda Time如果您将2016.01.01 23:30与2016.01.02 18:30进行比较,这将只计算“完整天数”,当使用
LocalDateTime
时,它将返回0天的差异更正。这就是为什么这里使用LocalDate
ChronoUnit.DAYS.between
接受Temporal
参数,该参数可以是LocalDateTime
,但这会导致您的日期时间未注册为全天的差异。如果您将2016.01.01 23:30与2016.01.02 18:30进行比较,这将只计算“全天”,它将返回0天的差异更正,改用LocalDateTime
时。这就是为什么这里使用LocalDate
ChronoUnit.DAYS.between
接受Temporal
参数,这些参数可以是LocalDateTime
,但这会导致您的日期时间不能注册为全天的时间差。