Java日期时间API系列36

Wesley13
• 阅读 650

  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:

时辰

时间

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
1年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
1年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
1年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
1年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
1年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
1年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
1年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_