From dd4d8c8c295bb6c79b313b3071a81d5c67cbd47a Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 28 Aug 2020 17:35:26 +0800 Subject: [PATCH] add ganzhi --- CHANGELOG.md | 3 +- .../java/cn/hutool/core/date/ChineseDate.java | 336 +++--------------- .../java/cn/hutool/core/date/DateTime.java | 17 +- .../core/date/chinese/ChineseMonth.java | 27 ++ .../cn/hutool/core/date/chinese/GanZhi.java | 23 ++ .../core/date/chinese/LunarFestival.java | 54 +++ .../hutool/core/date/chinese/LunarInfo.java | 111 ++++++ .../hutool/core/date/chinese/SolarTerms.java | 115 ++++++ .../core/date/chinese/package-info.java | 7 + .../cn/hutool/core/date/ChineseDateTest.java | 2 +- .../main/java/cn/hutool/http/HttpRequest.java | 13 + .../java/cn/hutool/http/test/HttpsTest.java | 1 - 12 files changed, 424 insertions(+), 285 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseMonth.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/date/chinese/GanZhi.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/date/chinese/SolarTerms.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/date/chinese/package-info.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b6ff8e58..ea03a73c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.4.1 (2020-08-27) +# 5.4.1 (2020-08-28) ### 新特性 * 【core 】 StrUtil增加firstNonXXX方法(issue#1020@Github) @@ -19,6 +19,7 @@ * 【core 】 Dict增加of方法(issue#1035@Github) * 【core 】 StrUtil.wrapAll方法不明确修改改为wrapAllWithPair(issue#1042@Github) * 【core 】 EnumUtil.getEnumAt负数返回null(pr#167@Gitee) +* 【core 】 ChineseDate增加天干地支和转换为公历方法(pr#169@Gitee) ### Bug修复# * 【poi 】 修复ExcelBase.isXlsx方法判断问题(issue#I1S502@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java b/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java index c82f6b8af..98c5bbe21 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java @@ -1,14 +1,14 @@ package cn.hutool.core.date; import cn.hutool.core.convert.NumberChineseFormatter; +import cn.hutool.core.date.chinese.ChineseMonth; +import cn.hutool.core.date.chinese.GanZhi; +import cn.hutool.core.date.chinese.LunarFestival; +import cn.hutool.core.date.chinese.LunarInfo; +import cn.hutool.core.date.chinese.SolarTerms; import cn.hutool.core.util.StrUtil; -import java.util.ArrayList; -import java.util.Calendar; import java.util.Date; -import java.util.List; - -import static cn.hutool.core.util.NumberUtil.parseInt; /** @@ -18,7 +18,6 @@ import static cn.hutool.core.util.NumberUtil.parseInt; * @since 5.1.1 */ public class ChineseDate { -// private static final Date baseDate = DateUtil.parseDate("1900-01-31"); /** * 1900-01-31 */ @@ -29,128 +28,16 @@ public class ChineseDate { private final int month; //农历日 private final int day; + //公历年 private final int gyear; //公历月 private final int gmonth; //公里日 private final int gday; + //是否闰年 private boolean leap; - private final String[] chineseNumber = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"}; - private final String[] chineseNumberName = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"}; - /** - * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js - * 农历表示: - * 1. 表示当年有无闰年,有的话,为闰月的月份,没有的话,为0。 - * 2-4.为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。 - * 5. 表示闰月是大月还是小月,仅当存在闰月的情况下有意义。 - */ - private final long[] lunarInfo = new long[]{ - 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909 - 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919 - 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929 - 0x06566, 0x0d4a0, 0x0ea50, 0x16a95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939 - 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949 - 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959 - 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969 - 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979 - 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989 - 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999 - 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009 - 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019 - 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029 - 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039 - 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049 - 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059 - 0x092e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069 - 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079 - 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089 - 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099 - }; - /** - * 1900-2100各年的24节气日期速查表 - * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js - */ - private final String[] sTermInfo = new String[]{ - "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", - "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", - "97bcf97c359801ec95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", - "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", - "b027097bd097c36b0b6fc9274c91aa", "9778397bd19801ec9210c965cc920e", "97b6b97bd19801ec95f8c965cc920f", - "97bd09801d98082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd197c36c9210c9274c91aa", - "97b6b97bd19801ec95f8c965cc920e", "97bd09801d98082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", - "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec95f8c965cc920e", "97bcf97c3598082c95f8e1cfcc920f", - "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec9210c965cc920e", - "97bcf97c3598082c95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", - "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", - "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", - "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", - "97bcf97c359801ec95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", - "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd097bd07f595b0b6fc920fb0722", - "9778397bd097c36b0b6fc9210c8dc2", "9778397bd19801ec9210c9274c920e", "97b6b97bd19801ec95f8c965cc920f", - "97bd07f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c920e", - "97b6b97bd19801ec95f8c965cc920f", "97bd07f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", - "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bd07f1487f595b0b0bc920fb0722", - "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", - "97bcf7f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", - "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", - "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f531b0b0bb0b6fb0722", - "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", - "97bcf7f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", - "97b6b97bd19801ec9210c9274c920e", "97bcf7f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", - "9778397bd097c36b0b6fc9210c91aa", "97b6b97bd197c36c9210c9274c920e", "97bcf7f0e47f531b0b0bb0b6fb0722", - "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c920e", - "97b6b7f0e47f531b0723b0b6fb0722", "7f0e37f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", - "9778397bd097c36b0b70c9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e37f1487f595b0b0bb0b6fb0722", - "7f0e397bd097c35b0b6fc9210c8dc2", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", - "7f0e27f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", - "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", - "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", - "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", - "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9274c91aa", - "97b6b7f0e47f531b0723b0787b0721", "7f0e27f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", - "9778397bd097c36b0b6fc9210c91aa", "97b6b7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", - "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "977837f0e37f149b0723b0787b0721", - "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f5307f595b0b0bc920fb0722", "7f0e397bd097c35b0b6fc9210c8dc2", - "977837f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e37f1487f595b0b0bb0b6fb0722", - "7f0e397bd097c35b0b6fc9210c8dc2", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", - "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "977837f0e37f14998082b0787b06bd", - "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", - "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", - "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", - "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0787b06bd", - "7f07e7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", - "977837f0e37f14998082b0723b06bd", "7f07e7f0e37f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", - "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b0721", - "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f1487f595b0b0bb0b6fb0722", "7f0e37f0e37f14898082b0723b02d5", - "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f1487f531b0b0bb0b6fb0722", - "7f0e37f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", - "7f0e37f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", - "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b072297c35", - "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", - "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f149b0723b0787b0721", - "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0723b06bd", - "7f07e7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", "7f0e37f0e366aa89801eb072297c35", - "7ec967f0e37f14998082b0723b06bd", "7f07e7f0e37f14998083b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", - "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14898082b0723b02d5", "7f07e7f0e37f14998082b0787b0721", - "7f07e7f0e47f531b0723b0b6fb0722", "7f0e36665b66aa89801e9808297c35", "665f67f0e37f14898082b0723b02d5", - "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e36665b66a449801e9808297c35", - "665f67f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", - "7f0e36665b66a449801e9808297c35", "665f67f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", - "7f07e7f0e47f531b0723b0b6fb0721", "7f0e26665b66a449801e9808297c35", "665f67f0e37f1489801eb072297c35", - "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722"}; - - //农历节日 *表示放假日 - private final String[] lFtv = new String[]{ - "0101 春节", "0102 大年初二", "0103 大年初三", "0104 大年初四", - "0105 大年初五", "0106 大年初六", "0107 大年初七", "0105 路神生日", - "0115 元宵节", "0202 龙抬头", "0219 观世音圣诞", "0404 寒食节", - "0408 佛诞节 ", "0505 端午节", "0606 天贶节 姑姑节", "0624 彝族火把节", - "0707 七夕情人节", "0714 鬼节(南方)", "0715 盂兰节", "0730 地藏节", - "0815 中秋节", "0909 重阳节", "1001 祭祖节", "1117 阿弥陀佛圣诞", - "1208 腊八节 释迦如来成道日", "1223 过小年", "1229 腊月二十九", "1230 除夕" - }; /** * 构造方法传入日期 @@ -163,22 +50,19 @@ public class ChineseDate { // 计算农历年份 // 用offset减去每农历年的天数,计算当天是农历第几天,offset是当年的第几天 int daysOfYear; - int iYear = 1900; - final int maxYear = iYear + lunarInfo.length - 1; + int iYear = LunarInfo.BASE_YEAR; + final int maxYear = LunarInfo.getMaxYear(); for (; iYear <= maxYear; iYear++) { - daysOfYear = yearDays(iYear); + daysOfYear = LunarInfo.yearDays(iYear); if (offset < daysOfYear) { break; } offset -= daysOfYear; } - Calendar instance = Calendar.getInstance(); - instance.setTime(date); - gyear = instance.get(Calendar.YEAR); - year = iYear; + year = iYear; // 计算农历月份 - int leapMonth = leapMonth(iYear); // 闰哪个月,1-12 + int leapMonth = LunarInfo.leapMonth(iYear); // 闰哪个月,1-12 // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天 int iMonth; int daysOfMonth = 0; @@ -187,9 +71,9 @@ public class ChineseDate { if (leapMonth > 0 && iMonth == (leapMonth + 1) && false == leap) { --iMonth; leap = true; - daysOfMonth = leapDays(year); + daysOfMonth = LunarInfo.leapDays(year); } else { - daysOfMonth = monthDays(year, iMonth); + daysOfMonth = LunarInfo.monthDays(year, iMonth); } offset -= daysOfMonth; @@ -215,9 +99,13 @@ public class ChineseDate { } month = iMonth; - gmonth = instance.get(Calendar.MARCH) + 1; day = offset + 1; - gday = instance.get(Calendar.DATE); + + // 公历 + final DateTime dt = DateUtil.date(date); + gyear = dt.year(); + gmonth = dt.month() + 1; + gday = dt.dayOfMonth(); } /** @@ -234,15 +122,16 @@ public class ChineseDate { this.year = chineseYear; this.leap = DateUtil.isLeapYear(chineseYear); //先判断传入的月份是不是闰月 - int leapMonth = this.leapMonth(chineseYear); - Integer[] integers = lunar2solar(chineseYear, chineseMonth, chineseDay, chineseMonth == leapMonth); - if (integers != null) { + int leapMonth = LunarInfo.leapMonth(chineseYear); + + final DateTime dateTime = lunar2solar(chineseYear, chineseMonth, chineseDay, chineseMonth == leapMonth); + if (null != dateTime) { //初始化公历年 - this.gday = integers[2]; + this.gday = dateTime.dayOfMonth(); //初始化公历月 - this.gmonth = integers[1]; + this.gmonth = dateTime.month() + 1; //初始化公历日 - this.gyear = integers[0]; + this.gyear = dateTime.year(); } else { //初始化公历年 this.gday = -1; @@ -279,7 +168,7 @@ public class ChineseDate { * @return 返回农历月份 */ public String getChineseMonth() { - return (leap ? "闰" : "") + NumberChineseFormatter.format(this.month, false) + "月"; + return ChineseMonth.getChineseMonthName(this.leap, this.month, false); } /** @@ -288,7 +177,7 @@ public class ChineseDate { * @return 返回农历月份称呼 */ public String getChineseMonthName() { - return (leap ? "闰" : "") + chineseNumberName[month - 1] + "月"; + return ChineseMonth.getChineseMonthName(this.leap, this.month, true); } /** @@ -331,25 +220,7 @@ public class ChineseDate { * @return 获得农历节日 */ public String getFestivals() { - StringBuilder currentChineseDate = new StringBuilder(); - if (month < 10) { - currentChineseDate.append('0'); - } - currentChineseDate.append(this.month); - - if (day < 10) { - currentChineseDate.append('0'); - } - currentChineseDate.append(this.day); - - List getFestivalsList = new ArrayList<>(); - for (String fv : lFtv) { - final List split = StrUtil.split(fv, ' '); - if (split.get(0).contentEquals(currentChineseDate)) { - getFestivalsList.add(split.get(1)); - } - } - return StrUtil.join(",", getFestivalsList); + return StrUtil.join(",", LunarFestival.getFestivals(this.month, this.day)); } /** @@ -368,8 +239,7 @@ public class ChineseDate { * @return 获得天干地支 */ public String getCyclical() { - int num = year - 1900 + 36; - return (cyclicalm(num)); + return GanZhi.cyclicalm(year - LunarInfo.BASE_YEAR + 36); } /** @@ -378,9 +248,10 @@ public class ChineseDate { * @return 获得天干地支的年月日信息 */ public String getCyclicalYMD() { - if (gyear >= 1900 && gmonth > 0 && gday > 0) + if (gyear >= LunarInfo.BASE_YEAR && gmonth > 0 && gday > 0){ return (cyclicalm(gyear, gmonth, gday)); - return ""; + } + return null; } /** @@ -400,117 +271,29 @@ public class ChineseDate { // ------------------------------------------------------- private method start - /** - * 传入 月日的offset 传回干支, 0=甲子 - */ - private static String cyclicalm(int num) { - final String[] Gan = new String[]{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}; - final String[] Zhi = new String[]{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; - return (Gan[num % 10] + Zhi[num % 12]); - } - /** * 这里同步处理年月日的天干地支信息 * - * @param Y - * @param M - * @param D - * @return + * @param Y 年 + * @param M 月 + * @param D 日 + * @return 天干地支信息 */ private String cyclicalm(int Y, int M, int D) { - String gzyear = cyclicalm(year - 1900 + 36); + String gzyear = GanZhi.cyclicalm(year - LunarInfo.BASE_YEAR + 36); //天干地支处理 //返回当月「节」为几日开始 - int firstNode = this.getTerm(Y, (M * 2 - 1)); + int firstNode = SolarTerms.getTerm(Y, (M * 2 - 1)); // 依据12节气修正干支月 - String gzM = this.cyclicalm((Y - 1900) * 12 + M + 11); + String gzM = GanZhi.cyclicalm((Y - LunarInfo.BASE_YEAR) * 12 + M + 11); if (D >= firstNode) { - gzM = this.cyclicalm((Y - 1900) * 12 + M + 12); + gzM = GanZhi.cyclicalm((Y - LunarInfo.BASE_YEAR) * 12 + M + 12); } int dayCyclical = (int) ((DateUtil.parseDate(Y + "-" + M + "-" + "1").getTime() - baseDate + 2592000000L) / DateUnit.DAY.getMillis()) + 10; - String gzD = this.cyclicalm(dayCyclical + D - 1); + String gzD = GanZhi.cyclicalm(dayCyclical + D - 1); return gzyear + "年" + gzM + "月" + gzD + "日"; } - /** - * 根据节气修正干支月 - * - * @param y - * @param n - * @return - */ - private int getTerm(int y, int n) { - if (y < 1900 || y > 2100) { - return -1; - } - if (n < 1 || n > 24) { - return -1; - } - String _table = this.sTermInfo[y - 1900]; - Integer[] _info = new Integer[6]; - for (int i = 0; i < 6; i++) { - _info[i] = parseInt("0x" + _table.substring(i * 5, 5 * (i + 1))); - } - String[] _calday = new String[24]; - for (int i = 0; i < 6; i++) { - _calday[4*i] = _info[i].toString().substring(0, 1); - _calday[4*i+1] = _info[i].toString().substring(1, 3); - _calday[4*i+2] = _info[i].toString().substring(3, 4); - _calday[4*i+3] = _info[i].toString().substring(4, 6); - } - return parseInt(_calday[n - 1]); - } - - /** - * 传回农历 y年的总天数 - * - * @param y 年 - * @return 总天数 - */ - private int yearDays(int y) { - int i, sum = 348; - for (i = 0x8000; i > 0x8; i >>= 1) { - if ((lunarInfo[y - 1900] & i) != 0) - sum += 1; - } - return (sum + leapDays(y)); - } - - /** - * 传回农历 y年闰月的天数 - * - * @param y 年 - * @return 闰月的天数 - */ - private int leapDays(int y) { - if (leapMonth(y) != 0) { - return (lunarInfo[y - 1900] & 0x10000) != 0 ? 30 : 29; - } - - return 0; - } - - /** - * 传回农历 y年m月的总天数 - * - * @param y 年 - * @param m 月 - * @return 总天数 - */ - private int monthDays(int y, int m) { - return (lunarInfo[y - 1900] & (0x10000 >> m)) == 0 ? 29 : 30; - } - - /** - * 传回农历 y年闰哪个月 1-12 , 没闰传回 0 - * - * @param y 年 - * @return 润的月 - */ - private int leapMonth(int y) { - return (int) (lunarInfo[y - 1900] & 0xf); - } - /** * 通过农历年月日信息 返回公历信息 提供给构造函数 * @@ -518,49 +301,46 @@ public class ChineseDate { * @param chineseMonth 农历月 * @param chineseDay 农历日 * @param isLeapMonth 传入的月是不是闰月 - * @return + * @return 公历信息 */ - private Integer[] lunar2solar(int chineseYear, int chineseMonth, int chineseDay, boolean isLeapMonth) { + private DateTime lunar2solar(int chineseYear, int chineseMonth, int chineseDay, boolean isLeapMonth) { //超出了最大极限值 - if (chineseYear == 2100 && chineseMonth == 12 && chineseDay > 1 || chineseYear == 1900 && chineseMonth == 1 && chineseDay < 31) { + if ((chineseYear == 2100 && chineseMonth == 12 && chineseDay > 1) || + (chineseYear == LunarInfo.BASE_YEAR && chineseMonth == 1 && chineseDay < 31)) { return null; } - int day = this.monthDays(chineseYear, chineseMonth); + int day = LunarInfo.monthDays(chineseYear, chineseMonth); int _day = day; if (isLeapMonth) { - _day = this.leapDays(chineseYear); + _day = LunarInfo.leapDays(chineseYear); } //参数合法性效验 - if (chineseYear < 1900 || chineseYear > 2100 || chineseDay > _day) { + if (chineseYear < LunarInfo.BASE_YEAR || chineseYear > 2100 || chineseDay > _day) { return null; } //计算农历的时间差 int offset = 0; - for (int i = 1900; i < chineseYear; i++) { - offset += this.yearDays(i); + for (int i = LunarInfo.BASE_YEAR; i < chineseYear; i++) { + offset += LunarInfo.yearDays(i); } - int leap = 0; + int leap; boolean isAdd = false; for (int i = 1; i < chineseMonth; i++) { - leap = this.leapMonth(chineseYear); - if (!isAdd) {//处理闰月 + leap = LunarInfo.leapMonth(chineseYear); + if (false == isAdd) {//处理闰月 if (leap <= i && leap > 0) { - offset += this.leapDays(chineseYear); + offset += LunarInfo.leapDays(chineseYear); isAdd = true; } } - offset += this.monthDays(chineseYear, i); + offset += LunarInfo.monthDays(chineseYear, i); } //转换闰月农历 需补充该年闰月的前一个月的时差 if (isLeapMonth) { offset += day; } //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) -2203804800000 - DateTime date = DateUtil.date(((offset + chineseDay - 31) * 86400000L) - 2203804800000L); - int year = date.year(); - int month = date.month() + 1; - int d = date.dayOfMonth(); - return new Integer[]{year, month, d}; + return DateUtil.date(((offset + chineseDay - 31) * 86400000L) - 2203804800000L); } // ------------------------------------------------------- private method end diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index 47b93f7e3..e683352f6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -399,6 +399,15 @@ public class DateTime extends Date { return getField(DateField.MONTH); } + /** + * 获取月,从1开始计数 + * @return 月份,1表示一月 + * @since 5.4.1 + */ + public int monthBaseOne(){ + return month() + 1; + } + /** * 获得月份,从1开始计数
* 由于{@link Calendar} 中的月份按照0开始计数,导致某些需求容易误解,因此如果想用1表示一月,2表示二月则调用此方法 @@ -446,18 +455,18 @@ public class DateTime extends Date { } /** - * 获得指定日期是这个日期所在月份的第几天
+ * 获得指定日期是这个日期所在月份的第几天,从1开始 * - * @return 天 + * @return 天,1表示第一天 */ public int dayOfMonth() { return getField(DateField.DAY_OF_MONTH); } /** - * 获得指定日期是这个日期所在年份的第几天
+ * 获得指定日期是这个日期所在年份的第几天,从1开始 * - * @return 天 + * @return 天,1表示第一天 * @since 5.3.6 */ public int dayOfYear() { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseMonth.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseMonth.java new file mode 100644 index 000000000..c327ee11b --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseMonth.java @@ -0,0 +1,27 @@ +package cn.hutool.core.date.chinese; + +/** + * 农历月份表示 + * + * @author looly + * @since 5.4.1 + */ +public class ChineseMonth { + + private static final String[] MONTH_NAME = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"}; + private static final String[] MONTH_NAME_TRADITIONAL = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"}; + + /** + * 获得农历月称呼
+ * 当为传统表示时,表示为二月,腊月,或者润正月等 + * 当为非传统表示时,二月,十二月,或者润一月等 + * + * @param isLeep 是否闰月 + * @param month 月份,从1开始 + * @param isTraditional 是否传统表示,例如一月传统表示为正月 + * @return 返回农历月份称呼 + */ + public static String getChineseMonthName(boolean isLeep, int month, boolean isTraditional) { + return (isLeep ? "闰" : "") + (isTraditional ? MONTH_NAME_TRADITIONAL : MONTH_NAME)[month - 1] + "月"; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/GanZhi.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/GanZhi.java new file mode 100644 index 000000000..1404058f8 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/GanZhi.java @@ -0,0 +1,23 @@ +package cn.hutool.core.date.chinese; + +/** + * 天干地支类 + * + * @author looly + * @since 5.4.1 + */ +public class GanZhi { + + private static final String[] GAN = new String[]{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}; + private static final String[] ZHI = new String[]{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; + + /** + * 传入 月日的offset 传回干支, 0=甲子 + * + * @param num 月日的offset + * @return 干支 + */ + public static String cyclicalm(int num) { + return (GAN[num % 10] + ZHI[num % 12]); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java new file mode 100644 index 000000000..137ba1a8c --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java @@ -0,0 +1,54 @@ +package cn.hutool.core.date.chinese; + +import cn.hutool.core.util.StrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 节假日(农历)封装 + * + * @author looly + * @since 5.4.1 + */ +public class LunarFestival { + //农历节日 *表示放假日 + private static final String[] lFtv = new String[]{ + "0101 春节", "0102 大年初二", "0103 大年初三", "0104 大年初四", + "0105 大年初五", "0106 大年初六", "0107 大年初七", "0105 路神生日", + "0115 元宵节", "0202 龙抬头", "0219 观世音圣诞", "0404 寒食节", + "0408 佛诞节 ", "0505 端午节", "0606 天贶节 姑姑节", "0624 彝族火把节", + "0707 七夕情人节", "0714 鬼节(南方)", "0715 盂兰节", "0730 地藏节", + "0815 中秋节", "0909 重阳节", "1001 祭祖节", "1117 阿弥陀佛圣诞", + "1208 腊八节 释迦如来成道日", "1223 过小年", "1229 腊月二十九", "1230 除夕" + }; + + /** + * 获得节日列表 + * + * @param month 月 + * @param day 日 + * @return 获得农历节日 + */ + public static List getFestivals(int month, int day) { + final StringBuilder currentChineseDate = new StringBuilder(); + if (month < 10) { + currentChineseDate.append('0'); + } + currentChineseDate.append(month); + + if (day < 10) { + currentChineseDate.append('0'); + } + currentChineseDate.append(day); + + final List result = new ArrayList<>(); + for (String fv : lFtv) { + final List split = StrUtil.split(fv, ' '); + if (split.get(0).contentEquals(currentChineseDate)) { + result.add(split.get(1)); + } + } + return result; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java new file mode 100644 index 000000000..a088d0c05 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java @@ -0,0 +1,111 @@ +package cn.hutool.core.date.chinese; + +/** + * 阴历(农历)信息 + * + * @author looly + * @since 5.4.1 + */ +public class LunarInfo { + + public static final int BASE_YEAR = 1900; + + /** + * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js + * 农历表示: + * 1. 表示当年有无闰年,有的话,为闰月的月份,没有的话,为0。 + * 2-4.为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。 + * 5. 表示闰月是大月还是小月,仅当存在闰月的情况下有意义。 + */ + private static final long[] LUNAR_CODE = new long[]{ + 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x16a95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049 + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059 + 0x092e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099 + }; + + /** + * 获取支持的最大年(包括) + * + * @return 最大年(包括) + */ + public static int getMaxYear() { + return BASE_YEAR + LUNAR_CODE.length - 1; + } + + /** + * 传回农历 y年的总天数 + * + * @param y 年 + * @return 总天数 + */ + public static int yearDays(int y) { + int i, sum = 348; + for (i = 0x8000; i > 0x8; i >>= 1) { + if ((getCode(y) & i) != 0) + sum += 1; + } + return (sum + leapDays(y)); + } + + /** + * 传回农历 y年闰月的天数 + * + * @param y 年 + * @return 闰月的天数 + */ + public static int leapDays(int y) { + if (leapMonth(y) != 0) { + return (getCode(y) & 0x10000) != 0 ? 30 : 29; + } + + return 0; + } + + /** + * 传回农历 y年m月的总天数 + * + * @param y 年 + * @param m 月 + * @return 总天数 + */ + public static int monthDays(int y, int m) { + return (getCode(y) & (0x10000 >> m)) == 0 ? 29 : 30; + } + + /** + * 传回农历 y年闰哪个月 1-12 , 没闰传回 0 + * + * @param y 年 + * @return 润的月, 没闰传回 0 + */ + public static int leapMonth(int y) { + return (int) (getCode(y) & 0xf); + } + + /** + * 获取对应年的农历信息 + * + * @param year 年 + * @return 农历信息 + */ + private static long getCode(int year) { + return LUNAR_CODE[year - BASE_YEAR]; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/SolarTerms.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/SolarTerms.java new file mode 100644 index 000000000..b4f1cc934 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/SolarTerms.java @@ -0,0 +1,115 @@ +package cn.hutool.core.date.chinese; + +import cn.hutool.core.util.NumberUtil; + +/** + * 24节气相关信息 + * + * @author looly + * @since 5.4.1 + */ +public class SolarTerms { + + /** + * 根据节气修正干支月 + * + * @param y 月 + * @param n 节气 + * @return 干支月 + */ + public static int getTerm(int y, int n) { + if (y < 1900 || y > 2100) { + return -1; + } + if (n < 1 || n > 24) { + return -1; + } + + String _table = sTermInfo[y - 1900]; + Integer[] _info = new Integer[6]; + for (int i = 0; i < 6; i++) { + _info[i] = NumberUtil.parseInt("0x" + _table.substring(i * 5, 5 * (i + 1))); + } + String[] _calday = new String[24]; + for (int i = 0; i < 6; i++) { + _calday[4 * i] = _info[i].toString().substring(0, 1); + _calday[4 * i + 1] = _info[i].toString().substring(1, 3); + _calday[4 * i + 2] = _info[i].toString().substring(3, 4); + _calday[4 * i + 3] = _info[i].toString().substring(4, 6); + } + return NumberUtil.parseInt(_calday[n - 1]); + } + + /** + * 1900-2100各年的24节气日期速查表 + * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js + */ + private static final String[] sTermInfo = new String[]{ + "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", + "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", + "b027097bd097c36b0b6fc9274c91aa", "9778397bd19801ec9210c965cc920e", "97b6b97bd19801ec95f8c965cc920f", + "97bd09801d98082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd197c36c9210c9274c91aa", + "97b6b97bd19801ec95f8c965cc920e", "97bd09801d98082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec95f8c965cc920e", "97bcf97c3598082c95f8e1cfcc920f", + "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec9210c965cc920e", + "97bcf97c3598082c95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", + "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", + "97bcf97c359801ec95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd097bd07f595b0b6fc920fb0722", + "9778397bd097c36b0b6fc9210c8dc2", "9778397bd19801ec9210c9274c920e", "97b6b97bd19801ec95f8c965cc920f", + "97bd07f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c920e", + "97b6b97bd19801ec95f8c965cc920f", "97bd07f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bd07f1487f595b0b0bc920fb0722", + "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", + "97bcf7f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", + "97bcf7f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", + "97b6b97bd19801ec9210c9274c920e", "97bcf7f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9210c91aa", "97b6b97bd197c36c9210c9274c920e", "97bcf7f0e47f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c920e", + "97b6b7f0e47f531b0723b0b6fb0722", "7f0e37f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", + "9778397bd097c36b0b70c9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e37f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc9210c8dc2", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", + "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9274c91aa", + "97b6b7f0e47f531b0723b0787b0721", "7f0e27f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", + "9778397bd097c36b0b6fc9210c91aa", "97b6b7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "977837f0e37f149b0723b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f5307f595b0b0bc920fb0722", "7f0e397bd097c35b0b6fc9210c8dc2", + "977837f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e37f1487f595b0b0bb0b6fb0722", + "7f0e397bd097c35b0b6fc9210c8dc2", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", + "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0787b06bd", + "7f07e7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", + "977837f0e37f14998082b0723b06bd", "7f07e7f0e37f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f1487f595b0b0bb0b6fb0722", "7f0e37f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f1487f531b0b0bb0b6fb0722", + "7f0e37f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e37f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b072297c35", + "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", + "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f149b0723b0787b0721", + "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0723b06bd", + "7f07e7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", "7f0e37f0e366aa89801eb072297c35", + "7ec967f0e37f14998082b0723b06bd", "7f07e7f0e37f14998083b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", + "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14898082b0723b02d5", "7f07e7f0e37f14998082b0787b0721", + "7f07e7f0e47f531b0723b0b6fb0722", "7f0e36665b66aa89801e9808297c35", "665f67f0e37f14898082b0723b02d5", + "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e36665b66a449801e9808297c35", + "665f67f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", + "7f0e36665b66a449801e9808297c35", "665f67f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", + "7f07e7f0e47f531b0723b0b6fb0721", "7f0e26665b66a449801e9808297c35", "665f67f0e37f1489801eb072297c35", + "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722"}; +} diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/package-info.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/package-info.java new file mode 100644 index 000000000..b4914f752 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/package-info.java @@ -0,0 +1,7 @@ +/** + * 农历相关类汇总,包括农历月、天干地支、农历节日、24节气等 + * + * @author looly + * + */ +package cn.hutool.core.date.chinese; \ No newline at end of file diff --git a/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java b/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java index d629652ed..9df3cc4f1 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java @@ -53,7 +53,7 @@ public class ChineseDateTest { Assert.assertEquals("壬申年癸丑月丁亥日",cyclicalYMD); } @Test - public void getCyclicalYMDTest_2(){ + public void getCyclicalYMDTest2(){ //通过农历构建 ChineseDate chineseDate = new ChineseDate(1992,12,14); String cyclicalYMD = chineseDate.getCyclicalYMD(); diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java index 2637a30c5..875805e21 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java @@ -30,6 +30,7 @@ import java.net.HttpCookie; import java.net.HttpURLConnection; import java.net.Proxy; import java.net.URLStreamHandler; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -413,6 +414,18 @@ public class HttpRequest extends HttpBase { return this; } + /** + * 设置Cookie
+ * 自定义Cookie后会覆盖Hutool的默认Cookie行为 + * + * @param cookies Cookie值数组,如果为{@code null}则设置无效,使用默认Cookie行为 + * @return this + * @since 5.4.1 + */ + public HttpRequest cookie(Collection cookies) { + return cookie(CollUtil.isEmpty(cookies) ? null : cookies.toArray(new HttpCookie[0])); + } + /** * 设置Cookie
* 自定义Cookie后会覆盖Hutool的默认Cookie行为 diff --git a/hutool-http/src/test/java/cn/hutool/http/test/HttpsTest.java b/hutool-http/src/test/java/cn/hutool/http/test/HttpsTest.java index 448caf418..fca3e6cc1 100644 --- a/hutool-http/src/test/java/cn/hutool/http/test/HttpsTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/test/HttpsTest.java @@ -25,5 +25,4 @@ public class HttpsTest { } ThreadUtil.sync(this); } - }