日期的剩余天数未正确显示

Remaining days to a date is not showing correctly

好的,所以我创建了一个函数来显示距未来某个日期还有多少天...在天数超过 9 天之前它是正确的..如果超过它似乎显示随机天数......请看下面我的代码:

   public String daysTillExpire() {
        String daysLeft = "";
        int position = 0 ;
        String inputDateString = UIDM.get(position).date;
        Calendar calCurr = Calendar.getInstance();
        Calendar day = Calendar.getInstance();


        try {
            day.setTime(new SimpleDateFormat("dd-MM-yyyy").parse(inputDateString));

        } catch (ParseException e) {
            e.printStackTrace();
        }

            if (day.after(calCurr)) {

                String noumberOfDays = "Days left: " + (day.get(Calendar.DAY_OF_MONTH) - (calCurr.get(Calendar.DAY_OF_MONTH)));

                daysLeft = UIDM.get(position).date + "\n(" + noumberOfDays+")" ;

            }

            else if (day.before(calCurr)) {
                daysLeft = "Key Expired";
            return daysLeft; }
        return daysLeft;
    }

UIDM 是包含信息的数据模型... String inputDateString = UIDM.get(position).date; returns 值 01-10-2018 23:59.

注意 Calendar.DAY_OF_MONTH returns 1 到 31 之间的月份日期

所以它会计算两天之间的差异(1 和 31 之间的数字),就好像它们在同一个月一样

我建议宁愿使用时间戳,然后将结果从毫秒转换为天数,如下所示:

long oneDay = 24 * 60 * 60 * 1000;  // in milliseconds
long diff = day.getTime().getTime() - calCurr.getTime().getTime();
long numberOfDays = diff / oneDay;

然后你可以用Long.toString(numberOfDays)

把它改成String

试试这个方法

/**
         *  
         * @param token
         * @param date1 present date
         * @param date2 future date 
         * @return diff
         */
        public float dateDiff(String token,Date date1,Date date2){

            float diff=0;
            //different date might have different offset
            Calendar cal1=Calendar.getInstance(); 
            Calendar cal2=Calendar.getInstance();
            cal1.setTime(date1);          
            long ldate1 = date1.getTime() + cal1.get(Calendar.ZONE_OFFSET) + cal1.get(Calendar.DST_OFFSET);

            if(date2==null)
                cal2.setTime(new Date());
            else
                cal2.setTime(date2);
            long ldate2 = date2.getTime() + cal2.get(Calendar.ZONE_OFFSET) + cal2.get(Calendar.DST_OFFSET);

            // Use integer calculation, truncate the decimals
            int hr1   = (int)(ldate1/3600000); //60*60*1000
            int hr2   = (int)(ldate2/3600000);

            int days1 = hr1/24;
            int days2 = hr2/24;
            int dateDiff  = days2 - days1;
            int yearDiff  = cal2.get(Calendar.YEAR) - cal1.get(Calendar.YEAR); 
            float monthDiff = yearDiff * 12 + cal2.get(Calendar.MONTH) - cal1.get(Calendar.MONTH);
            System.out.println("monthDiff 1" +monthDiff);
            System.out.println(" days:  ;;;;222  "+dateDiff);
            float fbm = dateDiff ; 

            fbm = (float) MasterLibraryFunction.doubRound(fbm /30,2) ;

                if(token.equals("d"))
            {
                diff=dateDiff;
                System.out.println(" days:  ;;;;  "+dateDiff);
            }
            else if(token.equals("m"))
            {
                //diff= monthDiff;
                diff =fbm;
                System.out.println(" diff ---------->:  ;;;;  "+fbm);

            }

    /*******day wise diff *******/      


            return diff;
        }



/**
     * @category Decimal point round
     * @param  val
     * @param  places
     * @return Rounded Value to given place
     */
    public static double doubRound(double val, int places) {
        long factor = (long)Math.pow(10,places);
        val = val * factor;
        long tmp = Math.round(val);
        return (double)tmp / factor;
    }

要获取两天之间的间隔天数,您可以这样做:

public long daysTillExpire() {

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    String dateInString = "01-10-2018 23:59";
    Date date = null;
    try {
        date = sdf.parse(dateInString);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    Calendar expiredCalendar = Calendar.getInstance();
    expiredCalendar.setTime(date);

    long msDiff = expiredCalendar.getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
    long daysDiff = TimeUnit.MILLISECONDS.toDays(msDiff); 

    return daysDiff;
}

以上功能已测试成功,根据您的需求修改。

java.time

java.time,现代Java日期和时间API,有计算两个日期之间天数的方法。所以不要费心自己做这个计算。很容易出错。

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu H:mm");
    String inputDateString = "01-10-2018 23:59";
    LocalDate today = LocalDate.now(ZoneId.of("Pacific/Auckland"));
    LocalDate expiration = LocalDate.parse(inputDateString, dateFormatter);
    if (expiration.isAfter(today)) {
        String numberOfDays = "Days left: " + ChronoUnit.DAYS.between(today, expiration);
        System.out.println(numberOfDays);
    }

运行 这个片段刚刚(新西兰已经是 9 月 13 日)我得到了这个输出:

Days left: 18

如果不是 Pacific/Auckland,请替换为正确的时区。

LaVepe 的回答已经很好且正确地解释了您的代码中出现的问题,因此我不再重复。

您使用的 类 日期和时间 — CalendarSimpleDateFormat — 早就过时了,而且设计总是很糟糕。有一种方法可以让 Calendar 计算天数,一次算一天,但它不太适合那个。 SimpleDateFormat 因给许多程序员带来的麻烦而臭名昭著。我建议您完全避免使用 类,而使用 java.time。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接