簡體   English   中英

意外的日期計算結果

[英]Unexpected date calculation result

我有一種方法來查看Java中的日歷,該日歷按年,星期幾和星期數計算日期。

現在,當我計算2017年的日期時,一切正常。 但是,當我計算2018年1月的日期時,需要2017年的日期。

我的代碼看起來像

import java.time.temporal.IsoFields;
import java.time.temporal.ChronoField;
import java.time.LocalDate;

// .....

LocalDate desiredDate = LocalDate.now()
                    .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 1)
                    .with(ChronoField.DAY_OF_WEEK, 1)
                    .withYear(2018);

其結果是2018-01-02,應該是2018-01-01。 這怎么可能?

調用方法的順序似乎很重要。
你通過降序時間粒度(年,星期和星期幾)調用它們,你得到正確的結果:

long weekNumber = 1;
long dayOfWeek = 1;
int year = 2018;

LocalDate desiredDate = LocalDate.now()
    .withYear(year)
    .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
    .with(ChronoField.DAY_OF_WEEK, dayOfWeek );

System.out.println(desiredDate);

2018年1月1日

請注意,問題來源於:

.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)

根據當前年份設置周數( 1 to 53 )。
如果您使用.withYear(year)更改年份,則Java LocalDate API無法調整此值,因為周數信息未保存在LocalDate實例中。

您確實可以在LocalDate實現中看到LocalDate實例僅由3個字段定義: yearmonthday

public final class LocalDate
        implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable {
    ...
    private final int year;
    /**
     * The month-of-year.
     */
    private final short month;
    /**
     * The day-of-month.
     */
    private final short day;
    ...
}

所以准確地說,重要的是:

.withYear(year)之前被調用

.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber);

我想提一下,還有另一個問題(?)與LocalDate。

此代碼也會產生錯誤的結果:

    int jahr = Integer.parseInt(str[0]);
    int woche = Integer.parseInt(str[1]);

    LocalDate year = LocalDate.of(jahr, 1, 1);
    LocalDate week = year.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, woche);
    LocalDate day = week.with(wochentag);
    return day;

如果將year變量的創建更改為

 LocalDate year = LocalDate.now().withYear(jahr);

代碼返回預期的結果。 看起來構建LocalDate的方式很重要。 我想在“.of()”版本中省略了時區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM