Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个日期之间的天数(不包括这两个日期)_Java_Android - Fatal编程技术网

Java 两个日期之间的天数(不包括这两个日期)

Java 两个日期之间的天数(不包括这两个日期),java,android,Java,Android,我搜索了这个,所以有很多帖子问这个问题,但所有的答案都是毫秒差/(24*1000*60*60),给出了两次约会之间的24小时数。 但我需要两次约会之间的天数 也就是说,如果date1是09/09/13 09:00而date2是10/09/13 22:00我需要的差异是0而不是1,因为date1和date2是连续的几天(即使它们之间的间隔超过24小时) 注意:我知道如何删除时间部分并使用毫秒差/(24*1000*60*60)方法。我正在寻找更好的解决办法 更新:该应用程序首次使用于09/09/13

我搜索了这个,所以有很多帖子问这个问题,但所有的答案都是
毫秒差/(24*1000*60*60)
,给出了两次约会之间的24小时数。 但我需要两次约会之间的天数

也就是说,如果
date1
09/09/13 09:00
date2
10/09/13 22:00
我需要的差异是
0
而不是
1
,因为
date1
date2
是连续的几天(即使它们之间的间隔超过24小时)

注意:我知道如何删除时间部分并使用
毫秒差/(24*1000*60*60)
方法。我正在寻找更好的解决办法

更新:该应用程序首次使用于
09/09/13 09:00
its a周三,然后在10/09/13 22:00 ` its周四使用。现在,用户在周三和周四都使用了该应用程序,尽管有超过24小时的间隔。现在,如果我计算两个日期之间的24小时数,它给出一个。因为两个日期之间有一天的间隔。我需要它给零,因为用户在星期三和星期四使用它。星期三和星期四之间没有一天。
希望你能理解我的问题。如果你还没离开,我会尽力解释的

这里有一个简单的解决方案:

Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);

while(calendar.getTime().before(endDate))
 {
    noOfDays++;
    calendar.add(Calendar.DAY_OF_MONTH,1);
 }
其中startDate和endDate是类的实例

注意:您需要初始化日期对象,以便它们具有相同的时间,但日期不同。将两者都设置为凌晨12点应该可以做到:

date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
import java.util.Date;
导入java.util.concurrent.TimeUnit;
导入java.text.simpleDataFormat;
导入java.text.ParseException;
公开课考试{
公共静态void main(字符串[]args)引发异常{
字符串dateStart=“09/09/13 09:00”;
字符串dateStop=“10/09/13 22:00”;
SimpleDateFormat=新的SimpleDateFormat(“dd/MM/yyyy HH:MM”);
Date date1=format.parse(dateStart);
Date date2=format.parse(dateStop);
//以毫秒为单位计算差异
long diff=(date2.getTime()-date1.getTime())-86400000;
diff=(diff我已经很久没有使用它了,但在过去的一周里,我抽出时间来使用它来解决这个问题。这是非常值得的

在处理普通Java时,很容易引入一些奇怪的日期处理错误,例如夏令时改变时会发生什么情况

请在此处查看相关问题:


更新

从Java 8开始,时间和日期功能得到了改进,Joda time团队建议使用该功能,而不是使用他们的库

注意,从JavaSE8开始,要求用户迁移到 java.time(JSR-310)——JDK的核心部分,它取代了 项目


你可以使用这个技巧:如果
date1
date2
之前,你可以将
date1
中的小时设置为
1
,将
date2
中的小时设置为
0
。这样,整个时差中的小时部分永远不会大于24小时,因此不会影响计算,因此只有天/月/年才重要

下面是一个代码示例

public static long daysBetween(Date date1, Date date2) {
    Calendar c1 = Calendar.getInstance();
    c1.setTime(date1);

    Calendar c2 = Calendar.getInstance();
    c2.setTime(date2);
    if (date1.before(date2)) {
        c1.set(Calendar.HOUR_OF_DAY, 1);
        c2.set(Calendar.HOUR_OF_DAY, 0);
    } else {
        c2.set(Calendar.HOUR_OF_DAY, 1);
        c1.set(Calendar.HOUR_OF_DAY, 0);
    }

    return (c2.getTimeInMillis() - c1.getTimeInMillis())
            / (24 * 60 * 60 * 1000);
}

//DEMO
public static void main(String[] args) throws Exception {
    DateFormat df = new SimpleDateFormat("dd/MM/yy hh:mm");
    Date date1 = df.parse("09/09/13 09:00");
    Date date2 = df.parse("11/09/13 22:00");

    System.out.println(daysBetween(date1, date2));
}
输出:
1


对于日期
11/09/13 09:00
09/09/13 22:00
结果将是
-1
,因为
date1
date2

tl;dr java.time 现代方法使用java.time类取代了麻烦的旧日期时间类,如
date
&
Calendar

如果要将经过的天数计算为日历日期数而不是24小时时间段数,请使用仅日期类而不是日期时间类

该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。对于任何给定的时刻,全球各地的日期都因区域而异。例如,年午夜后几分钟是新的一天,而年仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认时区可能随时更改,因此结果可能会有所不同。最好将所需/预期时区显式指定为参数

请以
大陆/地区
的格式指定一个,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,例如
EST
IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)

通常,最好使用UTC来思考、工作、记录、序列化和交换值。为此,请使用
Instant
。该类表示时间线上的某个时刻,分辨率为(最多九(9)位小数)

通过调用
Instant::toString
Instant::parse
以标准ISO 8601格式序列化为文本

要获取经过的日期,请应用时区(
ZoneId
)以获取
zoneDateTime
对象

ZonedDateTime zdtEarlier = earlier.atZone( z ) ;
ZonedDateTime zdtLater = later.atZone( z ) ;
提取仅日期值

LocalDate ldEarlier = zdtEarlier.toLocalDate() ;
LocalDate ldLater = zdtLater.toLocalDate() ;
现在我们可以得到两个日期之间经过的天数

long daysElapsed = ChronoUnit.DAYS.between( ldEarlier , ldLater ) ;
此计算是按照半开放方法进行的,其中开始是包含的,而结束是独占的。因此,例如,一个月从该月的第一天开始,一直到下个月的第一天,但不包括下个月的第一天。在整个业务逻辑、数据库查询等过程中始终使用此方法on将使您的代码库不易出错,并且更易于阅读/调试/维护

我知道你想使用一种完全开放的方法,其中开头和结尾都是排他性的。我强烈建议你重新考虑这个立场。但如果你坚持,只需减去Instant earlier = Instant.now() ; … Instant later = Instant.now() ;
ZonedDateTime zdtEarlier = earlier.atZone( z ) ;
ZonedDateTime zdtLater = later.atZone( z ) ;
LocalDate ldEarlier = zdtEarlier.toLocalDate() ;
LocalDate ldLater = zdtLater.toLocalDate() ;
long daysElapsed = ChronoUnit.DAYS.between( ldEarlier , ldLater ) ;
long daysElapsedFullyOpen = ( ChronoUnit.DAYS.between( ldEarlier , ldLater ) - 1 ) ;  // Subtract 1 to get a fully-Open answer. NOT recommended.