Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Date - Fatal编程技术网

Java,获取两个日期之间的天数

Java,获取两个日期之间的天数,java,date,Java,Date,在java中,我想得到两个日期之间的天数,不包括这两个日期 例如: 如果第一个日期为2011年11月11日,第二个日期为2011年11月13日 那么它应该是1 这是我正在使用但不起作用的代码(secondDate和firstDate是Calendar对象): 我甚至试着把结果四舍五入,但没有用 如何获得java中日期之间的天数(不包括天数本身)?我有两个建议: 确保您的浮动日\u计数计算正确 浮动日计数=((浮动)差异)/(24f*60f*60f*1000f) 如果是舍入错误,请尝试使用方法 d

在java中,我想得到两个日期之间的天数,不包括这两个日期

例如:

如果第一个日期为2011年11月11日,第二个日期为2011年11月13日 那么它应该是
1

这是我正在使用但不起作用的代码(
secondDate
firstDate
Calendar
对象):

我甚至试着把结果四舍五入,但没有用


如何获得java中日期之间的天数(不包括天数本身)?

我有两个建议:

  • 确保您的
    浮动日\u计数计算正确

    浮动日计数=((浮动)差异)/(24f*60f*60f*1000f)

  • 如果是舍入错误,请尝试使用方法

    daysCount.setText(“+(int)Math.floor(day_count))

  • 我刚刚在SDK 8(Android 2.2)上测试了以下代码片段:

    Calendar date1 = Calendar.getInstance();
    Calendar date2 = Calendar.getInstance();
    
    date1.clear();
    date1.set(
       datePicker1.getYear(),
       datePicker1.getMonth(),
       datePicker1.getDayOfMonth());
    date2.clear();
    date2.set(
       datePicker2.getYear(),
       datePicker2.getMonth(),
       datePicker2.getDayOfMonth());
    
    long diff = date2.getTimeInMillis() - date1.getTimeInMillis();
    
    float dayCount = (float) diff / (24 * 60 * 60 * 1000);
    
    textView.setText(Long.toString(diff) + " " + (int) dayCount);
    
    在这两种情况下(2011年11月10日-2011年11月8日)和(2011年11月13日-2011年11月11日),它都能完美地工作,并给出dayCount=2.0

  • 不要在整数计算中使用浮点

  • 你确定你的日期是天吗?
    日期
    类型的精度为毫秒。因此,你需要做的第一件事就是把约会安排到没有时间的地方。示例:从
    23:30 2011-11-01
    00:30 2011-11-02
    只有一个小时,但这两个日期在不同的日子


  • 如果您只打算处理1900年和2100年之间的日期,有一个简单的计算,它将为您提供自1900年以来的天数:

    public static int daysSince1900(Date date) {
        Calendar c = new GregorianCalendar();
        c.setTime(date);
    
        int year = c.get(Calendar.YEAR);
        if (year < 1900 || year > 2099) {
            throw new IllegalArgumentException("daysSince1900 - Date must be between 1900 and 2099");
        }
        year -= 1900;
        int month = c.get(Calendar.MONTH) + 1;
        int days = c.get(Calendar.DAY_OF_MONTH);
    
        if (month < 3) {
            month += 12;
            year--;
        }
        int yearDays = (int) (year * 365.25);
        int monthDays = (int) ((month + 1) * 30.61);
    
        return (yearDays + monthDays + days - 63);
    }
    
    public static int daysSince1900(日期){
    日历c=新的公历日历();
    c、 设定时间(日期);
    int year=c.get(日历年);
    如果(年份<1900 | |年份>2099){
    抛出新的IllegalArgumentException(“daysSince1900-日期必须介于1900和2099之间”);
    }
    年份-=1900;
    int month=c.get(日历月)+1;
    int days=c.get(日历,月中日);
    如果(月<3){
    月份+=12;
    年--;
    }
    整数年天数=(整数)(年份*365.25);
    国际月日=(国际)(月+1)*30.61);
    报税表(年+月+日-63);
    }
    
    因此,要获得两个日期之间的天数差,请计算两个日期自1900年以来的天数,并计算差值。我们的daysBetween方法如下所示:

    public static Integer getDaysBetween(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return null;
        }
    
        int days1 = daysSince1900(date1);
        int days2 = daysSince1900(date2);
    
        if (days1 < days2) {
            return days2 - days1;
        } else {
            return days1 - days2;
        }
    }
    
    public静态整数getDaysBetween(日期日期1、日期2){
    如果(date1==null | | date2==null){
    返回null;
    }
    int days1=daysSince1900(日期1);
    int days2=daysSince1900(日期2);
    如果(第1天<第2天){
    返回日2-返回日1;
    }否则{
    返回日期1-日期2;
    }
    }
    
    在您的情况下,您需要减去额外的一天(如果两天不相等)

    不要问我这个计算是从哪里来的,因为我们从90年代初就开始使用它。

    获取java.util.Dates之间的天数,忽略夏令时 快速和肮脏的黑客:

    public int get_days_between_dates(Date date1, Date date2)
    {       
        //if date2 is more in the future than date1 then the result will be negative
        //if date1 is more in the future than date2 then the result will be positive.
    
        return (int)((date2.getTime() - date1.getTime()) / (1000*60*60*24l));
    }
    
    此功能将在99.99%的时间内工作,除非稍后在闰秒、夏令时、时区更改闰年等边缘情况下让您感到意外。如果您同意每隔1(或2)小时停止计算一次,这就足够了

    获取日期之间的天数,考虑闰秒、夏令时、时区等 如果你问这个问题,你需要打自己一巴掌。两次约会至少相隔一天意味着什么?这很令人困惑。如果一个日期是一个时区的午夜,而另一个日期是另一个时区的凌晨1点,该怎么办?根据你对它的理解,答案是1和0

    您认为您可以强制将日期作为通用时间格式传递到上述函数中,这将解决您的一些问题。但是你只是把问题重新定位到如何将本地时间转换成世界时间。从时区到世界时的逻辑转换可能不是直观的。在某些情况下,当传递的日期明显相隔两天时,你会得到一天的差异

    你觉得你能应付吗?世界上有一些落后的日历系统,根据收获季节和政治统治者的不同而不断变化。如果您想将他们的时间转换为UTC,java.util.Date将在最糟糕的时刻让您失望


    如果您需要计算日期之间的天数,并且确保一切正常至关重要,那么您需要一个名为Joda Time的外部库:(他们已经为您处理好了所有细节,因此您可以愉快地保持对这些细节的不了解):

    您在计算之前是否对日期进行了正常化?我的意思是你必须清除字段小时、分钟、秒和毫秒。@slkorolev:哦……我真的不知道。让我再试一次。我应该按照slkorolev的建议清除小时、分钟、秒和毫秒字段吗??或者我可以像以前那样使用?@Hiral我认为这种方法没有必要。但是我还没有测试。我已经测试了两个选项,设置了和没有设置这些字段,但是没有成功!无论如何,谢谢你的回复@Hiral你能在你设置第一个日期和第二个日期的地方发布代码吗?事实上,我使用的是NumberPickerDialog,它给了我相应的日期。它工作得非常好。设置日期没有问题。注:1。不要使用float将毫秒转换为天。2.要从计算中排除这两天,请从
    dayCount
    中减去1@亚伦:谢谢你的评论,我同意。我认为原始问题的原因不是计算,而是日历初始化。datePicker1在哪里??我如何使用我的日历对象和代码???@Hiral:dattePicker1和2只是我测试应用程序中的复合组件。它们存储输入日期的年、月和日。实际上,这段代码的要点是
    public int get_days_between_dates(Date date1, Date date2)
    {       
        //if date2 is more in the future than date1 then the result will be negative
        //if date1 is more in the future than date2 then the result will be positive.
    
        return (int)((date2.getTime() - date1.getTime()) / (1000*60*60*24l));
    }