Java-查詢某年某月一個月的數據,以日歷的形式展示。


市場上有些這樣的應用,會展示某年某月一個月的數據,比如女神們經常用的“大姨媽”APP,一些游戲的用戶簽到信息,等等

那我們在寫后台接口的時候,就需要返回這一個月的數據,今天我就分享一下筆者經常在工作中使用的方法。

 

數據庫DB中存了許多用戶的應用數據,每條數據有一個日期字段,可以是Integer類型(yyyyMMdd),可以是String類型(yyyy-MM-dd),還可以是Date類型.

 

首先定義了一個這樣的類來保存某天的數據:

public class CalendarDate<T>{
    public Integer day;

    public Integer weekDay;

    public Boolean isToday;

    public T info;
}

四個字段的意思分別是:day-這個月的第幾天,weekDay-星期幾,isToday-是否是今天,info-該天的用戶數據。

請求接口如下,請求需要年和月兩個參數:

    @GetMapping("/calendar")
    public List<CalendarDate<List<String>>> calendarDates(@RequestParam Integer year, @RequestParam Integer month) {
        Function<String, Optional<List<String>>> function = day -> {
            List<String> datas = new ArrayList<>();
            datas.add(day); // DB: datas = tableMapper.findByDay(day);
            return Optional.of(datas);
        };
        return DateUtils.calendar(year, month, function);
    }

重點就是下面封裝好的工具類:

public class DateUtils {


    public static <T> List<CalendarDate<T>> calendar(int year, int month, Function<String, Optional<T>> function) {
        List<CalendarDate<T>> cdList = new ArrayList<>();
        int monthDays = monthDays(year, month);
        CalendarDate<T> cdR;
        for (int day = 1; day <= monthDays; day++) {
            cdR = new CalendarDate<>();
            cdR.day = day;
            LocalDate date = LocalDate.of(year, month, day);
            cdR.weekDay = dayOfWeek(date);
            cdR.isToday = isToday(date);
            if (function != null) {
                Optional<T> optional = function.apply(date.toString());
                if (optional.isPresent()) {
                    cdR.info = optional.get();
                }
            }
            cdList.add(cdR);
        }
        return cdList;
    }

    private static boolean isToday(LocalDate date) {
        LocalDate today = LocalDate.now();
        return date.getYear() == today.getYear() &&
                date.getMonth() == today.getMonth() &&
                date.getDayOfMonth() == today.getDayOfMonth();
    }

    private static int dayOfWeek(LocalDate date) {
        return null == date ? 0 : date.getDayOfWeek().getValue();
    }

    private static int monthDays(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DATE, 1);
        calendar.roll(Calendar.DATE, -1);
        return calendar.get(Calendar.DATE);
    }
}
View Code

針對不同的業務要求,編寫不一樣的function函數,就可以返回日歷形式的用戶數據了。

 

項目地址如下:https://github.com/cnblogs-projects/cnblogs-calendar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM