• 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
  • 相关阅读:
    Android四大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比
    Android系统更改状态栏字体颜色
    Zookeeper使用--命令行
    Zookeeper配置文件
    Zookeeper到底是干嘛的
    shell脚本学习之参数传递
    zabbix3.4.7之Zabbix_Trigger_Function详解
    zabbix3.4.7主动模式监控日志(多关键字)
    linux下grep命令详解
    一些不好理解的名词解释
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/13417518.html
Copyright © 2020-2023  润新知