android - 日期的剩余天数未正确显示
问题描述
好的,所以我创建了一个函数来显示距离未来某个日期的天数......在天数超过 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);
}
刚刚运行这个片段(已经在新西兰 9 月 13 日)我得到了这个输出:
剩余天数:18
如果不是太平洋/奥克兰,请替换您的正确时区。
LaVepe 的答案已经很好且正确地解释了您的代码中出了什么问题,所以我不再重复了。
您使用的日期和时间类——Calendar
而且SimpleDateFormat
——早已过时,而且设计总是很糟糕。有一种方法可以Calendar
计算天数,一次 1 天,但它不太适合。SimpleDateFormat
因其给许多程序员带来的麻烦而臭名昭著。我建议您完全避免使用这些类,而改用 java.time。
问题:我可以在 Android 上使用 java.time 吗?
是的,java.time
在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,现代 API 是内置的。
- 在 Java 6 和 7 中获得 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从
org.threeten.bp
子包中导入日期和时间类。
链接
- LaVepe的回答
- Oracle 教程:日期时间解释如何使用
java.time
. - Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - ThreeTenABP , ThreeTen Backport 的 Android 版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
推荐阅读
- android - Rx:如何取消通话?
- cloud - 飞天云是否为其云服务提供API
- javascript - 如何使动态按钮在 javascript 上工作?
- unity3d - 可以使用 Unity 将 glsl 着色器编译为 Webassemly/wasm 吗?
- highcharts - 无法在 highcharts 的固定柱栏中获取百分比
- mysql - 如何加快mysql查询计算平均值?
- bash - Julia 和 Bash - Julia 的 shell 模式不执行 ~/.bash_profile(或 ~/.bashrc)
- codenameone - 将密钥对存储在代号为一个应用程序的设备中
- ideamart - IdeaMart Simulator-v2.2 无法启动
- spring-boot - Spring Boot 休息请求数据类型验证