倒计时直到一天结束

Countdown until the end of the day

我很难尝试进行倒计时直到一天结束 (23:59)。

我有一个方法 returns 还剩多少时间,它 returns 是这样的:“5h 10m 1s” 没关系,问题是我想要它return我还剩多少到23:59。

我在完成操作时以毫秒为单位保存我想计算到一天结束的时间。

我有这样的东西:

public String getCountdown(UUID uuid, Quest quest) {

    String countdownTimePlaceholder = "";
    long questCompletedTimeMillis = plugin.getDatabaseManager().getQuestCompletedMillis(uuid, quest);
    long currentTimeMillis = System.currentTimeMillis();
    int hour = new Date().getHours();
    int minutes = new Date().getMinutes();
   

 int second = new Date().getSeconds();
        long seconds = ((24*60*60) - ((hour*60*60) + (minutes*60) + second));
        long seconds2 = seconds * 1000L;
        long waitingTime = currentTimeMillis - questCompletedTimeMillis;
        long waitingTimeDiv = waitingTime / 1000L;
        long waitingTimeSeconds = seconds - waitingTimeDiv, waitingTimeMinutes = waitingTimeSeconds / 60L, waitingTimeHours = waitingTimeMinutes / 60L;
        
        if (questCompletedTimeMillis + seconds2 > currentTimeMillis && questCompletedTimeMillis != 0L) {
            
            if (waitingTimeSeconds > 59L) waitingTimeSeconds -= 60L * waitingTimeMinutes;
            
            if (waitingTimeSeconds != 0L) countdownTimePlaceholder = waitingTimeSeconds + "s";
            
            if (waitingTimeMinutes > 59L) waitingTimeMinutes -= 60L * waitingTimeHours;
            
            if (waitingTimeMinutes > 0L) countdownTimePlaceholder = waitingTimeMinutes + "m " + countdownTimePlaceholder;
            
            if (waitingTimeHours > 0L) countdownTimePlaceholder = waitingTimeHours + "h " + countdownTimePlaceholder;
            
            return countdownTimePlaceholder;
        }
        return "-1";
    }

你说:

until the end of the day (23:59)

以 23:59 为目标是一种有缺陷的方法。一方面,在某些时区的某些日期可能不存在该时间。另一方面,您无法涵盖一整天,而忽略了新一天开始前的整整一分钟。你不能整齐地靠着日子,因为那一分钟的差距。

相反,通常最好的方法是半开,其中开头是包含,结尾是不包含。因此,一天会持续到但不包括 天的开始。

捕捉您感兴趣的时区中的当前时刻。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

获取明天的第一个时刻。

LocalDate tomorrow = now.toLocalDate().plusDays( 1 ) ;
ZonedDateTime tomorrowStart = tomorrow.atStartOfDay( z ) ;

计算经过的时间。

Duration d = Duration.between( now.toInstant() , tomorrowStart.toInstant() ) ;

提示:对于将时间跨度表示为一对 Instant 对象的 class,请参阅 Interval in ThreeTen-Extra