代码之家  ›  专栏  ›  技术社区  ›  astric mobiles

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

  •  2
  • astric mobiles  · 技术社区  · 6 年前

    好的,我创建了一个函数来显示距离将来某个日期的天数。。。在天数超过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; 返回值 01-10-2018 23:59 .

    4 回复  |  直到 6 年前
        1
  •  1
  •   LaVepe    6 年前

    请注意 Calendar.DAY_OF_MONTH 返回1到31之间的月份

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

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

    然后你可以把它改成 String 具有 Long.toString(numberOfDays)

        2
  •  4
  •   Anonymous    6 年前

    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日在新西兰),我得到了以下输出:

    如果不是太平洋/奥克兰,请用正确的时区代替。

    LaVepe的答案已经很好地正确地解释了代码中的错误,所以我不再重复。

    您使用的日期和时间类 Calendar SimpleDateFormat 日历 日期格式 因为它给许多程序员带来的麻烦而臭名昭著。我建议您完全避免使用这些类并使用java.time文件相反。

    问题:我能用吗java.time文件在Android上?

    对, java.time 在较旧和较新的Android设备上运行良好。它至少需要Java 6

    • 在java8及更高版本和更新的Android设备上(据Im所知,来自API级别26),现代API是内置的。
    • 在Java6和Java7中,获取三个十的Backport,即新类的Backport(三个十用于JSR310;请参阅底部的链接)。
    • 在(旧的)Android上使用Android版本的ThreeTen Backport。它叫3TENABP。并确保从导入日期和时间类 org.threeten.bp

    链接

        3
  •  1
  •   user5065324 user5065324    6 年前

    试试这个方法

    /**
             *  
             * @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;
        }
    
        4
  •  1
  •   navylover    6 年前

    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;
    }
    

    以上功能测试成功,请根据您的要求进行修改。