Java Calendar 两个日期之间的天数差,周数差

setFirstDayOfWeek的方法意思只对WEEK_OF_MONTH 与WEEK_OF_YEAR 有作用.

WEEK_OF_MONTH :当前Calendar日期对象是当前月的第几周.

WEEK_OF_YEAR :当前Calendar 日期对象是当前年的第几周.

程序是2009年1月31号为例子的.打印出当星期的第一天(FirstDayOfWeek)是星期天-星期六,年或月第一星期最少天数(MinimalDaysInFirstWeek)是1-7的所有组合的结果,也就是49个.

当setFirstDayOfWeek(1),星期第一天是星期天时.

1号前面的天数不算在第一周里面,如果是从星期天开始的,那么星期的最后一天是星期六.第一周只有3天.

第二周4号到10号.

第三周11号到17号.

第四周18号到24号.

第五周为25到31号.

如果设置setMinimalDaysInFirstWeek ()为1-3,那么2009年1月31号是这第月的第五周.

如果设置setMinimalDaysInFirstWeek ()为4-7,那么2009年1月31号是这第月的第四周,因为第一周不满4天,那就更加不满七天了.

相信大家都明白setFirstDayOfWeek方法的作用了吧.按照这样的算法,一个月可以算出6周来.比如一个月的1号为星期5,那么31号为星期日.setFirstDayOfWeek()为1,也就是一周从星期天开始,setMinimalDaysInFirstWeek 为1,也是就一天也算是1周.这样一个月六周就出来了.


    public static void main(String[] args) {
         Calendar cale = new GregorianCalendar(2020, 0, 4);
        System.out.println(cale.getTime().toLocaleString());

        cale.setFirstDayOfWeek(Calendar.SUNDAY);//1为星期天,7为星期六
        cale.setMinimalDaysInFirstWeek(1);
        System.out.println("bbb"+cale.get(Calendar.WEEK_OF_YEAR));


        //如果是跨年的那个月份,前一年最后几天与后一年的首月的前几天在一周内算第二年的第一周
        cale = new GregorianCalendar(2019, 11, 29);
        System.out.println(cale.getTime().toLocaleString());

        cale.setFirstDayOfWeek(Calendar.SUNDAY);//1为星期天,7为星期六
        cale.setMinimalDaysInFirstWeek(1);
        System.out.println("bbb"+cale.get(Calendar.WEEK_OF_YEAR));



        //FirstDayOfWeek默认为周日  MinimalDaysInFirstWeek为1天
        Calendar startCalendar = Calendar.getInstance();
        System.out.println("aaa"+startCalendar.getFirstDayOfWeek()+"   " + startCalendar.getMinimalDaysInFirstWeek());


//        System.out.println("bbb"+cale.getActualMaximum(java.util.Calendar.WEEK_OF_YEAR));
      

        
    }
 public static void main(String[] args) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date date1 = sdf.parse("2020-04-12");
        Date date2 = sdf.parse("2020-04-26");

        int dayOffset = calcDayOffset(date1, date2);
        System.out.println("dayOffset:" + dayOffset);

        int weekOffset = calcWeekOffset(date1, date2);
        System.out.println("weekOffset:" + weekOffset);
    }


    /**
     * date2比date1多的天数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int calcDayOffset(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);

        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);

        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
        if (year1 != year2) {  //同一年
            int timeDistance = 0;
            for (int i = year1; i < year2; i++) {
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {  //闰年
                    timeDistance += 366;
                } else {  //不是闰年

                    timeDistance += 365;
                }
            }
            return timeDistance + (day2 - day1);
        } else { //不同年
            return day2 - day1;
        }
    }

    /**
     * date2比date1多的周数
     * @param startTime
     * @param endTime
     * @return
     */
    public static int calcWeekOffset(Date startTime, Date endTime) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(startTime);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        dayOfWeek = dayOfWeek - 1;
        if (dayOfWeek == 0) dayOfWeek = 7;

        int dayOffset = calcDayOffset(startTime, endTime)+1;

        int weekOffset = dayOffset / 7;
        int a;
        if (dayOffset > 0) {
            a = (dayOffset % 7 + dayOfWeek > 7) ? 1 : 0;
        } else {
            a = (dayOfWeek + dayOffset % 7 < 1) ? -1 : 0;
        }
        weekOffset = weekOffset + a;
        return weekOffset;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 一、介绍 我们可以使用Date来取得完整的日期时间显示,但如果您想要单独取得某个时间或日期资讯的话该如何? 这个时...
    走着别浪阅读 300评论 0 1
  • 时间的的力道十足却从不显山漏水,真正厉害的地方在于不知不觉间重塑每一个人,即便是让人变成自己讨厌的模样都不曾...
    蓝潭星海阅读 212评论 2 3
  • 像数值方程那样,争论可能是复杂的,也可能是简单的。就像一个数值方程中的总和可能由许多数字组成(342+186+...
    sxrunn阅读 294评论 0 1
  • 这次语文考试又考的不好,吃饭的时候妈妈让我找出原因,我说不上来。妈妈要求我以后上课要注意听讲,认真主动完成...
    侯春晓hcx阅读 411评论 0 0
  • 收到了小妍的微信,她说她现在不想干了,她的主任处处挤兑她,她和她主任已经闹僵了,她说,心里很烦很不开心,不想再干...
    蔷薇花间阅读 243评论 5 6