Calendar根据日期获取年份和周、当前周的所有日期

1、Calendar根据日期获取年份和周

直接上代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class CalendarTest {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        getYearAndWeek(cal.getTime());

    }

    /**
     * 获取日期所在的年和周
     * @param date
     * @return
     */
    public static WeekYear getYearAndWeek(Date date) {
        Calendar calendar = Calendar.getInstance();
        // 设置一周的第一天为周一
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.setTime(date);
        int week = calendar.get(Calendar.WEEK_OF_YEAR);
        int year = calendar.get(Calendar.YEAR);
        // 处理跨年
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        int yearBefore = calendar.get(Calendar.YEAR);
        int weekBefore = calendar.get(Calendar.WEEK_OF_YEAR);
        if (week < weekBefore) {
            yearBefore += 1;
            year = yearBefore;
        }
        System.out.println(year + "年第" + week + "周");
        return new WeekYear(year, week);
    }
}


class WeekYear {
    private Integer year;
    private Integer week;

    public WeekYear(Integer year, Integer week) {
        this.year = year;
        this.week = week;
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public Integer getWeek() {
        return week;
    }

    public void setWeek(Integer week) {
        this.week = week;
    }

    @Override
    public String toString() {
        return "WeekYear{" +
                "year=" + year +
                ", week=" + week +
                '}';
    }
}

运行结果:

2020年第50周


如果想获取过去2周和未来四周的年份和日期,代码如下:

public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
    
        List<WeekYear> wys = new ArrayList<>(8);
        cal.add(Calendar.DATE, -14);
        wys.add(getYearAndWeek(cal.getTime()));

        for (int i = 0; i < 6; i++) {
            cal.add(Calendar.DATE, +7);
            wys.add(getYearAndWeek(cal.getTime()));
        }

    }

运行结果如下:

2020年第48周
2020年第49周
2020年第50周
2020年第51周
2020年第52周
2021年第1周
2021年第2周


这里我们设置一周的第一天为周一,上面的结果可以看出第三周时跨年了,测试时会发现2020-12-28 Calendar返回的是周是1,但是2020年,所以这里需要特殊处理下,应该是2021年第一周。

 

2、当前周的所有日期

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class CalendarTest {

    /**
     * 获取日期所在周的所有日期
     * @param date
     * @return
     */
    public static List<String> getWeekDays(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<String> list = new ArrayList<>();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        list.add(sdf.format(cal.getTime()));
        for (int i = 1; i < 7; i++) {
            cal.add(Calendar.DAY_OF_MONTH, 1);
            list.add(sdf.format(cal.getTime()));
        }
        return list;
    }

    public static void main(String[] args) throws ParseException {

        System.out.println(getWeekDays(new Date()));

    }

   
}

输出结果:

[2020-12-07, 2020-12-08, 2020-12-09, 2020-12-10, 2020-12-11, 2020-12-12, 2020-12-13]

 

再验证获取2020-12-28所在周的所有日期

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse("2020-12-28"));
        System.out.println(getWeekDays(cal.getTime()));

    }

输出结果:

[2020-12-28, 2020-12-29, 2020-12-30, 2020-12-31, 2021-01-01, 2021-01-02, 2021-01-03]

 

以上在做日历和排班时可以用得到,本实例用的是Calendar类实现的功能,JDK8中LocalDate也可以实现,大家有兴趣可以去尝试!

 

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值