[英]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個字段定義: year
, month
和day
。
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.