Jodatime начало дня и конца дня
Я хочу создать интервал между началом недели и концом текущей недели.
У меня есть следующий код, заимствованный из этого ответа:
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. Как мне это сделать?
Ответы
Ответ 1
Как насчет:
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);
}
Ответ 2
Вы можете использовать метод withTime
:
d.withTime(0, 0, 0, 0);
d.withTime(23, 59, 59, 999);
То же, что Питер отвечает, но короче.
Ответ 3
также простой способ
d.millisOfDay().withMaximumValue();
Ответ 4
Для тех, кто приезжает сюда в поисках ответа на вопрос "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"
Ссылки: https://js-joda.github.io/js-joda/class/src/LocalDate.js~LocalDate.html#instance-method-atStartOfDayWithZone
Ответ 5
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)
Я также считаю плохой идеей представлять интервал конца недели с небольшим количеством времени до фактического, эксклюзивного окончания. Лучше рассматривать начало как включающее, а конец как исключительное (при сравнении и т.д.).