web-dev-qa-db-ja.com

ジョダタイムの一日の始まりと終わり

週の初めから現在の週の終わりまでの間隔を作成したい。

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にしたいです。どうすればいいですか?

45
nhaarman

どうですか:

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);
}
23
Peter Svensson

withTimeメソッドを使用できます。

 d.withTime(0, 0, 0, 0);
 d.withTime(23, 59, 59, 999);

ピーターの答えと同じですが、短いです。

141
JodaStephen

また、簡単な方法は

d.millisOfDay().withMaximumValue();

82
TheRueger
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を包括的として扱い、代わりに排他的として終了することをお勧めします(比較などを行う場合)。

0

「js-joda」の答えを求めてここに来る人のために、あなたが達成したいものに応じて2つのオプションがあります

オプション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")。 NYCからロンドンの誰かに電話をしているように見せて、ロンドン人は「そうだね、どうしてこんなに早く電話するのか...真夜中の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

0
GreeneCreations