求两个时间值之间的时间差始终给出"Second"值为 0



我试图以 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内置的过时的DateSimpleDateFormat更好用。

long endMillis = LocalDateTime.parse(endTime,
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"))
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
long difference = endMillis - System.currentTimeMillis();

其余部分将与代码中的相同。要在Android上使用LocalDateTimeDateTimeFormatter,您需要获得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();

这会给你几秒钟的时间。

最新更新