Подтвердить что ты не робот

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. Как мне это сделать?

4b9b3361

Ответ 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)

Я также считаю плохой идеей представлять интервал конца недели с небольшим количеством времени до фактического, эксклюзивного окончания. Лучше рассматривать начало как включающее, а конец как исключительное (при сравнении и т.д.).