首页 > 解决方案 > 尝试编写将在第二天开始的代码

问题描述

我正在尝试编写代码以在凌晨 1 点运行。这个想法是以毫秒为单位找到第二天的时间量,然后在那个时间睡觉我这样做是通过将当前时间的提醒除以天数来实现的。

remainder= current time % 8640000

当前时间从Time.getTimeInMillis();
我得到 61175831
得到天数除以 (60 60 24)
女巫给了我 16 小时

现在是下午 1 点,所以 13+16=30 或第二天早上 6 点,而不是早上 1 点

delayTime=24*60*60*1000; // i day
Calendar Time = Calendar.getInstance(); 
long delay=TimeToNumber%delayTime;
ling days=delay/1000;
days=days/60;
days=days/60

16天了

标签: java

解决方案


在不了解您的使用场景的情况下,我无法真正评论您建议的方法是否是进行实际调度的最佳方式。但是,我可以回答如何确定直到凌晨 1:00 的毫秒数的问题。

ZonedDateTime now = ZonedDateTime.now();

LocalTime targetTime = LocalTime.parse("01:00");

ZonedDateTime targetDateTime;
if (now.toLocalTime().isBefore(targetTime)) {
    targetDateTime = now.with(targetTime);
} else {
    targetDateTime = now.plusDays(1).with(targetTime);
}

long millis = Duration.between(now, targetDateTime).toMillis();

解释

日历API 是一个遗留 API ,使用它时会遇到很多挑战和陷阱。此外,通过尝试自己进行数学计算,您会错过库自动为您处理的各种细微差别(例如夏令时转换等)。由于这些原因,我强烈建议使用较新的java.time API。

对于这个特定问题,您需要确定下一个凌晨 1:00 之前的毫秒数。如果时间在当前日期的 1:00 之前,您希望返回当前日期的 1:00。如果是 1:00 之后,您想在明天的 1:00 返回。

ZonedDateTime表示今天/明天的 1:00 是一个不错的选择,因为除了日期和时间之外,还需要一个时区来将日期时间与特定时刻相关联。

检索下一个 1:00 可以通过将当前LocalTimeLocalTime1:00 AM 的 a 进行比较来实现:

ZonedDateTime now = ZonedDateTime.now();

LocalTime targetTime = LocalTime.parse("01:00");

ZonedDateTime targetDateTime;
if (now.toLocalTime().isBefore(targetTime)) {
    targetDateTime = now.with(targetTime);
} else {
    targetDateTime = now.plusDays(1).with(targetTime);
}

这是假设您使用系统默认时区。如果您想使用不同的时区,可以在调用中指定ZonedDateTime.now()

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));

ZonedDateTime代表下一个凌晨 1:00,您可以Duration在当前时间和那个时间之间使用 a,然后获取持续时间的毫秒数:

long millis = Duration.between(now, targetDateTime).toMillis();

推荐阅读