踩坑 calendar.getActualMaximum(calendar.DAY_OF_MONTH)函数

本文解决了在使用Java的Calendar类获取每月最后一天,特别是在二月时遇到的日期不准确的问题。提供了两种替代方法来准确获取上个月和上一季度的最后一天,避免了程序异常。

当使用calendar.getActualMaximum(calendar.DAY_OF_MONTH)获取每月最后一天时或者获取当季的最后一天时,会出现在二月的时候获取的不准确的情况

问题出现原因:

代码没有动过,之前一直是使用这个时间函数来进行获取上个月的最后一天,但是突然有一天获取的上月(主要问题出现在二月份)最后一天的日期不准,导致程序出现异常。

解决办法:

使用其它方式获取上月(上季)最后一天(代码如下):

//获取上个季度的最后一天
    public static String getLastDayOfLastQuarter() {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.set(Calendar.MONTH, ((int) endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2);
        endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return sf.format(endCalendar.getTime());
    }

    //获取上月的最后一天日期
    public static String getLastDayOfLastMonth(){

        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");

//        Calendar calendar=Calendar.getInstance();
//
//        int month=calendar.get(Calendar.MONTH);
//
//        calendar.set(Calendar.MONTH, month-1);
//
//        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));


        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.DATE, -1);

        return sf.format(calendar.getTime());

    }```

第一个onCalendarRefresh和第二onCalendarRefresh的功能是相似的吗 保留第一个的物理名,尽可能在不改变最终效果的情况下按照第二个onCalendarRefresh改写 fun onCalendarRefresh( lblMonthScrollYearMonth: String, combDay: Int ): CalendarData { val yearMonthCal = DateUtils.parseFormatToCalendar( DateUtils.TYPE_12, lblMonthScrollYearMonth ) ?: Calendar.getInstance() // 1.3.2 インデント曜日を計算する。 val firstDayCal = (yearMonthCal.clone() as Calendar).apply { set(Calendar.DAY_OF_MONTH, 1) } val firstDayOfWeek = firstDayCal.get(Calendar.DAY_OF_WEEK) //  内部変数.当月1日目に対応する曜日 val firstYoubiTmp = when (firstDayOfWeek) { Calendar.SUNDAY -> "日" Calendar.MONDAY -> "月" Calendar.TUESDAY -> "火" Calendar.WEDNESDAY -> "水" Calendar.THURSDAY -> "木" Calendar.FRIDAY -> "金" Calendar.SATURDAY -> "土" else -> "日" } // 1.3.2 インデント曜日を計算する。 val lastDayCal = (yearMonthCal.clone() as Calendar).apply { set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH)) } val lastDayOfWeek = lastDayCal.get(Calendar.DAY_OF_WEEK) //  内部変数.当月最終日に対応する曜日 val lastYoubiTmp = when (lastDayOfWeek) { Calendar.SUNDAY -> "日" Calendar.MONDAY -> "月" Calendar.TUESDAY -> "火" Calendar.WEDNESDAY -> "水" Calendar.THURSDAY -> "木" Calendar.FRIDAY -> "金" Calendar.SATURDAY -> "土" else -> "日" } // 1.3.3 当月総日数 val yearTotalTmp = yearMonthCal.getActualMaximum(Calendar.DAY_OF_MONTH) // 先頭行空白マス数 val firstBlankCountTmp = when (firstYoubiTmp) { "日" -> 1 "月" -> 2 "火" -> 3 "水" -> 4 "木" -> 5 "金" -> 6 "土" -> 7 else -> 1 } - InputControlType.NUM_1 // 1.3.5 カレンダー入力領域を生成する。 val gridData = mutableListOf<List<CalendarDayData>>() var currentDay = 1 for (row in 0 until 6) { val rowData = mutableListOf<CalendarDayData>() for (col in 0 until 7) { // 1.3.5.1 先頭行のインデントをする。 if (row == 0 && col < firstBlankCountTmp) { rowData.add( CalendarDayData( day = 0, isCurrentMonth = false, isEnabled = false, backgroundColor = "#FFFFFF" ) ) } // 1.3.5.2 日付を埋め込む else if (currentDay <= yearTotalTmp) { rowData.add( CalendarDayData( day = currentDay, isCurrentMonth = true, isSelected = currentDay == combDay, isEnabled = true, backgroundColor = if ( currentDay == combDay ) { "#CEDFFF" } else { "#88B0FF" } ) ) currentDay++ } // 1.3.5.4 最終行のインデント else { rowData.add( CalendarDayData( day = 0, isCurrentMonth = false, isEnabled = false, backgroundColor = "#FFFFFF" ) ) } } gridData.add(rowData) } return CalendarData( firstYoubi = firstYoubiTmp, lastYoubi = lastYoubiTmp, yearTotal = yearTotalTmp, firstBlankCount = firstBlankCountTmp, lastBlankCount = firstBlankCountTmp, gridData = gridData ) } private fun onCalendarRefresh(yearMonthParam: String, selectedDayParam: Int? = 0) { val dayTmp = selectedDayParam // インデント曜日計算 // 当月1日目に対応する曜日 val firstYoubiTmp = Calendar.getInstance().set( yearMonthParam.substring(0, 4).toInt(), yearMonthParam.substring(4, 6).toInt() - 1, 1 ).toString() // 当月最終日に対応する曜日 val lastYoubiTmp = Calendar.getInstance() .add(Calendar.DAY_OF_MONTH, -1).toString() // インスタンス変数.年月の月の総日数計算 val yearTotalTmp = Calendar.getInstance() .getActualMaximum(Calendar.DAY_OF_MONTH) // カレンダー入力領域生成 // 先頭行のインデントをする。 val firstBlankCountTmp = youbiArray .find { it[0] == firstYoubiTmp }?.get(2)?.toInt()?.minus(1) ?: 0 val grid = mutableListOf<List<CalendarDayData>>() var currentDay = 1 for (row in 0 until 6) { val rowData = mutableListOf<CalendarDayData>() for (col in 0 until 7) { val cellIndex = row * 7 + col when { // 先頭の空白マス cellIndex < firstBlankCountTmp -> { rowData.add( CalendarDayData( day = 0, isCurrentMonth = false, isEnabled = false, backgroundColorDay = "#FFFFFF", backgroundColorNight = "#2A3489" ) ) } // 該当月の日付 currentDay <= yearTotalTmp -> { rowData.add( CalendarDayData( day = currentDay, isCurrentMonth = true, isSelected = currentDay == dayTmp, isEnabled = true, backgroundColorDay = if (currentDay == dayTmp) { "#CEDFFF" } else { "#88B0FF" }, backgroundColorNight = if (currentDay == dayTmp) { "#D5D4DF" } else { "#191F53" } ) ) currentDay++ } else -> { break } } } grid.add(rowData) } // 最終行のインデント val lastBlankCountTmp = 7 - ( youbiArray.find { it[0] == lastYoubiTmp }?.get(2)?.toInt() ?: 0 ) val rowData = mutableListOf<CalendarDayData>() for (col in 0 until 7) { when { // 末尾の空白マス col < lastBlankCountTmp -> { rowData.add( CalendarDayData( day = 0, isCurrentMonth = false, isEnabled = false, backgroundColorDay = "#FFFFFF", backgroundColorNight = "#2A3489" ) ) } } } grid.add(rowData) updateSuccess { it.copy( lblDay = "", calendarData = CalendarData( firstYoubi = firstYoubiTmp, lastYoubi = lastYoubiTmp, yearTotal = yearTotalTmp, firstBlankCount = firstBlankCountTmp, lastBlankCount = lastBlankCountTmp, gridData = grid ), ) } }
最新发布
11-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值