在Java中處理字符數組表示的TransactionTime
(例如["2025-06-01","2025-06-10"]
),將其轉換為開始時間和結束時間,推薦使用Java 8+的java.time
?API(如LocalDate
)。以下是完整代碼示例:
解決方案代碼
java
復制
下載
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException;public class TransactionTimeParser {public static void main(String[] args) {// 示例輸入數據String[] transactionTime = {"2025-06-01", "2025-06-10"};try {// 1. 解析開始時間LocalDate startDate = parseDate(transactionTime[0]);// 2. 解析結束時間LocalDate endDate = parseDate(transactionTime[1]);// 3. 輸出結果(或進行后續業務操作)System.out.println("開始時間: " + startDate);System.out.println("結束時間: " + endDate);// 示例:計算時間跨度long daysBetween = java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate);System.out.println("時間跨度: " + daysBetween + " 天");} catch (DateTimeParseException e) {System.err.println("日期格式錯誤: " + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.err.println("數組長度不足: 需要2個日期元素");}}private static LocalDate parseDate(String dateStr) throws DateTimeParseException {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");return LocalDate.parse(dateStr, formatter);} }
關鍵步驟解析:
-
數據驗證
-
確保數組長度至少為2(避免
ArrayIndexOutOfBoundsException
)。 -
檢查日期格式是否符合
yyyy-MM-dd
(如2025-06-01
)。
-
-
日期解析
-
使用
DateTimeFormatter
定義格式("yyyy-MM-dd"
)。 -
通過
LocalDate.parse()
將字符串轉換為LocalDate
對象。
-
-
異常處理
-
DateTimeParseException
:日期格式無效時拋出(如2025/06/01
)。 -
ArrayIndexOutOfBoundsException
:數組元素不足時拋出。
-
-
后續操作
-
可直接使用
LocalDate
對象進行日期計算(如計算時間跨度、日期比較等)。
-
執行結果:
text
復制
下載
開始時間: 2025-06-01 結束時間: 2025-06-10 時間跨度: 9 天
注意事項:
-
時區問題
LocalDate
不包含時區信息,如需時區支持請改用ZonedDateTime
。 -
空值檢查
實際業務中應增加對transactionTime
為null
或空數組的判斷。 -
日期邏輯
如果結束時間早于開始時間,需根據業務需求處理(如拋出異常或交換值)。
推薦使用
LocalDate
的優勢:
不可變且線程安全
提供豐富的日期計算方法(如
plusDays()
、isBefore()
等)避免遺留
Date
和Calendar
類的設計缺陷
轉換為?LocalDateTime
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;public class TransactionTimeParser {public static void main(String[] args) {// 示例輸入數據String[] transactionTime = {"2025-06-01", "2025-06-10"};try {// 1. 解析開始時間(轉換為當天的00:00:00)LocalDateTime startDateTime = parseStartDateTime(transactionTime[0]);// 2. 解析結束時間(轉換為當天的23:59:59.999999999)LocalDateTime endDateTime = parseEndDateTime(transactionTime[1]);// 3. 輸出結果System.out.println("開始時間: " + startDateTime);System.out.println("結束時間: " + endDateTime);// 示例:計算時間跨度(以天為單位)long daysBetween = java.time.temporal.ChronoUnit.DAYS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate());System.out.println("時間跨度: " + daysBetween + " 天");} catch (DateTimeParseException e) {System.err.println("日期格式錯誤: " + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.err.println("數組長度不足: 需要2個日期元素");}}// 解析為開始時間(當天的00:00:00)private static LocalDateTime parseStartDateTime(String dateStr) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate date = LocalDate.parse(dateStr, formatter);return date.atStartOfDay(); // 轉換為當天的開始時間}// 解析為結束時間(當天的最后一刻)private static LocalDateTime parseEndDateTime(String dateStr) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate date = LocalDate.parse(dateStr, formatter);return date.atTime(LocalTime.MAX); // 23:59:59.999999999}
}
?
// 查詢試劑交易(入庫/出庫)記錄@Overridepublic List<BranchWarehouseTransactions> queryForReagent(BranchWarehouseTransactionsQueryDTO queryDTO) {if ((queryDTO.getTransactionTime() == null || queryDTO.getTransactionTime().isEmpty()) &&queryDTO.getTransactionType() == null &&(queryDTO.getMaterialName() == null || queryDTO.getMaterialName().isEmpty())) {throw new RuntimeException("請輸入查詢條件!");}// 處理字符日期數組,數據格式為:["2025-06-01","2025-06-10"],需處理為 LocalDateTime 格式的開始時間和結束時間// 日期格式器DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");// 1. 解析開始時間String beginDateStr = null;LocalDateTime beginDateTime = null;if (queryDTO.getTransactionTime() != null && queryDTO.getTransactionTime().size() == 2) {beginDateStr = queryDTO.getTransactionTime().get(0);}if (beginDateStr != null && !beginDateStr.isEmpty()) {// 字符串 轉 日期LocalDate startDate = LocalDate.parse(beginDateStr, formatter);// 日期 轉 日期時間(當天的 00:00:00)beginDateTime = startDate.atStartOfDay();}queryDTO.setTransactionTimeBegin(beginDateTime);// 2. 解析結束時間String endDateStr = null;LocalDateTime endDateTime = null;if (queryDTO.getTransactionTime() != null && queryDTO.getTransactionTime().size() == 2) {endDateStr = queryDTO.getTransactionTime().get(1);}if (endDateStr != null && !endDateStr.isEmpty()) {// 字符串 轉 日期LocalDate endDate = LocalDate.parse(endDateStr, formatter);// 日期 轉 日期時間(當天的 23:59:59.999999999)endDateTime = endDate.atTime(LocalTime.MAX);}queryDTO.setTransactionTimeEnd(endDateTime);// 檢查日期邏輯關系if (beginDateTime != null && beginDateTime.isAfter(endDateTime)) {throw new IllegalArgumentException("開始時間不能晚于結束時間!");}return branchWarehouseMapper.selectForReagent(queryDTO);}