Jim*_*myD 8 java time localdate
我有一种方法来查看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);
Run Code Online (Sandbox Code Playgroud)
其结果是2018-01-02,应该是2018-01-01.这怎么可能?
dav*_*xxx 12
调用方法的顺序似乎很重要.
你通过降序时间粒度(年,星期和星期几)调用它们,你得到正确的结果:
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);
Run Code Online (Sandbox Code Playgroud)
2018年1月1日
请注意,问题来源于:
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
Run Code Online (Sandbox Code Playgroud)
1 to 53根据当前年份设置周数().如果您因为未在实例中保留周数信息而更改年份,则
Java LocalDateAPI无法调整此值 ..withYear(year)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;
...
}
Run Code Online (Sandbox Code Playgroud)
所以准确地说,重要的是:
.withYear(year) 之前被调用
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |