关于GregorianCalendar这个类

i風 2018-05-31 02:03:45
刚开始是2017-8-31,然后我连续加了3次,一次加3个月,前两个次输出的是正确的但是为啥到第三次出现了28天这种问题?
是因为经过了2月导致的?试了一下将第一次改成+6然后第二次与第三次都变成了28天?哪位大神指导这是什么问题吗?如何解决?

Calendar cal = new GregorianCalendar();
LogUtils.e(DateUtils.StringToDateString(in.BuyTime));//2017-8-31
cal.setTime(DateUtils.Parse2Date(DateUtils.StringToDateString(in.BuyTime),"yyyy-MM-dd"));
//当前月份+3个月
cal.add(Calendar.MONTH, +3);
long date3 = (cal.getTimeInMillis()-dateNow.getTime() );
Log.e("TAG",cal.getTimeInMillis()+"");//2017-11-30 00:00:00
cal.add(Calendar.MONTH, +3);
long date6 = (cal.getTimeInMillis()-dateNow.getTime() );
Log.e("TAG",cal.getTimeInMillis()+"");//2018-02-28 00:00:00
cal.add(Calendar.MONTH, +3);
long date9 = (cal.getTimeInMillis()-dateNow.getTime());
Log.e("TAG",cal.getTimeInMillis()+"");//2018-05-28 00:00:00
...全文
1504 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿飞__ 2018-06-09
  • 打赏
  • 举报
回复
引用 5 楼 Hard_F 的回复:
[quote=引用 4 楼 afei__ 的回复:]
    /**
     * After adjustments such as add(MONTH), add(YEAR), we don't want the
     * month to jump around.  E.g., we don't want Jan 31 + 1 month to go to Mar
     * 3, we want it to go to Feb 28.  Adjustments which might run into this
     * problem call this method to retain the proper month.
     */
    private final void pinDayOfMonth() {
        int year = internalGet(YEAR);
        int monthLen;
        if (year > gregorianCutoverYear || year < gregorianCutoverYearJulian) {
            monthLen = monthLength(internalGet(MONTH));
        } else {
            GregorianCalendar gc = getNormalizedCalendar();
            monthLen = gc.getActualMaximum(DAY_OF_MONTH);
        }
        int dom = internalGet(DAY_OF_MONTH);
        if (dom > monthLen) {
            set(DAY_OF_MONTH, monthLen);
        }
    }
这是GregorianCalendar源码里的描述,当1月31,加一个月时,是希望跳到的就是2月28。其次,代码逻辑里面有这样的判断,monthLen 是一个月的最大天数,但 dom > monthLen 时,当月的天数就被设为最大天数了,避免出现2月31这样的情况。 这样理解了吧
那这样该怎么使日期正常显示呢,就经过2月后3月或5月,让其正常显示?[/quote] 那只能自己去判断天数了。系统代码里的逻辑就是,你1月31号加一个月,这里的一个月刚好是2月,2月只有28天,就是2月28了,2月28加一个月,肯定是3月28,不可能给你涨到3月31。 你想要都是每个月的最大天数,就只能自己去根据 dayOfMonth 这个值去自己修改了
i風 2018-06-08
  • 打赏
  • 举报
回复
引用 4 楼 afei__ 的回复:
    /**
     * After adjustments such as add(MONTH), add(YEAR), we don't want the
     * month to jump around.  E.g., we don't want Jan 31 + 1 month to go to Mar
     * 3, we want it to go to Feb 28.  Adjustments which might run into this
     * problem call this method to retain the proper month.
     */
    private final void pinDayOfMonth() {
        int year = internalGet(YEAR);
        int monthLen;
        if (year > gregorianCutoverYear || year < gregorianCutoverYearJulian) {
            monthLen = monthLength(internalGet(MONTH));
        } else {
            GregorianCalendar gc = getNormalizedCalendar();
            monthLen = gc.getActualMaximum(DAY_OF_MONTH);
        }
        int dom = internalGet(DAY_OF_MONTH);
        if (dom > monthLen) {
            set(DAY_OF_MONTH, monthLen);
        }
    }
这是GregorianCalendar源码里的描述,当1月31,加一个月时,是希望跳到的就是2月28。其次,代码逻辑里面有这样的判断,monthLen 是一个月的最大天数,但 dom > monthLen 时,当月的天数就被设为最大天数了,避免出现2月31这样的情况。 这样理解了吧
那这样该怎么使日期正常显示呢,就经过2月后3月或5月,让其正常显示?
阿飞__ 2018-06-04
  • 打赏
  • 举报
回复
    /**
     * After adjustments such as add(MONTH), add(YEAR), we don't want the
     * month to jump around.  E.g., we don't want Jan 31 + 1 month to go to Mar
     * 3, we want it to go to Feb 28.  Adjustments which might run into this
     * problem call this method to retain the proper month.
     */
    private final void pinDayOfMonth() {
        int year = internalGet(YEAR);
        int monthLen;
        if (year > gregorianCutoverYear || year < gregorianCutoverYearJulian) {
            monthLen = monthLength(internalGet(MONTH));
        } else {
            GregorianCalendar gc = getNormalizedCalendar();
            monthLen = gc.getActualMaximum(DAY_OF_MONTH);
        }
        int dom = internalGet(DAY_OF_MONTH);
        if (dom > monthLen) {
            set(DAY_OF_MONTH, monthLen);
        }
    }
这是GregorianCalendar源码里的描述,当1月31,加一个月时,是希望跳到的就是2月28。其次,代码逻辑里面有这样的判断,monthLen 是一个月的最大天数,但 dom > monthLen 时,当月的天数就被设为最大天数了,避免出现2月31这样的情况。 这样理解了吧
阿飞__ 2018-06-04
  • 打赏
  • 举报
回复
假设你现在已经变成 02-28 了,再加3个月就是 05-28 呀
i風 2018-06-04
  • 打赏
  • 举报
回复
引用 1 楼 afei__ 的回复:
没有 2018-02-30 00:00:00 ,而且 2018 年也不是闰年,所以就变成 2018-02-28 00:00:00 了
关键不在于2月,实在二月后面的五月!为啥就28天
阿飞__ 2018-06-03
  • 打赏
  • 举报
回复
没有 2018-02-30 00:00:00 ,而且 2018 年也不是闰年,所以就变成 2018-02-28 00:00:00 了

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧