前端js到後端Java的時間格式接收轉換
以及java判斷跨日的時間

前後端傳送、接收時間格式

  • java的原始Date類是iso-8601的格式(2004-05-03T17:30:08Z),UTC時間。或是接收Long的時間戳,像這樣1662084454350
  • 前端,用dayjs包起來(預設能夠解析local的2004-05-03,轉換成UTC)
    "startTime": dayjs($("#startDate").val()), // 轉成UTC時間
  • 後端可以註解時間的pattern在實體類
    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    Date startTime;

或是加在controller上

@GetMapping("/test")
public ResponseResource test(
    @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
    @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) {...}

同場加映: 超過24小時的時間格式判斷是否在區間內

背景: 用到一個設定叫"晚上時段",例如定義了18:00-28:00表示當天晚上8點到明天凌晨4點都屬於"晚上時段",現在要判定updateTime是不是屬於"晚上時段"內

    /**
     * 判斷updateTime是否為設定中的"晚上時段"
     */
    private boolean isNightTime(String nightTimeRange, Date updateTime) {
        String[] nightTimeRangeArr = nightTimeRange.split("-"); // 格式:##:##-##:##,範例:20:00-28:00
        LocalTime startTime = LocalTime.parse(nightTimeRangeArr[0]);
        LocalDateTime startDayTime = LocalDateTime.ofInstant(updateTime.toInstant(),
                ZoneId.systemDefault()).withHour(startTime.getHour()).withMinute(startTime.getMinute()).withSecond(0).withNano(0);
        boolean flag;
        // 結束時間可能是23點或跨日的28點,所以要判斷是否跨日
        int endTimeHour = Integer.parseInt(nightTimeRangeArr[1].split(":")[0]);
        int endTimeMinute = Integer.parseInt(nightTimeRangeArr[1].split(":")[1]);
        LocalDateTime currentTime = LocalDateTime.ofInstant(updateTime.toInstant(),
                ZoneId.systemDefault());
        if ((endTimeHour) > 23) { // 如果超過24點,則轉換成下一天,因為localDate物件不可變,所以分開處理
            LocalTime endTime = LocalTime.of(endTimeHour - 24, endTimeMinute);
            LocalDateTime endDayTime = LocalDateTime.ofInstant(updateTime.toInstant(),
                    ZoneId.systemDefault()).withHour(endTime.getHour()).withMinute(endTime.getMinute()).withSecond(0).withNano(0);
            LocalDateTime plusOneDay = endDayTime.plus(1, ChronoUnit.DAYS);
            flag = currentTime.isAfter(startDayTime) && currentTime.isBefore(plusOneDay);
        } else {
            LocalTime endTime = LocalTime.parse(nightTimeRangeArr[1]);
            LocalDateTime endDayTime = LocalDateTime.ofInstant(updateTime.toInstant(),
                    ZoneId.systemDefault()).withHour(endTime.getHour()).withMinute(endTime.getMinute()).withSecond(0).withNano(0);
            flag = currentTime.isAfter(startDayTime) && currentTime.isBefore(endDayTime);
        }
        return flag;
    }

上次修改於 2022-07-30