Java日历添加不递增的年份
我有一个存储周开始日期的变量,但当我从2012年前进到2013年时,它不会更新年份 日和月添加正确,因此它正确地从12月26日到01月2日,但保持为2012年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使用两个参数定义特
// 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()的值会更好。
method.FYI,存在严重缺陷的日期-时间类,如,mPrefsHelper.getWeekStart()的值会更好)
现在被java 8和更高版本中内置的类所取代。java.text.simpleDataFormat
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 ) ;