其他分享
首页 > 其他分享> > 这是Android GregorianCalendar中的错误吗?

这是Android GregorianCalendar中的错误吗?

作者:互联网

所以,它是2015年1月26日,我在Android设备上运行以下代码;

GregorianCalendar date = new GregorianCalendar();
SimpleDateFormat df = new SimpleDateFormat();

// Set date to 4 weeks ago, and then use it for the first BETWEEN date in the above query    
date.set(GregorianCalendar.WEEK_OF_YEAR, date.get(GregorianCalendar.WEEK_OF_YEAR)-4);
System.out.println(df.format(new Date(date.getTimeInMillis())));
// Set date to 2 weeks time, and then use it for the second BETWEEN date in the above query

date.set(GregorianCalendar.WEEK_OF_YEAR, date.get(GregorianCalendar.WEEK_OF_YEAR)+6);
System.out.println(df.format(new Date(date.getTimeInMillis())));

我得到了输出;

29/12/14 10:29
09/02/14 10:29

在Windows计算机上的标准Java上运行此代码段会显示正确的结果,第二个日期为09/02/15 10:29.所以在Android上,当我们要求返回4周的日期时,它正在滚动年份,但是当我们要求它提前6周(超过我们的原始日期)时,它不会再向前推进一年.

我在5.0.2和4.4.2上观察到了这一点

所以问题是,这是一个错误还是某种错综复杂的预期行为(特征)?

解决方法:

我很确定这是计算和处理某些日历字段的复杂性,这不是一个错误.您使用算术调整而不是使用add(…)方法这一事实可能也使事情变得复杂.

来自文档……

The first week of a month or year is defined as the earliest seven day period beginning on getFirstDayOfWeek() and containing at least getMinimalDaysInFirstWeek() days of that month or year.

在这种情况下,一年的第一周,即WEEK_OF_YEAR = 1,从1月4日或5日开始,取决于一周的第一天是否分别设置为星期日或星期一.

Calendar类是抽象的,并且扩展它的具体类的不同实现可能表现不同,但允许在一年中具有0或甚至-1的索引.日期1 – >的事实第3或第1 – >第4天(取决于一周的第一天)明显落在2015年内意味着从12月28日或29日开始的一周被归类为第0周.

1月26日属于WEEK_OF_YEAR = 4(无论一周的第一天),因此当您从当前的WEEK_OF_YEAR中减去4时,它返回0并将该日期调整为该周的星期一,即12月29日.

当您在之前调整的日期添加6周时出现问题 – 此时它是2014年12月29日.正如我所说,您使用的是算术调整而不是使用add(…)方法.由于您没有手动调整年份,因此假设它应该保持在2014年之内,并且通过增加6周您导致溢出/回滚到2014年初,而不是动态调整YEAR以及WEEK_OF_YEAR等.

标签:android,debugging,gregorian-calendar
来源: https://codeday.me/bug/20190624/1275792.html