Java日历添加不递增的年份

Java日历添加不递增的年份,java,android,calendar,Java,Android,Calendar,我有一个存储周开始日期的变量,但当我从2012年前进到2013年时,它不会更新年份 日和月添加正确,因此它正确地从12月26日到01月2日,但保持为2012年 // roll one week forward Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(mPrefsHelper.getWeekStart()); cal.add(Calendar.WEEK_OF_YEAR, 1); 来自 Calendar使用两个参数定义特

我有一个存储周开始日期的变量,但当我从2012年前进到2013年时,它不会更新年份

日和月添加正确,因此它正确地从12月26日到01月2日,但保持为2012年

// roll one week forward
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mPrefsHelper.getWeekStart());
cal.add(Calendar.WEEK_OF_YEAR, 1);
来自

Calendar使用两个参数定义特定于区域设置的七天工作周:一周中的第一天和第一天中的最短天数 一周(从1日到7日)。这些数字取自区域设置资源 构建日历时的数据。也可以指定它们 通过设置其值的方法显式执行

设置或获取“月中的周”或“年中的周”字段时,日历必须将该月或年的第一周确定为 参考点。一个月或一年的第一周被定义为 从getFirstDayOfWeek()开始的最早七天期间,以及 至少包含该月的getMinimalDaysInFirstWeek()天,或 一年。周编号…,-1,第一周之前为0;周数 2, 3,... 跟着它走。请注意,由 get()可能不同。例如,特定的日历子类可能 将一年中第1周之前的一周指定为前一周的第n周 一年


它是特定于区域设置的。在您的情况下,如果一周包含从新年开始的几天,那么它将被视为从新年开始的第一周。

抱歉,感谢您的回复。我的问题特定于我的代码,在某个时候我正在这样做:

mCalendar.clear();
mCalendar.setFirstDayOfWeek(Calendar.MONDAY);
mCalendar.set(Calendar.WEEK_OF_YEAR, week);
mCalendar.set(Calendar.YEAR, year);
并使用我从之前代码中获得的日期获得的值

所以它得到了一个日期(比如1月2日星期三),一周为1,一年为2013。它清除日历并正确设置周和年,但是我又调用了这个位,不知怎么的,它将年设置为2012年。在大多数情况下,我基本上都删除了这段代码,现在可以正常工作了。

tl;博士 使用ThreeTen Extra library中的
YearWeek

java.time 现代方法使用java.time类,这些类取代了几年前麻烦的遗留日期时间类,如
日历

LocalDate
对于仅限日期的值,不带时间和时区,请使用
LocalDate

LocalDate localDate = LocalDate.of( 2012 , Month.DECEMBER , 26 ) ;
一周的第二天 我们使用一个移动到另一个日期。在类中可以找到几个实现。我们需要
next
来查找一周中某一天的下一个日期

TemporalAdjuster ta = TemporalAdjusters.next( DayOfWeek.WEDNESDAY ) ;
应用它来获得下一个日期

LocalDate nextWednesday = localDate.with( ta ) ;
nextWednesday.toString():2013-01-02

是的,我们确实看到2012年过渡到2013年

看这个

年周 如果你想在一年中的第几周找到一个日期,那就更复杂了。你必须定义你所说的星期是什么意思。第一周包括一月一日吗?或者第一周是从新年开始的第一周吗?或者,在新的一年里,我有一周中的某一天吗

ISO 8601标准周 该标准将第一周定义为新年的第一个星期四。因此,以周为基础的一年有52周或53周,运行于周一至周日,可能以上一个/下一个日历年的天数开始/结束

如果这满足了您的需要,我建议将ThreeTen额外的库添加到您的项目中。这给了你上课的机会

从那一周算起一天

LocalDate ld = ywNext.atDay( DayOfWeek.MONDAY ) ;
要获取任何本地日期后基于周的年份第一周的第一天,请执行以下操作:

LocalDate ld = 
    YearWeek
    .of( someLocalDate )
    .plusYears( 1 )
    .withWeek( 1 )
    .atDay( DayOfWeek.MONDAY ) 
; 

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(如果检查/调试
      mPrefsHelper.getWeekStart()的值会更好。
      。如果检查/打印/调试
      mPrefsHelper.getWeekStart()的值会更好)
      method.FYI,存在严重缺陷的日期-时间类,如,
      java.text.simpleDataFormat
      现在被java 8和更高版本中内置的类所取代。
      YearWeek yw = YearWeek.from( LocalDate.of( 2012 , Month.DECEMBER , 26 ) ) ;
      YearWeek ywNext = yw.plusWeeks( 1 ) ;
      
      LocalDate ld = ywNext.atDay( DayOfWeek.MONDAY ) ;
      
      LocalDate ld = 
          YearWeek
          .of( someLocalDate )
          .plusYears( 1 )
          .withWeek( 1 )
          .atDay( DayOfWeek.MONDAY ) 
      ;