2016-12-17 51 views
0

这里是我的代码:错误WEEK_OF_MONTH和DAY_OF_MONTH返回

Calendar c = new GregorianCalendar(); 
c.setFirstDayOfWeek(Calendar.MONDAY); 
c.set(Calendar.WEEK_OF_YEAR, selectedWeek); 
c.set(Calendar.YEAR, selectedYear); 

Log.v(FILE_NAME,"C content: " + c.toString()); 

int firstDayOfWeek = c.getFirstDayOfWeek(); 
String[] days = new String[firstDayOfWeek + 7]; 

for (int i = firstDayOfWeek; i < firstDayOfWeek + 7; i++) { 
    c.set(Calendar.DAY_OF_WEEK, i); 
    days[i] = new SimpleDateFormat("d MMM").format(c.getTime());    
} 

Log.v(FILE_NAME, "Start " + days[firstDayOfWeek] + " to " + days[firstDayOfWeek + 6]); 

我设置selectedWeek 51,selectedYear至2016年。所以,我的期望是,因为我已经给了周和年份,在我的最后Log.v,我应该得到给定的一周(51),即12月19日至12月25日的日期列表。相反,我会一直获得本周的日期(例如,目前我总是会得到12月12日至12月18日)

显示C的内容给我

java.util.GregorianCalendar[time=?,areFieldsSet=false,lenient=true,zone=Asia/Kuala_Lumpur,firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=11,WEEK_OF_YEAR=52,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=353,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=1,HOUR_OF_DAY=1,MINUTE=24,SECOND=46,MILLISECOND=30,ZONE_OFFSET=28800000,DST_OFFSET=0] 

看来WEEK_OF_MONTH返回CURRENT WEEK_OF_MONTH,而不是给定的selectedWeek和selectedYear。 DAY_OF_MONTH也一样。我的假设是DAY_OF_MONTH至少应该返回给定selectedWeek的开始日期?

我理解错了吗?如果我这样做了,我应该怎么做才能让[dayDayOfWeek]返回给定的一周和一年中的第一天?

+0

尝试初始化压延当前日期,然后修改它,U可能无法提供所有的值,使像时间等 '日历C = Calendar.getInstance()日程表;' –

+0

@AbrahamGharyali我不”吨得到你的意思我可能不会提供所有的价值,使日历像时间。我已经提供了一周和一年,这是我拥有的唯一价值。顺便说一句我没有'日历c = Calendar.getInstance();'但它不会改变任何东西。 – imin

+0

试着'c.setMinimalDaysInFirstWeek(4);'实现ISO-8601的星期日期配置。仅定义第一个星期几是不够的。并且由于Android-API级别24,还有一个方法[setWeekDate](https://developer.android.com/reference/java/util/GregorianCalendar.html#setWeekDate)应该是首选的(在范围内表示这不是很漂亮的API--有更好的时间库)。 –

回答

1

我想我找出了问题所在。问题是当您设置Calendar.DAY_OF_WEEK时,日历会自行重置,并将星期几更改为您正在设置的日期。 因此,为了使您的代码正常工作,您必须在for循环中设置Calendar.WEEK_OF_YEAR

for (int i = firstDayOfWeek; i < firstDayOfWeek + 7; i++) { 
      c.set(Calendar.DAY_OF_WEEK, i); 
      c.set(Calendar.WEEK_OF_YEAR, selectedWeek); 
      days[i] = new SimpleDateFormat("d MMM").format(c.getTime()); 
     } 
+0

我决定使用JodaTime库,而不是这个默认库来获得我所需要的。尽管如此,我试过你的解决方案,它的作品。谢谢 – imin