>我有两个时间戳。(开始和结束)可能会发生一个时间戳是从昨天开始的。如果发生这种情况,我想知道直到中午 12 点(直到一天切换到今天)之前的确切秒数,然后是其余的直到当前时间戳。也可能发生开始日期是几天前,然后我希望从一天到另一天的秒数直到今天。
我觉得这可以使用 joda 时间最有效地完成,但不知道如何完成。感谢
**Example**
Start: timestamp(yesterday 23.55)
End: timestamp(today 00.02)
Should Return:
Date of yesterday: 300 seconds
Date of today: 120 seconds.
Another example:
Start date: timestamp( day before yesterday 23.58)
End date: timestamp(00.02)
Should return:
Date of day before yesterday: 120 seconds
Yesterday: 86400 seconds
Today: 120 seconds
像这样的东西?它可以正确处理 DST 切换期间没有午夜的时区。
private static void listSecondsPerDayBetween(DateTime from, DateTime to) {
System.out.println(from.toString("yyyy-MM-dd HH:mm:ss") + " - " + to.toString("yyyy-MM-dd HH:mm:ss"));
if (! from.isBefore(to))
throw new IllegalArgumentException("Values are inverted: " + from + ", " + to);
LocalDate date = from.toLocalDate().plusDays(1);
DateTime nextMidnight = date.toDateTimeAtStartOfDay();
DateTime prev = from;
while (nextMidnight.isBefore(to)) {
Seconds seconds = Seconds.secondsBetween(prev, nextMidnight);
System.out.println(" " + prev.toString("yyyy-MM-dd") + " " + seconds.getSeconds() + " seconds");
prev = nextMidnight;
date = date.plusDays(1);
nextMidnight = date.toDateTimeAtStartOfDay();
}
Seconds seconds = Seconds.secondsBetween(prev, to);
System.out.println(" " + prev.toString("yyyy-MM-dd") + " " + seconds.getSeconds() + " seconds");
}
测试
listSecondsPerDayBetween(DateTime.parse("2016-01-31T23:55:00"),
DateTime.parse("2016-02-01T00:02:00"));
System.out.println();
listSecondsPerDayBetween(DateTime.parse("2016-02-01T09:45:00"),
DateTime.parse("2016-02-01T11:13:00"));
System.out.println();
listSecondsPerDayBetween(DateTime.parse("2016-03-11T23:55:00"),
DateTime.parse("2016-03-15T00:02:00"));
输出
2016-01-31 23:55:00 - 2016-02-01 00:02:00
2016-01-31 300 seconds
2016-02-01 120 seconds
2016-02-01 09:45:00 - 2016-02-01 11:13:00
2016-02-01 5280 seconds
2016-03-11 23:55:00 - 2016-03-15 00:02:00
2016-03-11 300 seconds
2016-03-12 86400 seconds
2016-03-13 82800 seconds
2016-03-14 86400 seconds
2016-03-15 120 seconds
请注意,由于夏令时,3 月 13 日的时间较短。
请注意,您不想要"午夜",而是想要"一天的开始" - 这是一个微妙的差异,但在某些时区,在某些日子里,没有午夜。
假设您的时间戳位于具有适当时区的DateTime
实例中:
DateTime startOfDay = end.withTimeAtStartOfDay();
if (startOfDay.isAfter(start)) {
// startOfDay is after start, meaning that start and end are on different days.
Seconds secondsBeforeSod = Seconds.secondsBetween(start, startOfDay);
Seconds secondsAfterSod = Seconds.secondsBetween(startOfDay, end);
}