找出两个时间值之间的时间差总是给出"秒"值为0

时间:2017-05-11 15:40:16

标签: java android time simpledateformat

我试图以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...

4 个答案:

答案 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内置的过时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();

这将为您提供秒数。

答案 3 :(得分:0)

您正在执行两个值的减法并在结果大于0时执行操作。由于它不是,这意味着endTime不一定在将来,而是在currentTime之前。

修复您的endTime问题。