Find the difference in time between two time values always gives the “Second” value as 0

时光毁灭记忆、已成空白 提交于 2019-12-25 16:09:14

问题


I'm trying to find the difference between current time value and a future time in HH:MM:SS format.

For example:
When date1 is "2017-05-11T20:30" and date2 is "2017-05-11T21:40", the output should be 01:10:00.

Here's the code I'm trying, wherein I'm trying to find the difference between current time and a future time value:

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
    }
}

I'm invoking the method updateTimeRemaining() every second so that the textview gets updated every second like a timer. The problem I'm facing is seconds value always returns 0. Instead I would like the seconds value to be updated every second like below:

01:50:45
01:50:44
01:50:43
01:50:42...

回答1:


You could use

difference = simpleDateFormat.parse(endTime).getTime() - new Date().getTime();

in place of these lines of your code:

String currentTime = simpleDateFormat.format(new Date());
long difference = simpleDateFormat.parse(endTime).getTime() - simpleDateFormat.parse(currentTime).getTime();

This should work fine.




回答2:


You can use CountDownTimer. Here is an example :

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();

The Constructor is : CountDownTimer(long millisInFuture, long countDownInterval)




回答3:


You are performing a subtraction of two values and taking action if the result is greater than 0. Since it is not, it means endTime is necessarily not in the future but is before currentTime.

Fix your endTime problem.




回答4:


I got three suggestions.

To me the natural suggestion is you use the classes in java.time. They are much nicer to work with than the outdated Date and SimpleDateFormat that are built-in with your Android Java.

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

The rest will be the same as in your code. To use LocalDateTime and DateTimeFormatter on Android you will need to get ThreeTenABP, it contains the classes.

I wish I could tell you to use Duration, another one of the newer classes. However, Duration doesn’t seem to lend itself well to formatting. This will change with Java 9 (not tested):

    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
    }

Isn’t that beautiful and clear?

If you don’t want the dependency on ThreeTenABP, there is of course a fix to your code. It’s even a simplification. In your code you are formatting the new Date() that you are getting the current time from, without seconds, so they get lost, and then parsing it again, and finally getting its milliseconds since the epoch. Skip all of that and just get the current time from System.currentTimeMillis() just as in the first snippet above:

    long difference = simpleDateFormat.parse(endTime).getTime()
                        - System.currentTimeMillis();

This will give you your seconds.



来源:https://stackoverflow.com/questions/43920007/find-the-difference-in-time-between-two-time-values-always-gives-the-second-va

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!