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
Java日期时间API系列36-----Jdk8中java.time包中的新的日期时间API类应用,使用LocalTime计算十二时辰。的更多相关文章
- 在swt中获取jar包中的文件 uri is not hierarchical
uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...
- API接口自动化之3 同一个war包中多个接口做自动化测试
同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...
- Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包
最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的: 很明显建立项目后的架构是上 ...
- Mac 如何导出ipa文件中Assets.car包中的切图
在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...
- 程序员的长安十二时辰:Java实现从Google oauth2.0认证调用谷歌内部api
最近公司在做一个app购买的功能,主要思路就是客户在app上购买套餐以后,Google自动推送消息到Java后端,然后Java后端通过订单的token获取订单信息,保存到数据库. Java后端要获取订 ...
- 【转】Eclipse中查看jar包中的源码
(简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...
- JDK中的Atomic包中的类及使用
引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...
- Package.json中dependencies依赖包中^符号和~符号前缀的区别
刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...
- Java8系列 (六) 新的日期和时间API
概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...
- Java8 新的日期和时间API(笔记)
LocalDate LocalTime Instant duration以及Period 使用LocalDate和LocalTime //2017-03-20 LocalDate date = Loc ...
随机推荐
- uniapp打包所需的ios证书和证书profile文件获取的图文教程
使用uniapp进行云打包,可以打包android和ios两种app,但是uniapp官方并不能凭空产生这两种平台所需的打包证书. 那么这两种打包证书又是如何获取呢? android相对简单,使用jd ...
- 【SpringBoot】02 概述
[目标] - 什么是SpringBoot? 并不是新技术,只是一个Spring的加强 解脱XML配置,增加了新的注解,但是并不是新的内容 - 新型配置文件技术 YAML - 自动装配原理[了解即可,不 ...
- 分享某Python下的mpi教程 —— A Python Introduction to Parallel Programming with MPI 1.0.2 documentation ( 续 #2 )
接前文: 分享某Python下的mpi教程 -- A Python Introduction to Parallel Programming with MPI 1.0.2 documentation ...
- 【转载】 Pytorch手动释放显存
原文地址: http://www.shijinglei.com/2020/04/20/pytorch%E9%87%8A%E6%94%BE%E6%98%BE%E5%AD%98/ ============ ...
- Singleton bean creation not allowed while singletons of this factory are in destruction
1.背景 一直都是正常运行的程序,检查日志发现有一条报错如下: org.springframework.beans.factory.BeanCreationNotAllowedException: E ...
- [天线原理及设计>基本原理] 1. 辐射机制
1. 辐射机制 1.1. Single Wire 单线 如果电荷不移动,则不会产生电流,也不会产生辐射. 如果电荷以匀速移动: a. 如果电线是直的,并且范围是无限的,则没有辐射. b. 如果电线弯曲 ...
- Python正则表达式提取车牌号
在Python中使用正则表达式(Regular Expressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时.中国的车牌号格式多种多样,但通常包含省份简称.英 ...
- Java元注解介绍
Java四种元注解相关介绍 概述 注解从Java1.5引入以来,不断地简化我们编写代码的流程,逐渐的也成为了我们必学的一项技术.我们学习了各种注解,学习了他们的用法,学习了他们的限制,是否想过他们的组 ...
- powershell 常用插件
1. z 「z」这个 zsh 下常用的跳转工具,当频繁需要进入一个比较深的目录的时候,「z」这个插件会帮我们自动记录这个目录,之后我们只需要执行z [Directory]就可以快速跳转了 PowerS ...
- 游戏AI行为决策——MLP(多层感知机/人工神经网络)
游戏AI行为决策(特别篇)--MLP(附代码与项目) 你一定听说过神经网络的大名,你有想过将它用于游戏AI的行为决策上吗?其实在(2010年发布的)<最高指挥官2>中就有应用了,今天请允许 ...