Java中常見時間類的使用


模擬場景
針對於常用的操作API,比如流操作(字符流、字節流),時間操作等,僅僅了解概念性的定義終究是無法了解該類的用途和使用方式;這種情況在使用的時候便一臉茫然,腦海中映射不到對應的知識點。
本篇博客將通過一個簡單的應用場景來體會這兩個類的使用。

項目開發階段,有一個關於下單發貨的需求:
如果今天下午三點前進行下單,那么發貨時間是明天
如果今天下午三點后機型下單,那么發貨時間是后天
如果被確定的發貨時間是周日的話,那么在此時間上再加一天為最終發貨時間

牛刀小試( java 原始)
整體邏輯:主函數創建下單時間,調用函數進行邏輯判斷,返回最終的發貨時間。
整理代碼如下(主函數不在列舉):

private static Date sendDateTime(String orderTime) throws ParseException {
/**
* 1:
* 1.1:實例化一個date為今天下午三點
* 2:判斷date是否大於今天下午三點,定義一個發貨時間
* 2.1:如果不大於的話,則發貨時間是明天
* 2.2:如果大於的話,則發貨時間是后天
* 3:判斷發貨時間是否是周日,
* 3.1:如果不大於的話,則發貨時間不變
* 3.2:如果大於的話,則發貨時間再加一天
*
*/
// 獲取訂單時間
DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date orderDateTime = format.parse(orderTime);

// 獲取今天下午三點,這里計算有問題
Calendar equalInstance = Calendar.getInstance();
equalInstance.set(Calendar.HOUR_OF_DAY,15);
equalInstance.set(Calendar.MINUTE, 0);
equalInstance.set(Calendar.SECOND, 0);
Date orderEqualTime = equalInstance.getTime();

// 創建預下單時間
Calendar calendar = Calendar.getInstance();
calendar.setTime(orderDateTime);

// 判斷訂單時間是否大於今天下午三點
boolean isMoreThan = orderDateTime.after(orderEqualTime);
if(isMoreThan){
//    發貨時間是后天(訂單時間加兩天)
calendar.add(Calendar.DATE,2);
}else{
//    發貨時間是明天(訂單時間加一天)
calendar.add(Calendar.DATE,1);
}
Date preShipTime = calendar.getTime();
return skipTime(preShipTime);
}
private static Date skipTime(Date date){
Calendar instance = Calendar.getInstance();
instance.setTime(date);
// 外國的習俗是周末是一周的第一天,在java8以及JodaTime中已經恢復成正常的周末順序
int preWeekDay = instance.get(Calendar.DAY_OF_WEEK);
// 因為是今天,所以我拿周二來判斷,而不是周日
if(preWeekDay==Calendar.SUNDAY){
instance.add(Calendar.DATE,1);
}
return instance.getTime();
}
    private static DateTime calculateTime(String orderTime) {
        // 獲取當前訂單時間
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        DateTime orderDateTime = dateTimeFormatter.parseDateTime(orderTime);
        // 創建今天下午三點的時間
        DateTime orderEqualTime = orderDateTime.withHourOfDay(15).withMinuteOfHour(0).withSecondOfMinute(0);
        // DateTime orderEqualTime = new DateTime(2019, 11, 10, 15, 0, 0, 0);

        // 創建預發貨時間
        DateTime preSkipDateTime=orderEqualTime.isAfter(orderDateTime)?orderDateTime.plusDays(1):orderDateTime.plusDays(2);

        return isTuesday(preSkipDateTime);
    }

    private static DateTime isTuesday(DateTime preSkipDateTime) {
        // 獲取預發貨時間位於星期幾
        int dayOfWeek = preSkipDateTime.getDayOfWeek();
        return (dayOfWeek != DateTimeConstants.SUNDAY) ? preSkipDateTime : preSkipDateTime.plusDays(1);
    }

 

 

版本升級(java 8private static LocalDateTime calculateTime(String orderTime){
/**
* 1:將字符串轉變為date
* 1.1:實例化一個date為今天下午三點
* 2:判斷date是否大於今天下午三點,定義一個發貨時間
* 2.1:如果不大於的話,則發貨時間是明天
* 2.2:如果大於的話,則發貨時間是后天
* 3:判斷發貨時間是否是周日,
* 3.1:如果不大於的話,則發貨時間不變
* 3.2:如果大於的話,則發貨時間再加一天
*
*/
// 獲取訂單時間
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime orderDateTime = LocalDateTime.parse(orderTime, dateTimeFormatter);

// 設置今天下午三點
LocalDateTime orderEqualTime= orderDateTime.withHour(15).withMinute(0).withSecond(0);
// LocalDateTime orderEqualTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(15, 0, 0));

// 判斷訂單時間是否在下午三點之前,如果是的話,設定發貨時間是明天,否則的話是后天
// 定義一個預發貨時間
LocalDateTime preSkipDateTime=orderEqualTime.isAfter(orderDateTime)?orderDateTime.plusDays(1):orderDateTime.plusDays(2);
return isSunday(preSkipDateTime);
}

/**
* 判斷預下單時間是否周末
* @param preSendDateTime
* @return
*/
private static LocalDateTime isSunday(LocalDateTime preSendDateTime){
// 獲取預下單時間是星期幾
DayOfWeek dayOfWeek = preSendDateTime.getDayOfWeek();
// 定義發貨時間
return (dayOfWeek!=DayOfWeek.SUNDAY)?preSendDateTime:preSendDateTime.plusDays(1);
}

 


心得體會
想必通過這三次代碼的迭代和重構,大家已經看到的哪些時間類API功能強大;當然他們之中的區別絕不是表面使用方便那么簡單,第一種利用Data和Calendar的方式目前不推薦使用,因為SimpleDateFormat作為一個非線程安全的類,被當做了共享變量在多個線程中進行使用,這就出現了線程安全問題。推薦大家使用第二個或者是第三種,第二種是在Java8出現之間一直作為Java時間類的替代品所使用的,通過代碼即表明功能依舊很強大。


原文鏈接:https://blog.csdn.net/zhao1955/article/details/103044685


免責聲明!

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



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