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

标签 android date java-time date-difference android-date

好的,所以我创建了一个函数来显示到 future 某个日期的天数......在天数超过 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

最佳答案

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

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

Days left: 18

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

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,新类的反向端口(ThreeTen for JSR 310;查看底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间类。

链接

关于android - 日期的剩余天数未正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52293042/

相关文章:

android - (Android) 如何将语音识别语言设置为我选择的语言?

android - Dagger2 依赖组件与子组件

sql-server - T-SQL:第一行的 CTE row_number over() 错误结果

android - 配置eclipse使用我自己的Android SDK (framework.jar)

javascript - 电话间隙 : How to make javascript calls from a native Android menu

java - 获取当前年份和月份导致奇怪的结果

java - Scala - 从数据集中收集不同值时,java.sql.Date 解析不正确

java - 检查月、日或年是否在字符串格式的两个日期范围内

java - 日期作为 LocalDateTime 的长值

Java 8 java.time : Adding TemporalUnit in Instant vs LocalDateTime