【问题标题】:Countdown until the end of the day倒计时到一天结束
【发布时间】:2021-11-21 07:18:12
【问题描述】:

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

我有一个返回剩余时间的方法,它返回如下内容:“5h 10m 1s”,这很好,问题是我希望它返回剩余的时间,直到 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";
    }

【问题讨论】:

  • @user16320675 不,23:59 不是一天的结束。从那一天到新的一天还有整整一分钟。不要以一天结束为目标。时间跨度最好通过半开放方法定义,其中开始是包含,而结束是独占。所以一天会持续到但不包括下一个天的开始。

标签: java timer countdown


【解决方案1】:

你说:

直到一天结束 (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 对象的类,请参阅ThreeTen-Extra 中的Interval

【讨论】:

  • 问题:为什么要转换成Instant?你就不能between(now, now.withHour(23).withMinute(59).truncatedTo(MINUTES))吗(问题只问到23:59的时间)?
  • @Slaw 瞄准 23:59 是一种有缺陷的方法。一方面,在某些时区的某些日期可能不存在该时间。其次,见my other Comment
  • 我认为这真的取决于你想要做什么。看起来 OP 正在编写某种游戏,其中任务的截止日期是 23:59:00。然后他们只想显示一个计时器,显示玩家需要多长时间才能完成任务。其他现实生活中的应用程序的截止日期为 23:59:00。例如,我的大学使用名为“Canvas”的软件,标准是作业/测验/测试/等都在 23:59:00 到期。但话虽这么说,OP 接受了你的回答,所以也许他们真的想要“一天结束”。
猜你喜欢
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2023-04-09
  • 2020-11-30
相关资源
最近更新 更多