我必须将UTC中的秒转换为天,然后添加一天的间隔并返回UTC中的秒。
我有:
选项# 1
public static final long nextDayStartSec(long epochSecondsInUTC) {
return (epochSecondsInUTC / TimeUnit.DAYS.toSeconds(1) + 1) * TimeUnit.DAYS.toSeconds(1);
}
但不是所有的天都有86400秒,根据维基百科:
现代Unix时间基于UTC,它使用SI秒计算时间,并将时间划分为天几乎总是86400秒长,但由于闰秒偶尔86401秒。
选项# 2
public static final long nextDayStartSec(long epochSecondsInUTC) {
return DateUtils.addMilliseconds(DateUtils.round(new Date(TimeUnit.SECONDS.toMillis(epochSecondsInUTC)), Calendar.DATE), -1)
.toInstant().atZone(systemDefault()).toLocalDateTime().toEpochSecond(ZoneOffset.UTC);
}
但是它使用了广泛的库(包括Apache Commons)并且很难阅读。
有什么简单的我错过了吗?
如果您使用Java 8,新的时间API允许您这样写(它在给定的瞬间增加一天):
public static final long nextDayStartSec(long epochSecondsInUTC) {
OffsetDateTime odt = Instant.ofEpochSecond(epochSecondsInUTC).atOffset(ZoneOffset.UTC);
return odt.plusDays(1).toEpochSecond();
}
如果你想要得到第二天开始的时间,它可以是这样的:
public static final long nextDayStartSec(long epochSecondsInUTC) {
OffsetDateTime odt = Instant.ofEpochSecond(epochSecondsInUTC).atOffset(ZoneOffset.UTC);
return odt.toLocalDate().plusDays(1).atStartOfDay(ZoneOffset.UTC).toEpochSecond();
}