如果 withYear 设置为 2016,JodaTime 将始终更改为 2015
JodaTime will always change to 2015 if withYear set to 2016
这真让我发疯。下面的代码
DateTime dt = new DateTime()
.withYear(2014)
.withWeekOfWeekyear(52)
.withDayOfWeek(1);
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("d MMM yyyy");
String firstDayOfWeek = dateTimeFormatter.print(dt);
Log.v(FILE_NAME,"display date? " + firstDayOfWeek);
dt = new DateTime()
.withYear(2015)
.withWeekOfWeekyear(52)
.withDayOfWeek(1);
String lastDayOfWeek = dateTimeFormatter.print(dt);
Log.v(FILE_NAME,"display date? " + lastDayOfWeek);
dt = new DateTime()
.withYear(2016)
.withWeekOfWeekyear(52)
.withDayOfWeek(1);
lastDayOfWeek = dateTimeFormatter.print(dt);
Log.v(FILE_NAME,"display date? " + lastDayOfWeek);
不知何故总是输出:
display date? 22 Dec 2014
display date? 21 Dec 2015
display date? 21 Dec 2015
如你所见,最后显示的日期应该是2016年,而不是2015年。好像每次我设置withYear到2016年,它都会神奇地变成2015年。这是一个错误还是我做错了什么?我已经多次清理和重建我的项目,但输出是一样的。
方法 withYear(...)
与您的想法不同,因为它使用标准日历年而不是 ISO-8601 论文中描述的星期几日期。请比较以下两个片段。只有第二个可以满足您的需要:
DateTime dt = new DateTime().withYear(2016).withWeekOfWeekyear(52).withDayOfWeek(1);
System.out.println("joda=" + dt); // joda=2015-12-21T18:26:12.776+01:00
DateTime dt2 =
new DateTime().withWeekyear(2016).withWeekOfWeekyear(52).withDayOfWeek(1);
System.out.println("joda=" + dt2); // joda=2016-12-26T18:27:59.606+01:00
另见 documentation。日历年和基于周的年份之间的细微差别仅在年末或年初(如今天)才会明显。
详细解释了行为:
如果为今天选择 new DateTime()
,则为 2017 年 1 月 2 日,然后将日历年设置为 2016 年,结果为:2016-01-02。但是这个日期是属于 week-based-year 2015 的 week-of-year 53。第 53 周从 2015-12-28 开始,所以表达式 withWeekOfWeekyear(52)
将回到 2015-12-21 一周(你在第一种情况下观察到的)。
这真让我发疯。下面的代码
DateTime dt = new DateTime()
.withYear(2014)
.withWeekOfWeekyear(52)
.withDayOfWeek(1);
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("d MMM yyyy");
String firstDayOfWeek = dateTimeFormatter.print(dt);
Log.v(FILE_NAME,"display date? " + firstDayOfWeek);
dt = new DateTime()
.withYear(2015)
.withWeekOfWeekyear(52)
.withDayOfWeek(1);
String lastDayOfWeek = dateTimeFormatter.print(dt);
Log.v(FILE_NAME,"display date? " + lastDayOfWeek);
dt = new DateTime()
.withYear(2016)
.withWeekOfWeekyear(52)
.withDayOfWeek(1);
lastDayOfWeek = dateTimeFormatter.print(dt);
Log.v(FILE_NAME,"display date? " + lastDayOfWeek);
不知何故总是输出:
display date? 22 Dec 2014
display date? 21 Dec 2015
display date? 21 Dec 2015
如你所见,最后显示的日期应该是2016年,而不是2015年。好像每次我设置withYear到2016年,它都会神奇地变成2015年。这是一个错误还是我做错了什么?我已经多次清理和重建我的项目,但输出是一样的。
方法 withYear(...)
与您的想法不同,因为它使用标准日历年而不是 ISO-8601 论文中描述的星期几日期。请比较以下两个片段。只有第二个可以满足您的需要:
DateTime dt = new DateTime().withYear(2016).withWeekOfWeekyear(52).withDayOfWeek(1);
System.out.println("joda=" + dt); // joda=2015-12-21T18:26:12.776+01:00
DateTime dt2 =
new DateTime().withWeekyear(2016).withWeekOfWeekyear(52).withDayOfWeek(1);
System.out.println("joda=" + dt2); // joda=2016-12-26T18:27:59.606+01:00
另见 documentation。日历年和基于周的年份之间的细微差别仅在年末或年初(如今天)才会明显。
详细解释了行为:
如果为今天选择 new DateTime()
,则为 2017 年 1 月 2 日,然后将日历年设置为 2016 年,结果为:2016-01-02。但是这个日期是属于 week-based-year 2015 的 week-of-year 53。第 53 周从 2015-12-28 开始,所以表达式 withWeekOfWeekyear(52)
将回到 2015-12-21 一周(你在第一种情况下观察到的)。