添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
输入一个字符日期,通过Calendar 获取 到日期对应的周数及 周所在的年份
特别是跨年的情况:
先贴代码
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cl = Calendar.getInstance();
cl.setTime(sdf.parse("2012-12-31"));
int week = cl.get(Calendar.WEEK_OF_YEAR);
System.out.println(week);

结果是 1 这个没有疑问.
这个1 明显是2013年的第一周 我怎样也能获取到 2013呢

直接通过 cl.ge(Calendar.YEAR);  得到2012

想要的结果其实 是:
输入2012-12-31
能得到 是 2013 年 的第 1 周

采纳的答案

这是Calendar的内部机制的问题,根据正常的逻辑,它是没有错的,你想得到2013年第1周,应该去做一下判断,因为2012-12-31确实是2012年,它不是2013年,所以要做一下处理,得到周数之后,可以根据7天前的周数来做一下对比,如果7天前的周数小于当日周数,则表示为正常周数和正常年份,如果7天前的周数大于当日周数,表示当日在年尾,并且当日周数被计算在下一年,此时要在得到的年份是+1,下边是代码,你自己看看理解一下吧。

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
		Calendar cl = Calendar.getInstance(); 
		cl.setTime(sdf.parse("2012-12-31")); 
		int week = cl.get(Calendar.WEEK_OF_YEAR); 
		System.out.println(week); 
		cl.add(Calendar.DAY_OF_MONTH, -7);
		int year = cl.get(Calendar.YEAR);
		if(week<cl.get(Calendar.WEEK_OF_YEAR)){
			year+=1;
		System.out.println(year+"年第"+week+"周"); 
    
2012年12月29日 08:39
shuaijie506

int year = 0;
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.setTime(date);
        int weekNo = calendar.get(Calendar.WEEK_OF_YEAR);
        int year1 = calendar.get(Calendar.YEAR); 
        calendar.add(Calendar.DAY_OF_MONTH, -7); 
        int year2 = calendar.get(Calendar.YEAR); 
        int weekBefore = calendar.get(Calendar.WEEK_OF_YEAR);
        if(weekNo<weekBefore){ 
            year2+=1;
            year = year2;
        }else{
        year = year1;
        }
        System.out.println(year+"年第"+weekNo+"周");

2019年1月18日 17:25
以king之名

这个week_of_year和两个值有关。
firstDayOfWeek: 用周几作为一周的第一天,我们默认的是SUNDAY,德国的是周三(这个和本地化有关)
minimalDaysInFirstWeek: 一年的第一周用几号开始算

System.out.println(cl.getFirstDayOfWeek()); //SUNDAY
System.out.println(cl.getMinimalDaysInFirstWeek());//1

打印出来的结果是从周日开始做为1周的开始,新年的第一天从1号开始。

2012年最后几天的日历如下:

周日  1   2   3   4   5   6  

30号  31  1[size=medium][/size]   2   3   4   5

新年的第一天是1号(minimalDaysInFirstWeek)在周二,一周必须由7天组成,又是从周日(firstDayOfWeek)开始算起,所以30,31都属于第1周就等到了楼主说的结果。

要跟这个原理可以分别修改这两个属性可以提到不同的结果。
方法1:
cl.setFirstDayOfWeek(Calendar.TUESDAY);

修改每周从周二开始,而周2正好是1号,所以12-31的week值为53
方法2:
cl.setMinimalDaysInFirstWeek(6);

修改新年从6号开始算起,6号正好是周日,一周的开始,所以6号前的7天的week值都是53.
2012年12月28日 22:50
Bo6Bear