长安十二时辰与现代时间的互转

简介: 长安十二时辰与现代时间的互转


不贫便是富,不爱购置便是收入。——西塞罗

[v6] [feature] 添加长安十二时辰与现代时间的互转 · Pull Request !1184 · dromara/hutool - Gitee.com

代码如下:

package org.dromara.hutool.core.date.chinese;
import org.dromara.hutool.core.date.DateBetween;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * 长安时辰转换器
 * <p>
 *     23-1 -> 子时
 *     1-3 -> 丑时
 *     3-5 -> 寅时
 *     5-7 -> 卯时
 *     7-9 -> 辰时
 *     9-11 -> 巳时
 *     11-13 -> 午时
 *     13-15 -> 未时
 *     15-17 -> 申时
 *     17-19 -> 酉时
 *     19-21 -> 戌时
 *     21-23 -> 亥时
 *     24/-1/其他值 -> 未知
 *     </p>
 * @author achao@hutool.cn
 */
public class ChangAnTimeConverter {
  private static final Map<String, int[]> timeMap = new HashMap<>();
  static {
    // 初始化时辰对应的小时范围
    timeMap.put("子", new int[]{23, 1});
    timeMap.put("丑", new int[]{1, 3});
    timeMap.put("寅", new int[]{3, 5});
    timeMap.put("卯", new int[]{5, 7});
    timeMap.put("辰", new int[]{7, 9});
    timeMap.put("巳", new int[]{9, 11});
    timeMap.put("午", new int[]{11, 13});
    timeMap.put("未", new int[]{13, 15});
    timeMap.put("申", new int[]{15, 17});
    timeMap.put("酉", new int[]{17, 19});
    timeMap.put("戌", new int[]{19, 21});
    timeMap.put("亥", new int[]{21, 23});
  }
  /**
   * 将长安时辰转换为现代时间
   * <p>
   * toModernTime("子时").getBegin().getHours() -> 23
   * toModernTime("子时").getEnd().getHours() -> 1
   * </p>
   *
   * @param changAnTime 长安时辰
   * @return 现代时间段
   */
  public static DateBetween toModernTime(String changAnTime) {
    String time = changAnTime.replace("时", "");
    int[] hours = timeMap.get(time);
    if (hours == null) {
      throw new IllegalArgumentException("Invalid ChangAn time");
    }
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime start = now.withHour(hours[0]).withMinute(0).withSecond(0).withNano(0);
    LocalDateTime end = now.withHour(hours[1]).withMinute(0).withSecond(0).withNano(0);
    if (hours[0] >= hours[1]) {
      end = end.plusDays(1); // 处理跨日情况
    }
    Date startDate = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
    Date endDate = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
    return DateBetween.of(startDate, endDate);
  }
  /**
   * 将小时转换为长安时辰
   * <p>
   *     toChangAnTime(1) -> "子时"
   *</p>
   * @param hour 小时
   * @return 长安时辰
   */
  public static String toChangAnTime(int hour) {
    for (Map.Entry<String, int[]> entry : timeMap.entrySet()) {
      int startHour = entry.getValue()[0];
      int endHour = entry.getValue()[1];
      if (hour == 23 || hour == 0 || (hour >= startHour && hour < endHour) || (startHour > endHour && hour < endHour)) {
        return entry.getKey() + "时";
      }
    }
    return "未知";
  }
}

使用如下:

package org.dromara.hutool.core.date.chinese;
import org.dromara.hutool.core.date.DateBetween;
import org.dromara.hutool.core.date.DateUnit;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
 * ChangAnTimeConverterTest
 *
 * @author achao@apache.org
 */
public class ChangAnTimeConverterTest {
  @Test
  void testToModernTimeForAllTimes() {
    // 测试每个时辰的转换
    String[] times = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
    int[][] expectedHours = {{23, 1}, {1, 3}, {3, 5}, {5, 7}, {7, 9}, {9, 11}, {11, 13}, {13, 15}, {15, 17}, {17, 19}, {19, 21}, {21, 23}};
    for (int i = 0; i < times.length; i++) {
      DateBetween dateBetween = ChangAnTimeConverter.toModernTime(times[i] + "时");
      Assertions.assertEquals(2, dateBetween.between(DateUnit.HOUR));
      Assertions.assertEquals(expectedHours[i][0], dateBetween.getBegin().getHours());
      Assertions.assertEquals(expectedHours[i][1], dateBetween.getEnd().getHours());
    }
  }
  @Test
  void testToChangAnTimeForAllHours() {
    // 从23时开始测试,因为子时开始于23时
    String[] expectedTimes = {"子时", "丑时", "丑时", "寅时", "寅时", "卯时", "卯时", "辰时", "辰时", "巳时", "巳时", "午时", "午时", "未时", "未时", "申时", "申时", "酉时", "酉时", "戌时", "戌时", "亥时", "亥时", "子时", "未知"};
    for (int hour = 0; hour <= 24; hour++) {
      String expectedTime = expectedTimes[hour];
      String actualTime = ChangAnTimeConverter.toChangAnTime(hour);
      Assertions.assertEquals(expectedTime, actualTime);
    }
  }
}


相关文章
|
6月前
|
安全 数据安全/隐私保护
全文彩印!人民邮电出版的“24小时学会黑客攻防”,讲的太好了!
黑客,对于普通电脑用户来说,太神秘,也太可恨了,他们通过各种方法侵入我们的电脑,窃取电脑中的信息。 很多时候,普通电脑用户在对黑客痛恨的同时,又钦佩其高超的电脑技术,从而想了解黑客是如何攻击电脑的,并掌握防御黑客攻击的方法,为电脑系统和网络的安全贡献自己的一份力量。
|
8月前
|
iOS开发
1072 开学寄语 (20 分)
1072 开学寄语 (20 分)
|
9月前
|
Java
十二时辰与现代时间的互转(精确版)
十二时辰与现代时间的互转(精确版)
174 0
新增节添加代码【滴水逆向三期46笔记】
新增节添加代码【滴水逆向三期46笔记】
《长安十二时辰》电子版地址
《长安十二时辰》一经播出便红遍全网,从智能算法到音视频创新技术,从智能档的技术挑战到高可用的媒资平台,成就这华丽视效的爆款背后,优酷技术都用到了哪些“武林秘籍”?
150 0
《长安十二时辰》电子版地址
|
存储 安全 Java
集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解,面试再不怕集合问题了
ArrayList 是容量可变的⾮线程安全列表,使⽤数组实现,集合扩容时会创建更⼤的数组,把原有数组复制到新数组。⽀持对元素的快速随机访问,但插⼊与删除速度很慢。ArrayList 实现了 RandomAcess 标记接⼝,如果⼀个类实现了该接⼝,那么表示使⽤索引遍历⽐迭代器更快。
128 0
集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解,面试再不怕集合问题了
|
iOS开发 C++
1072 开学寄语(20 分)
下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也!本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器。
133 0
1072 开学寄语(20 分)
|
人工智能 分布式计算 算法
从长安十二时辰中学到的东西
19年的暑期里,长安十二时辰(下文简称长安)不愧是电视连续剧中的一匹黑马。紧凑的故事情节,扑朔迷离的人物关系,给观众再现盛唐一片气派的景象。这是1个令人引以自豪的时代,这是1个文人骚客辈出的朝代。 不同的人会在剧中找到不一样的东西,这里更多的是从科技以及技术的层面进行分析,而不是更多地从文化的角度。
从长安十二时辰中学到的东西
|
前端开发 算法 小程序
280字编程挑战:把一条推特长度的代码玩出花
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 推特与计算机能擦出什么样的火花呢?大多数人可能就想到在计算机上发推特呗。但是,有人就不这么想。酷爱计算机演进史和推特的 Dominic Pajak 创建了 BBC Micro Bot,它能够将一条 280 字符的推特经过模拟处理进而创建 3 秒时长的视频。
280字编程挑战:把一条推特长度的代码玩出花
|
容器 API
技术人看《长安十二时辰》的正确姿势是?
阿里妹导读:从“叉手礼”、“水盆羊汤”、“酒晕妆”这些唐朝人的生活细节,到精美的坊间造型、充满意境的诗词歌赋,《长安十二时辰》不仅以缜密剧情赢得赞誉,更还原了一个真实的大唐长安。在精良制作之上,技术人如何让观众感受1000多年前的长安风情、更深度的理解剧情呢?今天,咱们揭秘《长安十二时辰》背后的酷看体验,解读技术人看剧的正确姿势。
6016 0