我想在本周开始和本周结束之间创建一个间隔。
我有以下代码,借自this answer:
private LocalDateTime calcNextSunday(LocalDateTime d) {
if (d.getDayOfWeek() > DateTimeConstants.SUNDAY) {
d = d.plusWeeks(1);
}
return d.withDayOfWeek(DateTimeConstants.SUNDAY);
}
private LocalDateTime calcPreviousMonday(LocalDateTime d) {
if (d.getDayOfWeek() < DateTimeConstants.MONDAY) {
d = d.minusWeeks(1);
}
return d.withDayOfWeek(DateTimeConstants.MONDAY);
}
但是现在我希望周一
LocalDateTime
在00:00:00,周日LocalDateTime
在23:59:59。我该怎么做?
可以使用
withTime
方法:
d.withTime(0, 0, 0, 0);
d.withTime(23, 59, 59, 999);
与彼得的回答相同,但更短。
还有一个简单的方法是
d.millisOfDay().withMaximumValue();
怎么样:
private LocalDateTime calcNextSunday(LocalDateTime d) {
return d.withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withDayOfWeek(DateTimeConstants.SUNDAY);
}
private LocalDateTime calcPreviousMonday(final LocalDateTime d) {
return d.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).withDayOfWeek(DateTimeConstants.MONDAY);
}
使用 Kotlin 你可以写一个扩展函数:
fun DateTime.withTimeAtEndOfDay() : DateTime = this.withTime(23,59,59,999)
这将允许你写:
d.withDayOfWeek(DateTimeConstants.SUNDAY).withTimeAtEndOfDay()
对于那些来这里寻找“js-joda”答案的人,您有两种选择,具体取决于您要完成的任务
选项 1:您想在同一时区开始一天
由于您选择了根据与时区相关的即时时间来计算您的时间,因此您应该使用 ZonedDateTime:
import { ZonedDateTime, LocalDate, ZoneId, DateTimeFormatter} from "js-joda";
import 'js-joda-timezone';
const nowInNewYorkCity = ZonedDateTime.now(ZoneId.of("America/New_York"))
const startOfTodayInNYC = nowInNewYorkCity.truncatedTo(ChronoUnit.DAYS);
console.log(startOfTodayInNYC.toString()) // Prints "2019-04-15T00:00-04:00[America/New_York]"
// And if you want to print it in ISO format
console.log(startOfTodayInNYC.format(DateTimeFormatter.ISO_INSTANT)) // "2019-04-14T04:00:00Z"
选项 2:您知道您想要获得时间的确切日期
然后您可以使用 LocalDate 的以下方法来导出您想要的相对时间(即 ZonedDateTime):
atStartOfDay(): LocalDateTime
atStartOfDay(zone: ZoneId): ZonedDateTime
atStartOfDayWithZone(zone: ZoneId): ZonedDateTime
选项 3:我只想要瞬间发生的那一天
注意这个代码,你会得到它与你所在位置相关的那一天。因此,对于纽约市的人来说,它是“2019-04-14”,而对于伦敦的人来说,它是“2019-04-15”(这太棒了!)因为时间是在它所在的时间段内实际上明天在伦敦(“2019-04-15T00:00:05Z”)。假设你正在从纽约给伦敦的某人打电话,伦敦人会说,“哎呀,你为什么这么早打电话给我……现在是午夜过后 5 秒。”
import { ZonedDateTime, LocalDate, ZoneId} from "js-joda";
import 'js-joda-timezone';
const aTimeWhenLondonIsAlreadyInTomorrow = "2019-04-15T00:00:05.000Z";
const inBetweenTimeInLondon = ZonedDateTime.parse(aTimeWhenLondonIsAlreadyInTomorrow);
const inBetweenTimeInNYC = inBetweenTimeInLondon.withZoneSameInstant(ZoneId.of("America/New_York"))
const dayInLondon = inBetweenTimeInLondon.toLocalDate();
const dayInNYC = inBetweenTimeInNYC.toLocalDate();
console.log(inBetweenTimeInLondon.toString()); // "2019-04-15T00:00:05Z"
console.log(dayInLondon.toString()); // "2019-04-15"
console.log(inBetweenTimeInNYC.toString()) // "2019-04-14T20:00:05-04:00[America/New_York]"
console.log(dayInNYC.toString()); // "2019-04-14"
begin = d
// Go to previous or same Sunday
.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
// Beginning of day
.truncatedTo(ChronoUnit.DAYS)
end = d
// Go to next Sunday
.with(TemporalAdjusters.next(DayOfWeek.SUNDAY))
// Beginning of day
.truncatedTo(ChronoUnit.DAYS)
我还认为用少量时间在实际的排他性结束之前表示周末间隔是个坏主意。最好将 begin 视为包容性的,而将 end 视为独占的(在进行比较等时)。
DateTime.now().withTimeAtStartOfDay(); // start of day
DateTime.now().plusDays(1).withTimeAtStartOfDay().minusSeconds(1); // end of day