我试图以 HH:MM:SS 格式查找当前时间值和未来时间之间的差异。
例如:
当 date1 为"2017-05-11T20:30"且 date2 为"2017-05-11T21:40"时,输出应为 01:10:00。
这是我正在尝试的代码,其中我试图找到当前时间和未来时间值之间的差异:
public void updateTimeRemaining() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
String currentTime = simpleDateFormat.format(new Date());
long difference = simpleDateFormat.parse(endTime).getTime() - simpleDateFormat.parse(currentTime).getTime();
if (difference>0) {
String hms = String.format("%02d:%02d:%02d", millisLeft/(3600*1000),
millisLeft/(60*1000) % 60,
millisLeft/1000 % 60);
textView.setText(hms); //setting the remaining time in a textView
}
}
我每秒updateTimeRemaining()
调用该方法,以便文本视图像计时器一样每秒更新一次。我面临的问题是秒值总是返回 0。相反,我希望每秒更新一次秒值,如下所示:
01:50:45
01:50:44
01:50:43
01:50:42...
你可以使用
difference = simpleDateFormat.parse(endTime).getTime() - new Date().getTime();
代替这些代码行:
String currentTime = simpleDateFormat.format(new Date());
long difference = simpleDateFormat.parse(endTime).getTime() - simpleDateFormat.parse(currentTime).getTime();
这应该可以正常工作。
您可以使用CountDownTimer。这是一个例子:
new CountDownTimer(30000, 1000) { // 30 seconds countdown
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
构造函数是:CountDownTimer(long millisInFuture, long countDownInterval)
您正在执行两个值的减法,并在结果大于 0 时执行操作。既然不是,那就意味着结束时间必然不是在未来,而是在当前时间之前。
修复您的结束时间问题。
我得到了三个建议。
对我来说,自然的建议是您在java.time
中使用类。它们比Android Java内置的过时的Date
和SimpleDateFormat
更好用。
long endMillis = LocalDateTime.parse(endTime,
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"))
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
long difference = endMillis - System.currentTimeMillis();
其余部分将与代码中的相同。要在Android上使用LocalDateTime
和DateTimeFormatter
,您需要获得ThreeTenABP,它包含类。
我希望我能告诉你使用Duration
,另一个较新的类。但是,Duration
似乎不适合格式化。这将在Java 9(未测试)中改变:
LocalDateTime endDateTime = LocalDateTime.parse(endTime,
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"));
Duration diff = Duration.between(LocalDateTime.now(ZoneId.systemDefault()),
endDateTime);
if (! diff.isNegative()) {
String hms = String.format("%02d:%02d:%02d",
diff.toHoursPart(),
diff.toMinutesPart(),
diff.toSecondsPart());
textView.setText(hms); //setting the remaining time in a textView
}
这不是美丽而清晰吗?
如果你不想依赖ThreeTenABP,当然有一个修复你的代码。这甚至是一种简化。在您的代码中,您正在格式化从中获取当前时间的新Date()
,没有秒,因此它们会丢失,然后再次解析它,最后获得自纪元以来的毫秒数。跳过所有这些,只从System.currentTimeMillis()
获取当前时间,就像上面的第一个片段一样:
long difference = simpleDateFormat.parse(endTime).getTime()
- System.currentTimeMillis();
这会给你几秒钟的时间。