今年の週からインスタント時間

キリル:

私が取得する必要がありますInstant年の週数から時間を。今、私は昔使用していますCalendar計算時間にAPIを:

int week = 1; // week of year
final Calendar cal = new GregorianCalendar();
cal.set(0, 1, 0, 0, 0, 0); // reset calendar
cal.set(Calendar.YEAR, Year.now().getValue());
cal.set(Calendar.WEEK_OF_YEAR, week);
cal.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC));
final Instant start = cal.getTime().toInstant();
final Instant end = start.plus(Period.ofWeeks(1));

それは得ることが可能であるInstant新しいJavaタイムAPI(使用して年間の週からjava.timeパッケージ)?

オレVV:
    WeekFields wf = WeekFields.of(Locale.getDefault());

    int week = 1; // week of year

    LocalDate startDate = LocalDate.now(ZoneOffset.UTC)
            .with(wf.weekOfWeekBasedYear(), week)
            .with(wf.dayOfWeek(), 1);
    Instant startInstant = startDate.atStartOfDay(ZoneOffset.UTC).toInstant();
    LocalDate endDate = startDate.plusWeeks(1);
    Instant endInstant = endDate.atStartOfDay(ZoneOffset.UTC).toInstant();

    System.out.println("" + startInstant + " - " + endInstant);

私のロケールは、ISO週番号を使用しています。出力はここにありました:

2019-12-29T00:00:00Z - 2020-01-05T00:00:00Z

あなたが独立して、ロケールのISOの週たい場合は、設定wfWeekFields.ISOあなたには、いくつかの他の週の番号付けスキームをしたい場合は、設定wfに応じて。

他の読者が思った場合には、キリルは、次の週の最初のモーメントとして週の終わりを定義します。これは推奨されます。これは、使用したとして知られているハーフオープンの間隔を時間間隔のために。

私はまた、1が明確ではなく、このタスクのためにjava.timeを使用して好む必要があることを疑問に同意しますCalendarCalendar設計が不十分と長い時代遅れ、と私はjava.timeを使用してコードを読み取ることが明確であると信じています。

さらに、問題のコード使用は、Calendar週の最初の日に日を設定しないので、その日のあなたを与えることはありません。私がテストしていないながら、私はコードが時々新年の周りに予期しない結果をもたらすだろうと思われます。

使用して私のコードWeekFieldsjava.timeからは、現在の範囲内にとどまる週ベース年暦年と同じではありませんこれは、。私は2019年12月30日にそれを実行した場合、我々はその週にすでにあったため、例えば、それはまだ2020年のmedの週1を与えているだろう。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=464470&siteId=1