前端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