我试图以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()
,以便textview每秒都像计时器一样更新。我面临的问题是秒值始终返回0.相反,我希望秒值每秒更新,如下所示:
01:50:45
01:50:44
01:50:43
01:50:42...
答案 0 :(得分:1)
您可以使用
difference = simpleDateFormat.parse(endTime).getTime() - new Date().getTime();
代替代码的这些行:
String currentTime = simpleDateFormat.format(new Date());
long difference = simpleDateFormat.parse(endTime).getTime() - simpleDateFormat.parse(currentTime).getTime();
这应该可以正常工作。
答案 1 :(得分:0)
您可以使用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)
答案 2 :(得分: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();
这将为您提供秒数。
答案 3 :(得分:0)
您正在执行两个值的减法并在结果大于0时执行操作。由于它不是,这意味着endTime不一定在将来,而是在currentTime之前。
修复您的endTime问题。