JAVA-查詢某年某月一個月的資料,以日曆的形式展示。
阿新 • • 發佈:2018-11-16
市場上有些這樣的應用,會展示某年某月一個月的資料,比如女神們經常用的“大姨媽”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函式,就可以返回日曆形式的使用者資料了。