Java日期時間API系列36-----Jdk8中java.time包中的新的日期時間API類應用,使用LocalTime計算十二時辰。

  十二時辰,古代勞動人民把一晝夜劃分成十二個時段,每一個時段叫一個時辰。二十四小時和十二時辰對照表:

 
 
時辰時間24時制
子時 深夜 11:00 - 凌晨 01:00 23:00 - 01 :00
丑時 上午 01:00 - 上午 03:00 01:00 - 03 :00
寅時 上午 03:00 - 上午 05:00 03:00 - 05 :00
卯時 上午 05:00 - 上午 07:00 05:00 - 07 :00
辰時 上午 07:00 - 上午 09:00 07:00 - 09 :00
巳時 上午 09:00 - 上午 11:00 09:00 - 11:00
午時 上午 11:00 - 下午 01:00 11:00 - 13:00
未時 下午 01:00 - 下午 03:00 13:00 - 15:00
申時 下午 03:00 - 下午 05:00 15:00 - 17:00
酉時 下午 05:00 - 下午 07:00 17:00 - 19:00
戌時 下午 07:00 - 下午 09:00 19:00 - 21:00
亥時 下午 09:00 - 下午 11:00 21:00 - 23:00

二十四小時和十二時辰對照表來源:http://114.xixik.com/shichen/

下面Java中如何計算十二時辰

1.十二時辰枚舉

package com.xkzhangsan.time.enums;

import java.time.LocalTime;
import java.util.Date;
import java.util.Objects;

import com.xkzhangsan.time.constants.Constant;
import com.xkzhangsan.time.converter.DateTimeConverterUtil;

/**
 * 十二時辰枚舉,包含英文全稱,中文全稱,時間範圍
 * 
 * @author xkzhangsan
 * @date 2020年08-01
 */
public enum TwelveTwoEnum {
    
    ZISHI(1, "子時", "23:00:00", "01:00:00"),
    CHOUSHI(2, "丑時", "01:00:00", "03:00:00"),
    YINSHI(3, "寅時", "03:00:00", "05:00:00"),
    MAOSHI(4, "卯辰", "05:00:00", "07:00:00"),
    CHENSHI(5, "辰時", "07:00:00", "09:00:00"),
    SISHI(6, "巳時", "09:00:00", "11:00:00"),
    WUSHI(7, "午時", "11:00:00", "13:00:00"), 
    WEISHI(8, "未時", "13:00:00", "15:00:00"),
    SHENSHI(9, "申時", "15:00:00", "17:00:00"),
    YOUSHI(10, "酉時", "17:00:00", "19:00:00"),
    XUSHI(11, "戌時", "19:00:00", "21:00:00"),
    HAISHI(12, "亥時", "21:00:00", "23:00:00"),;
    
    /**
     * 序號
     */
    private int code;
    
    /**
     * 中文名稱
     */
    private String nameCn;
    
    /**
     * 開始時間
     */
    private String startTime;
    
    /**
     * 結束時間
     */
    private String endTime;

    
    private TwelveTwoEnum(int code, String nameCn, String startTime, String endTime) {
        this.code = code;
        this.nameCn = nameCn;
        this.startTime = startTime;
        this.endTime = endTime;
    }

    /**
     * 根據時間查詢時辰名稱枚舉
     * @param localTime
     * @return TwelveHoursEnum
     */
    public static TwelveTwoEnum getTwelveHoursEnum(LocalTime localTime){
        Objects.requireNonNull(localTime, "localTime");
        for(TwelveTwoEnum twelveHours : TwelveTwoEnum.values()){
            LocalTime timeStart = LocalTime.parse(twelveHours.getStartTime());
            LocalTime timeEnd = LocalTime.parse(twelveHours.getEndTime());
            //子時,特殊計算
            if(isZiShi(localTime, timeStart, timeEnd)){
                return TwelveTwoEnum.ZISHI;
            }
            if (isBetween(localTime, timeStart, timeEnd)) {
                return twelveHours;
            }
        }
        return null;
    }

    /**
     * 時間區間判斷
     * @param localTime
     * @param timeStart
     * @param timeEnd
     * @return 在區間 true,不在 false
     */
    private static boolean isBetween(LocalTime localTime, LocalTime timeStart, LocalTime timeEnd) {
        return localTime.equals(timeStart) || (localTime.isAfter(timeStart) && localTime.isBefore(timeEnd));
    }
    
    /**
     * 是否子時
     * @param localTime
     * @param timeStart
     * @param timeEnd
     * @return 是 true, 否 false
     */
    private static boolean isZiShi(LocalTime localTime, LocalTime timeStart, LocalTime timeEnd) {
        //23點,0點
        if(Constant.TWENTYTHREECLOCK.equals(localTime) || LocalTime.MIDNIGHT.equals(localTime)){
            return true;
        }
        //23-0點
        if(localTime.isAfter(Constant.TWENTYTHREECLOCK) && localTime.isBefore(LocalTime.MIDNIGHT)){
            return true;
        }
        //0-1點
        if(localTime.isAfter(LocalTime.MIDNIGHT) && localTime.isBefore(Constant.ONECLOCK)){
            return true;
        }
        return false;
    }

    /**
     * 根據時間查詢時辰名稱
     * @param localTime
     * @return String
     */
    public static String getNameCn(LocalTime localTime){
        TwelveTwoEnum twelveHours = getTwelveHoursEnum(localTime);
        return twelveHours != null ? twelveHours.getNameCn() : null;
    }
    
    /**
     * 根據時間查詢時辰名稱
     * @param date
     * @return String
     */
    public static String getNameCn(Date date){
        return getNameCn(DateTimeConverterUtil.toLocalTime(date));
    }
    
    public int getCode() {
        return code;
    }

    public String getNameCn() {
        return nameCn;
    }

    public String getStartTime() {
        return startTime;
    }

    public String getEndTime() {
        return endTime;
    }

}

 

通過上面代碼可以看出,LocalTime 直接解析起始時間,對比當前輸入時間,得到對應的十二時辰。

LocalTime timeStart = LocalTime.parse(twelveHours.getStartTime());

2.測試代碼

    /**
     * 十二時辰測試
     */    
    @Test
    public void getTwelveHoursTest(){
        LocalTime localTime = LocalTime.of(23,0,0);
        Assert.assertEquals("子時", TwelveTwoEnum.getNameCn(localTime));
        
        Date date = DateTimeCalculatorUtil.getDate(2020, 8, 1, 0,30,0);
        Assert.assertEquals("子時", TwelveTwoEnum.getNameCn(date));
    }

 

源代碼地址:https://github.com/xkzhangsan/xk-time
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章