format(final DateTimeFormatter dateTimeFormatter) {
+ return LambdaKit.toFunction(Formatter::format, dateTimeFormatter);
+ }
+
+ /**
+ * 创建{@link SimpleDateFormat},注意此对象非线程安全!
+ * 此对象默认为严格格式模式,即parse时如果格式不正确会报错。
+ *
+ * @param pattern 表达式
+ * @return {@link SimpleDateFormat}
+ */
+ public static SimpleDateFormat newSimpleFormat(final String pattern) {
+ return newSimpleFormat(pattern, null, null);
+ }
+
+ /**
+ * 创建{@link SimpleDateFormat},注意此对象非线程安全!
+ * 此对象默认为严格格式模式,即parse时如果格式不正确会报错。
+ *
+ * @param pattern 表达式
+ * @param locale {@link Locale},{@code null}表示默认
+ * @param timeZone {@link TimeZone},{@code null}表示默认
+ * @return {@link SimpleDateFormat}
+ */
+ public static SimpleDateFormat newSimpleFormat(final String pattern, Locale locale, final TimeZone timeZone) {
+ if (null == locale) {
+ locale = Locale.getDefault(Locale.Category.FORMAT);
+ }
+ final SimpleDateFormat format = new SimpleDateFormat(pattern, locale);
+ if (null != timeZone) {
+ format.setTimeZone(timeZone);
+ }
+ format.setLenient(false);
+ return format;
}
}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/Modifier.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/Modifier.java
index 6b63a29b4a..1a8e0079fc 100644
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/Modifier.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/Modifier.java
@@ -25,12 +25,10 @@
********************************************************************************/
package org.miaixz.bus.core.center.date;
-import org.miaixz.bus.core.lang.Fields;
+import org.miaixz.bus.core.center.date.culture.en.Modify;
import org.miaixz.bus.core.xyz.ArrayKit;
import org.miaixz.bus.core.xyz.DateKit;
-import java.util.Calendar;
-
/**
* 日期修改器
* 用于实现自定义某个日期字段的调整,包括:
@@ -50,23 +48,23 @@ public class Modifier {
* 忽略的计算的字段
*/
private static final int[] IGNORE_FIELDS = new int[]{
- Calendar.HOUR_OF_DAY, // 与HOUR同名
- Calendar.AM_PM, // 此字段单独处理,不参与计算起始和结束
- Calendar.DAY_OF_WEEK_IN_MONTH, // 不参与计算
- Calendar.DAY_OF_YEAR, // DAY_OF_MONTH体现
- Calendar.WEEK_OF_MONTH, // 特殊处理
- Calendar.WEEK_OF_YEAR // WEEK_OF_MONTH体现
+ java.util.Calendar.HOUR_OF_DAY, // 与HOUR同名
+ java.util.Calendar.AM_PM, // 此字段单独处理,不参与计算起始和结束
+ java.util.Calendar.DAY_OF_WEEK_IN_MONTH, // 不参与计算
+ java.util.Calendar.DAY_OF_YEAR, // DAY_OF_MONTH体现
+ java.util.Calendar.WEEK_OF_MONTH, // 特殊处理
+ java.util.Calendar.WEEK_OF_YEAR // WEEK_OF_MONTH体现
};
/**
* 修改日期
*
- * @param calendar {@link Calendar}
+ * @param calendar {@link java.util.Calendar}
* @param dateField 日期字段,即保留到哪个日期字段
* @param modify 修改类型,包括舍去、四舍五入、进一等
* @return 修改后的{@link Calendar}
*/
- public static Calendar modify(final Calendar calendar, final int dateField, final Fields.Modify modify) {
+ public static java.util.Calendar modify(final java.util.Calendar calendar, final int dateField, final Modify modify) {
return modify(calendar, dateField, modify, false);
}
@@ -75,41 +73,41 @@ public static Calendar modify(final Calendar calendar, final int dateField, fina
* 可选是否归零毫秒
*
*
- * 在{@link Fields.Modify#TRUNCATE}模式下,毫秒始终要归零,
- * 但是在{@link Fields.Modify#CEILING}和{@link Fields.Modify#ROUND}模式下,
+ * 在{@link Modify#TRUNCATE}模式下,毫秒始终要归零,
+ * 但是在{@link Modify#CEILING}和{@link Modify#ROUND}模式下,
* 有时候由于毫秒部分必须为0(如MySQL数据库中),因此在此加上选项。
*
*
- * @param calendar {@link Calendar}
+ * @param calendar {@link java.util.Calendar}
* @param dateField 日期字段,即保留到哪个日期字段
* @param modify 修改类型,包括舍去、四舍五入、进一等
* @param truncateMillisecond 是否归零毫秒
* @return 修改后的{@link Calendar}
*/
- public static Calendar modify(final Calendar calendar, final int dateField, final Fields.Modify modify, final boolean truncateMillisecond) {
+ public static java.util.Calendar modify(final java.util.Calendar calendar, final int dateField, final Modify modify, final boolean truncateMillisecond) {
// AM_PM上下午特殊处理
- if (Calendar.AM_PM == dateField) {
+ if (java.util.Calendar.AM_PM == dateField) {
final boolean isAM = DateKit.isAM(calendar);
switch (modify) {
case TRUNCATE:
- calendar.set(Calendar.HOUR_OF_DAY, isAM ? 0 : 12);
+ calendar.set(java.util.Calendar.HOUR_OF_DAY, isAM ? 0 : 12);
break;
case CEILING:
- calendar.set(Calendar.HOUR_OF_DAY, isAM ? 11 : 23);
+ calendar.set(java.util.Calendar.HOUR_OF_DAY, isAM ? 11 : 23);
break;
case ROUND:
final int min = isAM ? 0 : 12;
final int max = isAM ? 11 : 23;
final int href = (max - min) / 2 + 1;
- final int value = calendar.get(Calendar.HOUR_OF_DAY);
- calendar.set(Calendar.HOUR_OF_DAY, (value < href) ? min : max);
+ final int value = calendar.get(java.util.Calendar.HOUR_OF_DAY);
+ calendar.set(java.util.Calendar.HOUR_OF_DAY, (value < href) ? min : max);
break;
}
// 处理下一级别字段
return modify(calendar, dateField + 1, modify);
}
- final int endField = truncateMillisecond ? Calendar.SECOND : Calendar.MILLISECOND;
+ final int endField = truncateMillisecond ? java.util.Calendar.SECOND : java.util.Calendar.MILLISECOND;
// 循环处理各级字段,精确到毫秒字段
for (int i = dateField + 1; i <= endField; i++) {
if (ArrayKit.contains(IGNORE_FIELDS, i)) {
@@ -118,13 +116,13 @@ public static Calendar modify(final Calendar calendar, final int dateField, fina
}
// 在计算本周的起始和结束日时,月相关的字段忽略。
- if (Calendar.WEEK_OF_MONTH == dateField || Calendar.WEEK_OF_YEAR == dateField) {
- if (Calendar.DAY_OF_MONTH == i) {
+ if (java.util.Calendar.WEEK_OF_MONTH == dateField || java.util.Calendar.WEEK_OF_YEAR == dateField) {
+ if (java.util.Calendar.DAY_OF_MONTH == i) {
continue;
}
} else {
// 其它情况忽略周相关字段计算
- if (Calendar.DAY_OF_WEEK == i) {
+ if (java.util.Calendar.DAY_OF_WEEK == i) {
continue;
}
}
@@ -133,7 +131,7 @@ public static Calendar modify(final Calendar calendar, final int dateField, fina
}
if (truncateMillisecond) {
- calendar.set(Calendar.MILLISECOND, 0);
+ calendar.set(java.util.Calendar.MILLISECOND, 0);
}
return calendar;
@@ -142,28 +140,28 @@ public static Calendar modify(final Calendar calendar, final int dateField, fina
/**
* 修改日期字段值
*
- * @param calendar {@link Calendar}
- * @param field 字段,见{@link Calendar}
- * @param modify {@link Fields.Modify}
+ * @param calendar {@link java.util.Calendar}
+ * @param field 字段,见{@link java.util.Calendar}
+ * @param modify {@link Modify}
*/
- private static void modifyField(final Calendar calendar, int field, final Fields.Modify modify) {
- if (Calendar.HOUR == field) {
+ private static void modifyField(final java.util.Calendar calendar, int field, final Modify modify) {
+ if (java.util.Calendar.HOUR == field) {
// 修正小时。HOUR为12小时制,上午的结束时间为12:00,此处改为HOUR_OF_DAY: 23:59
- field = Calendar.HOUR_OF_DAY;
+ field = java.util.Calendar.HOUR_OF_DAY;
}
switch (modify) {
case TRUNCATE:
- calendar.set(field, Calendars.getBeginValue(calendar, field));
+ calendar.set(field, Calendar.getBeginValue(calendar, field));
break;
case CEILING:
- calendar.set(field, Calendars.getEndValue(calendar, field));
+ calendar.set(field, Calendar.getEndValue(calendar, field));
break;
case ROUND:
- final int min = Calendars.getBeginValue(calendar, field);
- final int max = Calendars.getEndValue(calendar, field);
+ final int min = Calendar.getBeginValue(calendar, field);
+ final int max = Calendar.getEndValue(calendar, field);
final int href;
- if (Calendar.DAY_OF_WEEK == field) {
+ if (java.util.Calendar.DAY_OF_WEEK == field) {
// 星期特殊处理,假设周一是第一天,中间的为周四
href = (min + 3) % 7;
} else {
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/Resolver.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/Resolver.java
index ebd16f7578..3f73148c1e 100644
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/Resolver.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/Resolver.java
@@ -26,12 +26,21 @@
package org.miaixz.bus.core.center.date;
import org.miaixz.bus.core.center.date.format.CustomFormat;
+import org.miaixz.bus.core.center.date.format.FormatBuilder;
+import org.miaixz.bus.core.center.date.format.parser.PositionDateParser;
import org.miaixz.bus.core.lang.Fields;
+import org.miaixz.bus.core.lang.Symbol;
+import org.miaixz.bus.core.lang.exception.DateException;
+import org.miaixz.bus.core.text.CharsBacker;
import org.miaixz.bus.core.xyz.StringKit;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Locale;
/**
* 日期解析
@@ -41,6 +50,93 @@
*/
public class Resolver extends Converter {
+
+ /**
+ * 构建DateTime对象
+ *
+ * @param dateStr Date字符串
+ * @param dateFormat 格式化器 {@link SimpleDateFormat}
+ * @return DateTime对象
+ */
+ public static DateTime parse(final CharSequence dateStr, final DateFormat dateFormat) {
+ return new DateTime(dateStr, dateFormat);
+ }
+
+ /**
+ * 构建DateTime对象
+ *
+ * @param dateStr Date字符串
+ * @param parser 格式化器,{@link FormatBuilder}
+ * @return DateTime对象
+ */
+ public static DateTime parse(final CharSequence dateStr, final PositionDateParser parser) {
+ return new DateTime(dateStr, parser);
+ }
+
+ /**
+ * 构建DateTime对象
+ *
+ * @param dateStr Date字符串
+ * @param parser 格式化器,{@link FormatBuilder}
+ * @param lenient 是否宽容模式
+ * @return DateTime对象
+ */
+ public static DateTime parse(final CharSequence dateStr, final PositionDateParser parser, final boolean lenient) {
+ return new DateTime(dateStr, parser, lenient);
+ }
+
+ /**
+ * 构建DateTime对象
+ *
+ * @param dateStr Date字符串
+ * @param formatter 格式化器,{@link DateTimeFormatter}
+ * @return DateTime对象
+ */
+ public static DateTime parse(final CharSequence dateStr, final DateTimeFormatter formatter) {
+ return new DateTime(dateStr, formatter);
+ }
+
+ /**
+ * 将特定格式的日期转换为Date对象
+ *
+ * @param dateStr 特定格式的日期
+ * @param format 格式,例如yyyy-MM-dd
+ * @return 日期对象
+ */
+ public static DateTime parse(final CharSequence dateStr, final String format) {
+ return new DateTime(dateStr, format);
+ }
+
+ /**
+ * 将特定格式的日期转换为Date对象
+ *
+ * @param dateStr 特定格式的日期
+ * @param format 格式,例如yyyy-MM-dd
+ * @param locale 区域信息
+ * @return 日期对象
+ */
+ public static DateTime parse(final CharSequence dateStr, final String format, final Locale locale) {
+ if (CustomFormat.isCustomFormat(format)) {
+ // 自定义格式化器忽略Locale
+ return new DateTime(CustomFormat.parse(dateStr, format));
+ }
+ return new DateTime(dateStr, newSimpleFormat(format, locale, null));
+ }
+
+ /**
+ * 通过给定的日期格式解析日期时间字符串
+ * 传入的日期格式会逐个尝试,直到解析成功,返回{@link DateTime}对象,否则抛出{@link DateException}异常
+ *
+ * @param text 日期时间字符串,非空
+ * @param parsePatterns 需要尝试的日期时间格式数组,非空, 见SimpleDateFormat
+ * @return 解析后的Date
+ * @throws IllegalArgumentException if the date string or pattern array is null
+ * @throws DateException if none of the date patterns were suitable
+ */
+ public static DateTime parse(final String text, final String... parsePatterns) throws DateException {
+ return date(Calendar.parseByPatterns(text, parsePatterns));
+ }
+
/**
* 解析日期时间字符串为{@link LocalDateTime}
*
@@ -54,7 +150,7 @@ public static LocalDateTime parseTime(CharSequence text, final String format) {
}
if (CustomFormat.isCustomFormat(format)) {
- return of(CustomFormat.parse(text, format));
+ return of(CustomFormat.parse(text, format).toInstant());
}
DateTimeFormatter formatter = null;
@@ -155,4 +251,67 @@ public static LocalDateTime parseTimeByISO(final CharSequence text) {
}
}
+ /**
+ * 标准化日期,默认处理以空格区分的日期时间格式,空格前为日期,空格后为时间:
+ * 将以下字符替换为"-"
+ *
+ *
+ * "."
+ * "/"
+ * "年"
+ * "月"
+ *
+ *
+ * 将以下字符去除
+ *
+ *
+ * "日"
+ *
+ *
+ * 将以下字符替换为":"
+ *
+ *
+ * "时"
+ * "分"
+ * "秒"
+ *
+ *
+ * 当末位是":"时去除之(不存在毫秒时)
+ *
+ * @param dateStr 日期时间字符串
+ * @return 格式化后的日期字符串
+ */
+ public static String normalize(final CharSequence dateStr) {
+ if (StringKit.isBlank(dateStr)) {
+ return StringKit.toString(dateStr);
+ }
+
+ // 日期时间分开处理
+ final List dateAndTime = CharsBacker.splitTrim(dateStr, Symbol.SPACE);
+ final int size = dateAndTime.size();
+ if (size < 1 || size > 2) {
+ // 非可被标准处理的格式
+ return StringKit.toString(dateStr);
+ }
+
+ final StringBuilder builder = StringKit.builder();
+
+ // 日期部分("\"、"/"、"."、"年"、"月"都替换为"-")
+ String datePart = dateAndTime.get(0).replaceAll("[/.年月]", Symbol.MINUS);
+ datePart = StringKit.removeSuffix(datePart, "日");
+ builder.append(datePart);
+
+ // 时间部分
+ if (size == 2) {
+ builder.append(Symbol.C_SPACE);
+ String timePart = dateAndTime.get(1).replaceAll("[时分秒]", Symbol.COLON);
+ timePart = StringKit.removeSuffix(timePart, Symbol.COLON);
+ //将ISO8601中的逗号替换为.
+ timePart = timePart.replace(Symbol.C_COMMA, '.');
+ builder.append(timePart);
+ }
+
+ return builder.toString();
+ }
+
}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/Zodiac.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/Zodiac.java
deleted file mode 100644
index 8835537965..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/Zodiac.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date;
-
-import org.miaixz.bus.core.lang.Assert;
-import org.miaixz.bus.core.lang.Fields;
-import org.miaixz.bus.core.xyz.DateKit;
-
-import java.util.Calendar;
-import java.util.Date;
-
-/**
- * 星座 来自:https://blog.csdn.net/u010758605/article/details/48317881
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class Zodiac {
-
- /**
- * 星座分隔时间日
- */
- private static final int[] DAY_ARR = new int[]{20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22};
- /**
- * 星座
- */
- private static final String[] ZODIACS = new String[]{"摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座"};
- private static final String[] CHINESE_ZODIACS = new String[]{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};
-
- /**
- * 通过生日计算星座
- *
- * @param date 出生日期
- * @return 星座名
- */
- public static String getZodiac(final Date date) {
- return getZodiac(DateKit.calendar(date));
- }
-
- /**
- * 通过生日计算星座
- *
- * @param calendar 出生日期
- * @return 星座名
- */
- public static String getZodiac(final Calendar calendar) {
- if (null == calendar) {
- return null;
- }
- return getZodiac(calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
- }
-
- /**
- * 通过生日计算星座
- *
- * @param month 月,从0开始计数
- * @param day 天
- * @return 星座名
- */
- public static String getZodiac(final Fields.Month month, final int day) {
- return getZodiac(month.getValue(), day);
- }
-
- /**
- * 通过生日计算星座
- *
- * @param month 月,从0开始计数,见{@link Fields.Month#getValue()}
- * @param day 天
- * @return 星座名
- */
- public static String getZodiac(final int month, final int day) {
- Assert.checkBetween(month,
- Fields.Month.JANUARY.getValue(),
- Fields.Month.DECEMBER.getValue(),
- "Unsupported month value, must be [0,12]");
- // 在分隔日前为前一个星座,否则为后一个星座
- return day < DAY_ARR[month] ? ZODIACS[month] : ZODIACS[month + 1];
- }
-
- /**
- * 通过生日计算生肖,只计算1900年后出生的人
- *
- * @param date 出生日期(年需农历)
- * @return 星座名
- */
- public static String getChineseZodiac(final Date date) {
- return getChineseZodiac(DateKit.calendar(date));
- }
-
- /**
- * 通过生日计算生肖,只计算1900年后出生的人
- *
- * @param calendar 出生日期(年需农历)
- * @return 星座名
- */
- public static String getChineseZodiac(final Calendar calendar) {
- if (null == calendar) {
- return null;
- }
- return getChineseZodiac(calendar.get(Calendar.YEAR));
- }
-
- /**
- * 计算生肖,只计算1900年后出生的人
- *
- * @param year 农历年
- * @return 生肖名
- */
- public static String getChineseZodiac(final int year) {
- if (year < 1900) {
- return null;
- }
- return CHINESE_ZODIACS[(year - 1900) % CHINESE_ZODIACS.length];
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ChineseDate.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ChineseDate.java
deleted file mode 100644
index 9d2b4f579d..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ChineseDate.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-import org.miaixz.bus.core.center.date.Calendars;
-import org.miaixz.bus.core.center.date.Resolver;
-import org.miaixz.bus.core.lang.Assert;
-import org.miaixz.bus.core.math.ChineseNumberFormatter;
-import org.miaixz.bus.core.xyz.DateKit;
-import org.miaixz.bus.core.xyz.StringKit;
-
-import java.time.LocalDate;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Objects;
-
-/**
- * 农历日期工具,最大支持到2099年,支持:
- *
- *
- * - 通过公历日期构造获取对应农历
- * - 通过农历日期直接构造
- *
- *
- * 规范参考:GB/T 33661-2017
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class ChineseDate {
-
- //农历年
- private final int year;
- //农历月,润N月这个值就是N+1,其他月按照显示月份赋值
- private final int month;
- // 当前月份是否闰月
- private final boolean isLeapMonth;
- //农历日
- private final int day;
-
- //公历年
- private final int gyear;
- //公历月,从1开始计数
- private final int gmonthBase1;
- //公历日
- private final int gday;
-
- /**
- * 通过公历日期构造
- *
- * @param date 公历日期
- */
- public ChineseDate(final Date date) {
- this(Resolver.ofDate(Assert.notNull(date.toInstant())));
- }
-
- /**
- * 通过公历日期构造
- *
- * @param localDate 公历日期
- */
- public ChineseDate(final LocalDate localDate) {
- // 公历
- gyear = localDate.getYear();
- gmonthBase1 = localDate.getMonthValue();
- gday = localDate.getDayOfMonth();
-
- // 求出和1900年1月31日相差的天数
- int offset = (int) (localDate.toEpochDay() - LunarInfo.BASE_DAY);
-
- // 计算农历年份
- // 用offset减去每农历年的天数,计算当天是农历第几天,offset是当年的第几天
- int daysOfYear;
- int iYear;
- for (iYear = LunarInfo.BASE_YEAR; iYear <= LunarInfo.MAX_YEAR; iYear++) {
- daysOfYear = LunarInfo.yearDays(iYear);
- if (offset < daysOfYear) {
- break;
- }
- offset -= daysOfYear;
- }
-
- year = iYear;
- // 计算农历月份
- final int leapMonth = LunarInfo.leapMonth(iYear); // 闰哪个月,1-12
- // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
- int month;
- int daysOfMonth;
- boolean hasLeapMonth = false;
- for (month = 1; month < 13; month++) {
- // 闰月,如润的是五月,则5表示五月,6表示润五月
- if (leapMonth > 0 && month == (leapMonth + 1)) {
- daysOfMonth = LunarInfo.leapDays(year);
- hasLeapMonth = true;
- } else {
- // 普通月,当前面的月份存在闰月时,普通月份要-1,递补闰月的数字
- // 如2月是闰月,此时3月实际是第四个月
- daysOfMonth = LunarInfo.monthDays(year, hasLeapMonth ? month - 1 : month);
- }
-
- if (offset < daysOfMonth) {
- // offset不足月,结束
- break;
- }
- offset -= daysOfMonth;
- }
-
- this.isLeapMonth = leapMonth > 0 && (month == (leapMonth + 1));
- if (hasLeapMonth && !this.isLeapMonth) {
- // 当前月份前有闰月,则月份显示要-1,除非当前月份就是润月
- month--;
- }
- this.month = month;
- this.day = offset + 1;
- }
-
- /**
- * 构造方法传入日期
- * 此方法自动判断闰月,如果chineseMonth为本年的闰月,则按照闰月计算
- *
- * @param chineseYear 农历年
- * @param chineseMonth 农历月,1表示一月(正月)
- * @param chineseDay 农历日,1表示初一
- */
- public ChineseDate(final int chineseYear, final int chineseMonth, final int chineseDay) {
- this(chineseYear, chineseMonth, chineseDay, chineseMonth == LunarInfo.leapMonth(chineseYear));
- }
-
- /**
- * 构造方法传入日期
- * 通过isLeapMonth参数区分是否闰月,如五月是闰月,当isLeapMonth为{@code true}时,表示润五月,{@code false}表示五月
- *
- * @param chineseYear 农历年
- * @param chineseMonth 农历月,1表示一月(正月),如果isLeapMonth为{@code true},1表示润一月
- * @param chineseDay 农历日,1表示初一
- * @param isLeapMonth 当前月份是否闰月
- */
- public ChineseDate(final int chineseYear, final int chineseMonth, final int chineseDay, boolean isLeapMonth) {
- if (chineseMonth != LunarInfo.leapMonth(chineseYear)) {
- // 用户传入的月份可能非闰月,此时此参数无效。
- isLeapMonth = false;
- }
-
- this.day = chineseDay;
- // 当月是闰月的后边的月定义为闰月,如润的是五月,则5表示五月,6表示润五月
- this.isLeapMonth = isLeapMonth;
- // 闰月时,农历月份+1,如6表示润五月
- this.month = isLeapMonth ? chineseMonth + 1 : chineseMonth;
- this.year = chineseYear;
-
- final org.miaixz.bus.core.center.date.DateTime dateTime = lunar2solar(chineseYear, chineseMonth, chineseDay, isLeapMonth);
- if (null != dateTime) {
- //初始化公历年
- this.gday = dateTime.dayOfMonth();
- //初始化公历月
- this.gmonthBase1 = dateTime.month() + 1;
- //初始化公历日
- this.gyear = dateTime.year();
- } else {
- //初始化公历年
- this.gday = -1;
- //初始化公历月
- this.gmonthBase1 = -1;
- //初始化公历日
- this.gyear = -1;
- }
- }
-
- /**
- * 获得农历年份
- *
- * @return 返回农历年份
- */
- public int getChineseYear() {
- return this.year;
- }
-
- /**
- * 获取公历的年
- *
- * @return 公历年
- */
- public int getGregorianYear() {
- return this.gyear;
- }
-
- /**
- * 获取农历的月,从1开始计数
- * 此方法返回实际的月序号,如一月是闰月,则一月返回1,润一月返回2
- *
- * @return 农历的月
- */
- public int getMonth() {
- return this.month;
- }
-
- /**
- * 获取公历的月,从1开始计数
- *
- * @return 公历月
- */
- public int getGregorianMonthBase1() {
- return this.gmonthBase1;
- }
-
- /**
- * 获取公历的月,从0开始计数
- *
- * @return 公历月
- */
- public int getGregorianMonth() {
- return this.gmonthBase1 - 1;
- }
-
- /**
- * 当前农历月份是否为闰月
- *
- * @return 是否为闰月
- */
- public boolean isLeapMonth() {
- return this.isLeapMonth;
- }
-
-
- /**
- * 获得农历月份(中文,例如二月,十二月,或者润一月)
- *
- * @return 返回农历月份
- */
- public String getChineseMonth() {
- return getChineseMonth(false);
- }
-
- /**
- * 获得农历月称呼(中文,例如二月,腊月,或者润正月)
- *
- * @return 返回农历月份称呼
- */
- public String getChineseMonthName() {
- return getChineseMonth(true);
- }
-
- /**
- * 获得农历月份(中文,例如二月,十二月,或者润一月)
- *
- * @param isTraditional 是否传统表示,例如一月传统表示为正月
- * @return 返回农历月份
- */
- public String getChineseMonth(final boolean isTraditional) {
- return ChineseMonth.getChineseMonthName(isLeapMonth(),
- isLeapMonth() ? this.month - 1 : this.month, isTraditional);
- }
-
- /**
- * 获取农历的日,从1开始计数
- *
- * @return 农历的日,从1开始计数
- */
- public int getDay() {
- return this.day;
- }
-
- /**
- * 获取公历的日
- *
- * @return 公历日
- */
- public int getGregorianDay() {
- return this.gday;
- }
-
- /**
- * 获得农历日
- *
- * @return 获得农历日
- */
- public String getChineseDay() {
- final String[] chineseTen = {"初", "十", "廿", "卅"};
- final int n = (day % 10 == 0) ? 9 : (day % 10 - 1);
- if (day > 30) {
- return "";
- }
- switch (day) {
- case 10:
- return "初十";
- case 20:
- return "二十";
- case 30:
- return "三十";
- default:
- return chineseTen[day / 10] + ChineseNumberFormatter.of().format(n + 1);
- }
- }
-
- /**
- * 获取公历的Date
- *
- * @return 公历Date
- */
- public Date getGregorianDate() {
- return DateKit.date(getGregorianCalendar());
- }
-
- /**
- * 获取公历的Calendar
- *
- * @return 公历Calendar
- */
- public Calendar getGregorianCalendar() {
- final Calendar calendar = Calendars.calendar();
- //noinspection MagicConstant
- calendar.set(this.gyear, getGregorianMonth(), this.gday, 0, 0, 0);
- return calendar;
- }
-
- /**
- * 获得节日,闰月不计入节日中
- *
- * @return 获得农历节日
- */
- public String getFestivals() {
- return StringKit.join(",", LunarFestival.getFestivals(this.year, this.month, day));
- }
-
- /**
- * 获得年份生肖
- *
- * @return 获得年份生肖
- */
- public String getChineseZodiac() {
- return org.miaixz.bus.core.center.date.Zodiac.getChineseZodiac(this.year);
- }
-
-
- /**
- * 获得年的天干地支
- *
- * @return 获得天干地支
- */
- public String getCyclical() {
- return GanZhi.getGanzhiOfYear(this.year);
- }
-
- /**
- * 获得节气
- *
- * @return 获得节气
- */
- public String getTerm() {
- return SolarTerms.getTerm(gyear, gmonthBase1, gday);
- }
-
- /**
- * 转换为标准的日期格式来表示农历日期
- * 例如2020-01-13 如果存在闰月,显示闰月月份,如润二月显示2
- *
- * @return 标准的日期格式
- */
- public String toStringNormal() {
- return String.format("%04d-%02d-%02d", this.year,
- isLeapMonth() ? this.month - 1 : this.month, this.day);
- }
-
- @Override
- public String toString() {
- return toString(ChineseDateFormat.GXSS);
- }
-
- /**
- * 获取标准化农历日期
- * 支持格式
- *
- * - {@link ChineseDateFormat#GSS} 干支纪年 数序纪月 数序纪日
- * - {@link ChineseDateFormat#XSS} 生肖纪年 数序纪月 数序纪日
- * - {@link ChineseDateFormat#GXSS} 干支生肖纪年 数序纪月(传统表示) 数序纪日日
- * - {@link ChineseDateFormat#GSG} 干支纪年 数序纪月 干支纪日
- * - {@link ChineseDateFormat#GGG} 干支纪年 干支纪月 干支纪日
- * - {@link ChineseDateFormat#MIX} 农历年年首所在的公历年份 干支纪年 数序纪月 数序纪日
- *
- *
- * @param format 选择输出的标准格式
- * @return 获取的标准化农历日期
- */
- public String toString(ChineseDateFormat format) {
- if (null == format) {
- format = ChineseDateFormat.MIX;
- }
-
- final int year = this.year;
- CharSequence dateTemplate = "农历{}年{}{}";
- String normalizedYear = GanZhi.getGanzhiOfYear(year);
- String normalizedMonth = getChineseMonth();
- String normalizedDay = getChineseDay();
- switch (format) {
- case GXSS:
- dateTemplate = "农历{}" + getChineseZodiac() + "年{}{}";
- normalizedMonth = getChineseMonthName();
- break;
- case XSS:
- normalizedYear = getChineseZodiac();
- break;
- case GSG:
- dateTemplate = "农历{}年{}{}日";
- normalizedDay = GanZhi.getGanzhiOfDay(this.gyear, this.gmonthBase1, this.gday);
- break;
- case GGG:
- dateTemplate = "农历{}年{}月{}日";
- normalizedMonth = GanZhi.getGanzhiOfMonth(this.gyear, this.gmonthBase1, this.gday);
- normalizedDay = GanZhi.getGanzhiOfDay(this.gyear, this.gmonthBase1, this.gday);
- break;
- case MIX:
- //根据选择的格式返回不同标准化日期输出,默认为Mix
- dateTemplate = "公元" + this.year + "年农历{}年{}{}";
- case GSS:
- break;
- default:
- throw new IllegalArgumentException("Unsupported format: " + format);
- }
-
- return StringKit.format(dateTemplate,
- normalizedYear,
- normalizedMonth,
- normalizedDay);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- final ChineseDate that = (ChineseDate) o;
- return year == that.year && month == that.month && day == that.day && isLeapMonth == that.isLeapMonth;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(year, month, day, isLeapMonth);
- }
-
- /**
- * 这里同步处理年月日的天干地支信息
- *
- * @param year 公历年
- * @param month 公历月,从1开始
- * @param day 公历日
- * @return 天干地支信息
- */
- private String cyclicalm(final int year, final int month, final int day) {
- return StringKit.format("{}年{}月{}日",
- GanZhi.getGanzhiOfYear(this.year),
- GanZhi.getGanzhiOfMonth(year, month, day),
- GanZhi.getGanzhiOfDay(year, month, day));
- }
-
- /**
- * 通过农历年月日信息 返回公历信息 提供给构造函数
- *
- * @param chineseYear 农历年
- * @param chineseMonth 农历月
- * @param chineseDay 农历日
- * @param isLeapMonth 传入的月是不是闰月
- * @return 公历信息
- */
- private org.miaixz.bus.core.center.date.DateTime lunar2solar(final int chineseYear, final int chineseMonth, final int chineseDay, final boolean isLeapMonth) {
- //超出了最大极限值
- if ((chineseYear == 2100 && chineseMonth == 12 && chineseDay > 1) ||
- (chineseYear == LunarInfo.BASE_YEAR && chineseMonth == 1 && chineseDay < 31)) {
- return null;
- }
- final int day = LunarInfo.monthDays(chineseYear, chineseMonth);
- int _day = day;
- if (isLeapMonth) {
- _day = LunarInfo.leapDays(chineseYear);
- }
- //参数合法性效验
- if (chineseYear < LunarInfo.BASE_YEAR || chineseYear > 2100 || chineseDay > _day) {
- return null;
- }
- //计算农历的时间差
- int offset = 0;
- for (int i = LunarInfo.BASE_YEAR; i < chineseYear; i++) {
- offset += LunarInfo.yearDays(i);
- }
- int leap;
- boolean isAdd = false;
- for (int i = 1; i < chineseMonth; i++) {
- leap = LunarInfo.leapMonth(chineseYear);
- if (!isAdd) {//处理闰月
- if (leap <= i && leap > 0) {
- offset += LunarInfo.leapDays(chineseYear);
- isAdd = true;
- }
- }
- offset += LunarInfo.monthDays(chineseYear, i);
- }
- //转换闰月农历 需补充该年闰月的前一个月的时差
- if (isLeapMonth) {
- offset += day;
- }
- //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) -2203804800000
- return DateKit.date(((offset + chineseDay - 31) * 86400000L) - 2203804800000L);
- }
-
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ChineseMonth.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ChineseMonth.java
deleted file mode 100644
index 2b1d6e8fd0..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ChineseMonth.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-/**
- * 农历月份表示
- * 规范参考:GB/T 33661-2017 的6.2 农历月的命名法。
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class ChineseMonth {
-
- private static final String[] MONTH_NAME = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};
- private static final String[] MONTH_NAME_TRADITIONAL = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "寒", "冬", "腊"};
-
- /**
- * 当前农历月份是否为闰月
- *
- * @param year 农历年
- * @param month 农历月
- * @return 是否为闰月
- */
- public static boolean isLeapMonth(final int year, final int month) {
- return month == LunarInfo.leapMonth(year);
- }
-
- /**
- * 获得农历月称呼
- * 当为传统表示时,表示为二月,腊月,或者润正月等
- * 当为非传统表示时,二月,十二月,或者润一月等
- *
- * @param isLeapMonth 是否闰月
- * @param month 月份,从1开始,如果是闰月,应传入需要显示的月份
- * @param isTraditional 是否传统表示,例如一月传统表示为正月
- * @return 返回农历月份称呼
- */
- public static String getChineseMonthName(final boolean isLeapMonth, final int month, final boolean isTraditional) {
- return (isLeapMonth ? "闰" : "") + (isTraditional ? MONTH_NAME_TRADITIONAL : MONTH_NAME)[month - 1] + "月";
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/GanZhi.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/GanZhi.java
deleted file mode 100644
index 00fd033f43..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/GanZhi.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-import java.time.LocalDate;
-
-/**
- * 天干地支类
- * 天干地支,简称为干支
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class GanZhi {
-
- /**
- * 十天干:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)
- * 十二地支:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)
- * 十二地支对应十二生肖:子-鼠,丑-牛,寅-虎,卯-兔,辰-龙,巳-蛇, 午-马,未-羊,申-猴,酉-鸡,戌-狗,亥-猪
- *
- * @see 天干地支:简称,干支
- */
- private static final String[] GAN = new String[]{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
- private static final String[] ZHI = new String[]{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
-
- /**
- * 传入 月日的offset 传回干支, 0=甲子
- *
- * @param num 月日的offset
- * @return 干支
- */
- public static String cyclicalm(final int num) {
- return (GAN[num % 10] + ZHI[num % 12]);
- }
-
- /**
- * 传入年传回干支
- *
- * @param year 农历年
- * @return 干支
- */
- public static String getGanzhiOfYear(final int year) {
- // 1864年(1900 - 36)是甲子年,用于计算基准的干支年
- return cyclicalm(year - org.miaixz.bus.core.center.date.chinese.LunarInfo.BASE_YEAR + 36);
- }
-
- /**
- * 获取干支月
- *
- * @param year 公历年
- * @param month 公历月,从1开始
- * @param day 公历日
- * @return 干支月
- */
- public static String getGanzhiOfMonth(final int year, final int month, final int day) {
- // 返回当月「节」为几日开始
- final int firstNode = org.miaixz.bus.core.center.date.chinese.SolarTerms.getTerm(year, (month * 2 - 1));
- // 依据12节气修正干支月
- int monthOffset = (year - org.miaixz.bus.core.center.date.chinese.LunarInfo.BASE_YEAR) * 12 + month + 11;
- if (day >= firstNode) {
- monthOffset++;
- }
- return cyclicalm(monthOffset);
- }
-
- /**
- * 获取干支日
- *
- * @param year 公历年
- * @param monthBase1 公历月,从1开始
- * @param day 公历日
- * @return 干支
- */
- public static String getGanzhiOfDay(final int year, final int monthBase1, final int day) {
- // 与1970-01-01相差天数,不包括当天
- final long days = LocalDate.of(year, monthBase1, day).toEpochDay() - 1;
- // 1899-12-21是农历1899年腊月甲子日 41:相差1900-01-31有41天
- return cyclicalm((int) (days - org.miaixz.bus.core.center.date.chinese.LunarInfo.BASE_DAY + 41));
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/LunarFestival.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/LunarFestival.java
deleted file mode 100644
index 6fd8926a2a..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/LunarFestival.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-import org.miaixz.bus.core.center.map.TableMap;
-import org.miaixz.bus.core.xyz.MapKit;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 节假日(农历)封装
- * 由于
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class LunarFestival {
-
- // 农历节日
- // 来自:https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E4%BC%A0%E7%BB%9F%E8%8A%82%E6%97%A5/396100
- private static final TableMap, String> L_FTV = new TableMap<>(16);
-
- static {
- // 节日
- L_FTV.put(MapKit.entry(1, 1), "春节");
- L_FTV.put(MapKit.entry(1, 2), "犬日");
- L_FTV.put(MapKit.entry(1, 3), "猪日");
- L_FTV.put(MapKit.entry(1, 4), "羊日");
- L_FTV.put(MapKit.entry(1, 5), "牛日 破五日");
- L_FTV.put(MapKit.entry(1, 6), "马日 送穷日");
- L_FTV.put(MapKit.entry(1, 7), "人日 人胜节");
- L_FTV.put(MapKit.entry(1, 8), "谷日 八仙日");
- L_FTV.put(MapKit.entry(1, 9), "天日 九皇会");
- L_FTV.put(MapKit.entry(1, 10), "地日 石头生日");
- L_FTV.put(MapKit.entry(1, 12), "火日 老鼠娶媳妇日");
- L_FTV.put(MapKit.entry(1, 13), "上(试)灯日 关公升天日");
- L_FTV.put(MapKit.entry(1, 15), "元宵节 上元节");
- L_FTV.put(MapKit.entry(1, 18), "落灯日");
-
- // 二月
- L_FTV.put(MapKit.entry(2, 1), "中和节 太阳生日");
- L_FTV.put(MapKit.entry(2, 2), "龙头节 龙抬头");
- L_FTV.put(MapKit.entry(2, 12), "花朝节");
- L_FTV.put(MapKit.entry(2, 19), "观世音圣诞");
-
- // 三月
- L_FTV.put(MapKit.entry(3, 3), "上巳节");
-
- // 四月
- L_FTV.put(MapKit.entry(4, 1), "祭雹神");
- L_FTV.put(MapKit.entry(4, 4), "文殊菩萨诞辰");
- L_FTV.put(MapKit.entry(4, 8), "佛诞节");
-
- // 五月
- L_FTV.put(MapKit.entry(5, 5), "端午节 端阳节");
-
- // 六月
- L_FTV.put(MapKit.entry(6, 6), "晒衣节 姑姑节");
- L_FTV.put(MapKit.entry(6, 6), "天贶节");
- L_FTV.put(MapKit.entry(6, 24), "彝族火把节");
-
- // 七月
- L_FTV.put(MapKit.entry(7, 7), "七夕节");
- L_FTV.put(MapKit.entry(7, 14), "鬼节(南方)");
- L_FTV.put(MapKit.entry(7, 15), "中元节");
- L_FTV.put(MapKit.entry(7, 15), "盂兰盆节 中元节");
- L_FTV.put(MapKit.entry(7, 30), "地藏节");
-
- // 八月
- L_FTV.put(MapKit.entry(8, 15), "中秋节");
-
- // 九月
- L_FTV.put(MapKit.entry(9, 9), "重阳节");
-
- // 十月
- L_FTV.put(MapKit.entry(10, 1), "祭祖节");
- L_FTV.put(MapKit.entry(10, 15), "下元节");
-
- // 十一月
- L_FTV.put(MapKit.entry(11, 17), "阿弥陀佛圣诞");
-
- // 腊月
- L_FTV.put(MapKit.entry(12, 8), "腊八节");
- L_FTV.put(MapKit.entry(12, 16), "尾牙");
- L_FTV.put(MapKit.entry(12, 23), "小年");
- L_FTV.put(MapKit.entry(12, 30), "除夕");
- }
-
- /**
- * 获得节日列表
- *
- * @param year 年
- * @param month 月
- * @param day 日
- * @return 获得农历节日
- */
- public static List getFestivals(final int year, final int month, int day) {
- // 春节判断,如果12月是小月,则29为除夕,否则30为除夕
- if (12 == month && 29 == day) {
- if (29 == LunarInfo.monthDays(year, month)) {
- day++;
- }
- }
-
- return getFestivals(month, day);
- }
-
- /**
- * 获得节日列表,此方法无法判断月是否为大月或小月
- *
- * @param month 月
- * @param day 日
- * @return 获得农历节日
- */
- public static List getFestivals(final int month, final int day) {
- return L_FTV.getValues(MapKit.entry(month, day));
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/LunarInfo.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/LunarInfo.java
deleted file mode 100644
index 75875fa12d..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/LunarInfo.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-import java.time.LocalDate;
-
-/**
- * 阴历(农历)信息
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class LunarInfo {
-
- /**
- * 1900年
- */
- public static final int BASE_YEAR = 1900;
- /**
- * 1900-01-31,农历正月初一
- */
- public static final long BASE_DAY = LocalDate.of(BASE_YEAR, 1, 31).toEpochDay();
-
- /**
- * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js
- * 农历表示:
- * 1. 表示当年有无闰年,有的话,为闰月的月份,没有的话,为0。
- * 2-4.为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。
- * 5. 表示闰月是大月还是小月,仅当存在闰月的情况下有意义。
- *
- * 需要注意的是,2057年的节气时间有误差,这个存在争议,见:https://github.com/jjonline/calendar.js/issues/11#issuecomment-607126524
- */
- 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
- };
-
- /**
- * 支持的最大年限
- */
- public static final int MAX_YEAR = BASE_YEAR + LUNAR_CODE.length - 1;
-
- /**
- * 传回农历 y年的总天数
- *
- * @param y 年
- * @return 总天数
- */
- public static int yearDays(final 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年闰月的天数,如果本年无闰月,返回0,区分大小月
- *
- * @param y 农历年
- * @return 闰月的天数
- */
- public static int leapDays(final 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(final int y, final int m) {
- return (getCode(y) & (0x10000 >> m)) == 0 ? 29 : 30;
- }
-
- /**
- * 传回农历 y年闰哪个月 1-12 , 没闰传回 0
- * 此方法会返回润N月中的N,如二月、闰二月都返回2
- *
- * @param y 年
- * @return 润的月, 没闰传回 0
- */
- public static int leapMonth(final int y) {
- return (int) (getCode(y) & 0xf);
- }
-
- /**
- * 获取对应年的农历信息
- *
- * @param year 年
- * @return 农历信息
- */
- private static long getCode(final int year) {
- return LUNAR_CODE[year - BASE_YEAR];
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ShiChen.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ShiChen.java
deleted file mode 100644
index 48508aa9f8..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/ShiChen.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-import org.miaixz.bus.core.center.date.Between;
-import org.miaixz.bus.core.xyz.StringKit;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 时辰转换器,支持宋以后的二十四时辰制度。
- * 本转换器提供以下功能:
- *
- * - 处理包含“时”、“初”或“正”后缀的时辰描述,并自动返回相应的现代时间段。
- * “初”和“正”分别对应每个时辰的前半段和后半段,而不带后缀的“时”描述则涵盖该时辰的完整时间段。
- * - 根据小时数转换为相应的时辰描述,通过{@code isAbs}参数控制是否包含“初”或“正”。
- *
- *
- * 异常情况:
- *
- * - 如果输入的时辰描述无效或不被识别,{@code toModernTime} 方法将抛出 {@code IllegalArgumentException}。
- * - 同样,如果{@code toShiChen}方法接收到无效的小时数,将返回“未知”。
- *
- * 示例:
- *
- * - {@code toModernTime("子时")} 返回的时间段从23点开始到1点结束。
- * - {@code toModernTime("子初")} 返回的时间段从23点开始到0点结束。
- * - {@code toModernTime("子正")} 返回的时间段从0点开始到1点结束。
- * - {@code toShiChen(0, false)} 返回“子正”。
- * - {@code toShiChen(0, true)} 返回“子时”。
- *
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class ShiChen {
-
- private static final Map timeMap = new HashMap<>();
- private static final Map fullTimeMap = new HashMap<>();
- private static final Map hourToShiChenMap = new HashMap<>();
- private static final Map hourToShiChenAbsMap = new HashMap<>();
-
- static {
- // 初始化时辰对应的小时范围
- final String[] times = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
- int hour = 23;
- for (final String time : times) {
- timeMap.put(time + "初", hour % 24);
- timeMap.put(time + "正", (hour + 1) % 24);
- fullTimeMap.put(time, new Integer[]{hour % 24, (hour + 2) % 24});
- hour += 2;
- }
-
- // 初始化小时到时辰的映射
- hour = 23;
- for (final String time : times) {
- hourToShiChenMap.put(hour % 24, time + "初");
- hourToShiChenMap.put((hour + 1) % 24, time + "正");
- hourToShiChenAbsMap.put(hour % 24, time + "时");
- hourToShiChenAbsMap.put((hour + 1) % 24, time + "时");
- hour += 2;
- }
- }
-
- /**
- * 将时辰描述转换为现代时间段。示例:
- *
- * - {@code toModernTime("子时")} 返回的时间段从23点开始到1点结束。
- * - {@code toModernTime("子初")} 返回的时间段从23点开始到0点结束。
- * - {@code toModernTime("子正")} 返回的时间段从0点开始到1点结束。
- *
- *
- * @param shiChen 时辰描述,可以是“时”、“初”或“正”结尾。
- * @return {@link Between} 对象,表示起始和结束时间。
- * @throws IllegalArgumentException 如果输入的时辰描述无效。
- */
- public static Between toModernTime(final String shiChen) {
- if (StringKit.isEmpty(shiChen)) {
- throw new IllegalArgumentException("Invalid shiChen");
- }
- final Integer startHour;
- final Integer endHour;
- final LocalDateTime start;
- final LocalDateTime end;
-
- if (shiChen.endsWith("初") || shiChen.endsWith("正")) {
- startHour = timeMap.get(shiChen);
- if (startHour == null) {
- throw new IllegalArgumentException("Invalid ShiChen time");
- }
- endHour = (startHour + 1) % 24;
- } else {
- final String baseTime = shiChen.replace("时", "");
- final Integer[] hours = fullTimeMap.get(baseTime);
- if (hours == null) {
- throw new IllegalArgumentException("Invalid ShiChen time");
- }
- startHour = hours[0];
- endHour = hours[1];
- }
-
- start = LocalDateTime.now().withHour(startHour).withMinute(0).withSecond(0).withNano(0);
- end = (startHour > endHour) ? start.plusDays(1).withHour(endHour) : start.withHour(endHour);
-
- final Date startDate = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
- final Date endDate = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
-
- return Between.of(startDate, endDate);
- }
-
- /**
- * 根据给定的小时数转换为对应的时辰描述。示例:
- *
- * - {@code toShiChen(0, false)} 返回“子正”。
- * - {@code toShiChen(0, true)} 返回“子时”。
- *
- *
- * @param hour 小时数,应在0到23之间。
- * @param isAbs 是否返回绝对时辰描述(即包含“时”后缀),而不是“初”或“正”。
- * @return 时辰描述,如果小时数无效,则返回“未知”。
- */
- public static String toShiChen(final int hour, final boolean isAbs) {
- String result = hourToShiChenAbsMap.getOrDefault(hour, "未知");
- if (!isAbs && !result.equals("未知")) {
- result = hourToShiChenMap.get(hour);
- }
- return result;
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/SolarTerms.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/SolarTerms.java
deleted file mode 100644
index e7c5bd7007..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/SolarTerms.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*********************************************************************************
- * *
- * The MIT License (MIT) *
- * *
- * Copyright (c) 2015-2024 miaixz.org and other contributors. *
- * *
- * Permission is hereby granted, free of charge, to any person obtaining a copy *
- * of this software and associated documentation files (the "Software"), to deal *
- * in the Software without restriction, including without limitation the rights *
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
- * copies of the Software, and to permit persons to whom the Software is *
- * furnished to do so, subject to the following conditions: *
- * *
- * The above copyright notice and this permission notice shall be included in *
- * all copies or substantial portions of the Software. *
- * *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
- * THE SOFTWARE. *
- * *
- ********************************************************************************/
-package org.miaixz.bus.core.center.date.chinese;
-
-import org.miaixz.bus.core.center.date.DateTime;
-import org.miaixz.bus.core.lang.Normal;
-import org.miaixz.bus.core.xyz.DateKit;
-import org.miaixz.bus.core.xyz.MathKit;
-
-import java.time.LocalDate;
-import java.util.Date;
-
-/**
- * 24节气相关信息
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-public class SolarTerms {
-
- /**
- * 1900-2100各年的24节气日期速查表
- * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js
- */
- private static final String[] S_TERM_INFO = 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"};
-
- /**
- * 24节气
- */
- private static final String[] TERMS = {
- "小寒", "大寒", "立春", "雨水", "惊蛰", "春分",
- "清明", "谷雨", "立夏", "小满", "芒种", "夏至",
- "小暑", "大暑", "立秋", "处暑", "白露", "秋分",
- "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"
- };
-
- /**
- * 传入公历y年获得该年第n个节气的公历日期
- *
- * @param y 公历年(1900-2100)
- * @param n 二十四节气中的第几个节气(1~24);从n=1(小寒)算起
- * @return getTerm(1987, 3) -》4;意即1987年2月4日立春
- */
- public static int getTerm(final int y, final int n) {
- if (y < 1900 || y > 2100) {
- return -1;
- }
- if (n < 1 || n > 24) {
- return -1;
- }
-
- final String _table = S_TERM_INFO[y - 1900];
- final Integer[] _info = new Integer[6];
- for (int i = 0; i < 6; i++) {
- _info[i] = Integer.parseInt(_table.substring(i * 5, 5 * (i + 1)), 16);
- }
- final 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 MathKit.parseInt(_calday[n - 1]);
- }
-
- /**
- * 根据日期获取节气
- *
- * @param date 日期
- * @return 返回指定日期所处的节气,若不是一个节气则返回空字符串
- */
- public static String getTerm(final Date date) {
- final DateTime dt = DateKit.date(date);
- return getTermInternal(dt.year(), dt.month() + 1, dt.dayOfMonth());
- }
-
-
- /**
- * 根据农历日期获取节气
- *
- * @param chineseDate 农历日期
- * @return 返回指定农历日期所处的节气,若不是一个节气则返回空字符串
- */
- public static String getTerm(final ChineseDate chineseDate) {
- return chineseDate.getTerm();
- }
-
- /**
- * 根据日期获取节气
- *
- * @param date 日期
- * @return 返回指定日期所处的节气,若不是一个节气则返回空字符串
- */
- public static String getTerm(final LocalDate date) {
- return getTermInternal(date.getYear(), date.getMonthValue(), date.getDayOfMonth());
- }
-
- /**
- * 根据年月日获取节气
- *
- * @param year 公历年
- * @param mouth 公历月,从1开始
- * @param day 公历日,从1开始
- * @return 返回指定年月日所处的节气,若不是一个节气则返回空字符串
- */
- public static String getTerm(final int year, final int mouth, final int day) {
- return getTerm(LocalDate.of(year, mouth, day));
- }
-
- /**
- * 根据年月日获取节气, 内部方法,不对月和日做有效校验
- *
- * @param year 公历年
- * @param month 公历月,从1开始
- * @param day 公历日,从1开始
- * @return 返回指定年月日所处的节气,若不是一个节气则返回空字符串
- */
- private static String getTermInternal(final int year, final int month, final int day) {
- if (year < 1900 || year > 2100) {
- throw new IllegalArgumentException("只支持1900-2100之间的日期获取节气");
- }
-
- final String termTable = S_TERM_INFO[year - 1900];
-
- // 节气速查表中每5个字符含有4个节气,通过月份直接计算偏移
- final int segment = (month + 1) / 2 - 1;
- final int termInfo = Integer.parseInt(termTable.substring(segment * 5, (segment + 1) * 5), 16);
- final String termInfoStr = String.valueOf(termInfo);
-
- final String[] segmentTable = new String[4];
- segmentTable[0] = termInfoStr.substring(0, 1);
- segmentTable[1] = termInfoStr.substring(1, 3);
- segmentTable[2] = termInfoStr.substring(3, 4);
- segmentTable[3] = termInfoStr.substring(4, 6);
-
- // 奇数月份的节气在前2个,偶数月份的节气在后两个
- final int segmentOffset = (month & 1) == 1 ? 0 : 2;
-
- if (day == Integer.parseInt(segmentTable[segmentOffset])) {
- return TERMS[segment * 4 + segmentOffset];
- }
- if (day == Integer.parseInt(segmentTable[segmentOffset + 1])) {
- return TERMS[segment * 4 + segmentOffset + 1];
- }
- return Normal.EMPTY;
- }
-
-}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/package-info.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/package-info.java
deleted file mode 100644
index 1bb63d7fa8..0000000000
--- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/chinese/package-info.java
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * 农历相关类汇总,包括农历月、天干地支、农历节日、24节气等
- * 规范参考:GB/T 33661-2017
- *
- * @author Kimi Liu
- * @since Java 17+
- */
-package org.miaixz.bus.core.center.date.chinese;
diff --git a/bus-proxy/src/main/java/org/miaixz/bus/proxy/provider/NullProvider.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Culture.java
similarity index 87%
rename from bus-proxy/src/main/java/org/miaixz/bus/proxy/provider/NullProvider.java
rename to bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Culture.java
index 9e51656128..10146d36b1 100755
--- a/bus-proxy/src/main/java/org/miaixz/bus/proxy/provider/NullProvider.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Culture.java
@@ -23,19 +23,26 @@
* THE SOFTWARE. *
* *
********************************************************************************/
-package org.miaixz.bus.proxy.provider;
+package org.miaixz.bus.core.center.date.culture;
+
+import org.miaixz.bus.core.center.date.Almanac;
/**
- * 总是返回null
+ * 区域文化
*
* @author Kimi Liu
* @since Java 17+
*/
-public class NullProvider extends AlwaysProvider {
+public interface Culture extends Almanac {
- public NullProvider() {
- super(null);
+ /**
+ * 推移
+ *
+ * @param n 推移步数
+ * @return this
+ */
+ default Culture next(int n) {
+ return this;
}
}
-
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java
new file mode 100644
index 0000000000..666edaeb65
--- /dev/null
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java
@@ -0,0 +1,665 @@
+/*********************************************************************************
+ * *
+ * The MIT License (MIT) *
+ * *
+ * Copyright (c) 2015-2024 miaixz.org and other contributors. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy *
+ * of this software and associated documentation files (the "Software"), to deal *
+ * in the Software without restriction, including without limitation the rights *
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in *
+ * all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
+ * THE SOFTWARE. *
+ * *
+ ********************************************************************************/
+package org.miaixz.bus.core.center.date.culture;
+
+/**
+ * 寿星天文历工具
+ *
+ * @author Kimi Liu
+ * @since Java 17+
+ */
+public class Galaxy {
+
+ /**
+ * 2π
+ */
+ public static final double PI_2 = 2 * Math.PI;
+ public static final double ONE_THIRD = 1d / 3;
+ /**
+ * 1天对应的秒数
+ */
+ public static final int SECOND_PER_DAY = 86400;
+ /**
+ * 1弧度对应的角秒
+ */
+ public static final double SECOND_PER_RAD = 180 * 3600 / Math.PI;
+ private static final double[] NUT_B = {
+ 2.1824, -33.75705, 36e-6, -1720, 920,
+ 3.5069, 1256.66393, 11e-6, -132, 57,
+ 1.3375, 16799.4182, -51e-6, -23, 10,
+ 4.3649, -67.5141, 72e-6, 21, -9,
+ 0.04, -628.302, 0, -14, 0,
+ 2.36, 8328.691, 0, 7, 0,
+ 3.46, 1884.966, 0, -5, 2,
+ 5.44, 16833.175, 0, -4, 2,
+ 3.69, 25128.110, 0, -3, 0,
+ 3.55, 628.362, 0, 2, 0
+ };
+ private static final double[] DT_AT = {
+ -4000, 108371.7, -13036.80, 392.000, 0.0000,
+ -500, 17201.0, -627.82, 16.170, -0.3413,
+ -150, 12200.6, -346.41, 5.403, -0.1593,
+ 150, 9113.8, -328.13, -1.647, 0.0377,
+ 500, 5707.5, -391.41, 0.915, 0.3145,
+ 900, 2203.4, -283.45, 13.034, -0.1778,
+ 1300, 490.1, -57.35, 2.085, -0.0072,
+ 1600, 120.0, -9.81, -1.532, 0.1403,
+ 1700, 10.2, -0.91, 0.510, -0.0370,
+ 1800, 13.4, -0.72, 0.202, -0.0193,
+ 1830, 7.8, -1.81, 0.416, -0.0247,
+ 1860, 8.3, -0.13, -0.406, 0.0292,
+ 1880, -5.4, 0.32, -0.183, 0.0173,
+ 1900, -2.3, 2.06, 0.169, -0.0135,
+ 1920, 21.2, 1.69, -0.304, 0.0167,
+ 1940, 24.2, 1.22, -0.064, 0.0031,
+ 1960, 33.2, 0.51, 0.231, -0.0109,
+ 1980, 51.0, 1.29, -0.026, 0.0032,
+ 2000, 63.87, 0.1, 0, 0,
+ 2005, 64.7, 0.21, 0, 0,
+ 2012, 66.8, 0.22, 0, 0,
+ 2018, 69.0, 0.36, 0, 0,
+ 2028, 72.6
+ };
+ private static final double[] XL0 = {
+ 10000000000D,
+ 20, 578, 920, 1100, 1124, 1136, 1148, 1217, 1226, 1229, 1229, 1229, 1229, 1937, 2363, 2618, 2633, 2660, 2666,
+ 17534704567D, 0.00000000000, 0.00000000000, 334165646, 4.669256804, 6283.075849991, 3489428, 4.6261024,
+ 12566.1517000, 349706, 2.744118, 5753.384885, 341757, 2.828866, 3.523118, 313590, 3.627670, 77713.771468,
+ 267622, 4.418084, 7860.419392, 234269, 6.135162, 3930.209696, 132429, 0.742464, 11506.769770, 127317, 2.037097,
+ 529.690965, 119917, 1.109629, 1577.343542, 99025, 5.23268, 5884.92685, 90186, 2.04505, 26.29832, 85722, 3.50849,
+ 398.14900, 77979, 1.17883, 5223.69392, 75314, 2.53339, 5507.55324, 50526, 4.58293, 18849.22755, 49238, 4.20507,
+ 775.52261, 35666, 2.91954, 0.06731, 31709, 5.84902, 11790.62909, 28413, 1.89869, 796.29801, 27104, 0.31489,
+ 10977.07880, 24281, 0.34481, 5486.77784, 20616, 4.80647, 2544.31442, 20539, 1.86948, 5573.14280, 20226, 2.45768,
+ 6069.77675, 15552, 0.83306, 213.29910, 13221, 3.41118, 2942.46342, 12618, 1.08303, 20.77540, 11513, 0.64545,
+ 0.98032, 10285, 0.63600, 4694.00295, 10190, 0.97569, 15720.83878, 10172, 4.26680, 7.11355, 9921, 6.2099,
+ 2146.1654, 9761, 0.6810, 155.4204, 8580, 5.9832, 161000.6857, 8513, 1.2987, 6275.9623, 8471, 3.6708, 71430.6956,
+ 7964, 1.8079, 17260.1547, 7876, 3.0370, 12036.4607, 7465, 1.7551, 5088.6288, 7387, 3.5032, 3154.6871, 7355,
+ 4.6793, 801.8209, 6963, 0.8330, 9437.7629, 6245, 3.9776, 8827.3903, 6115, 1.8184, 7084.8968, 5696, 2.7843,
+ 6286.5990, 5612, 4.3869, 14143.4952, 5558, 3.4701, 6279.5527, 5199, 0.1891, 12139.5535, 5161, 1.3328, 1748.0164,
+ 5115, 0.2831, 5856.4777, 4900, 0.4874, 1194.4470, 4104, 5.3682, 8429.2413, 4094, 2.3985, 19651.0485, 3920,
+ 6.1683, 10447.3878, 3677, 6.0413, 10213.2855, 3660, 2.5696, 1059.3819, 3595, 1.7088, 2352.8662, 3557, 1.7760,
+ 6812.7668, 3329, 0.5931, 17789.8456, 3041, 0.4429, 83996.8473, 3005, 2.7398, 1349.8674, 2535, 3.1647, 4690.4798,
+ 2474, 0.2148, 3.5904, 2366, 0.4847, 8031.0923, 2357, 2.0653, 3340.6124, 2282, 5.2220, 4705.7323, 2189, 5.5559,
+ 553.5694, 2142, 1.4256, 16730.4637, 2109, 4.1483, 951.7184, 2030, 0.3713, 283.8593, 1992, 5.2221, 12168.0027,
+ 1986, 5.7747, 6309.3742, 1912, 3.8222, 23581.2582, 1889, 5.3863, 149854.4001, 1790, 2.2149, 13367.9726, 1748,
+ 4.5605, 135.0651, 1622, 5.9884, 11769.8537, 1508, 4.1957, 6256.7775, 1442, 4.1932, 242.7286, 1435, 3.7236,
+ 38.0277, 1397, 4.4014, 6681.2249, 1362, 1.8893, 7632.9433, 1250, 1.1305, 5.5229, 1205, 2.6223, 955.5997, 1200,
+ 1.0035, 632.7837, 1129, 0.1774, 4164.3120, 1083, 0.3273, 103.0928, 1052, 0.9387, 11926.2544, 1050, 5.3591,
+ 1592.5960, 1033, 6.1998, 6438.4962, 1001, 6.0291, 5746.2713, 980, 0.999, 11371.705, 980, 5.244, 27511.468, 938,
+ 2.624, 5760.498, 923, 0.483, 522.577, 922, 4.571, 4292.331, 905, 5.337, 6386.169, 862, 4.165, 7058.598, 841,
+ 3.299, 7234.794, 836, 4.539, 25132.303, 813, 6.112, 4732.031, 812, 6.271, 426.598, 801, 5.821, 28.449, 787,
+ 0.996, 5643.179, 776, 2.957, 23013.540, 769, 3.121, 7238.676, 758, 3.974, 11499.656, 735, 4.386, 316.392, 731,
+ 0.607, 11513.883, 719, 3.998, 74.782, 706, 0.323, 263.084, 676, 5.911, 90955.552, 663, 3.665, 17298.182, 653,
+ 5.791, 18073.705, 630, 4.717, 6836.645, 615, 1.458, 233141.314, 612, 1.075, 19804.827, 596, 3.321, 6283.009,
+ 596, 2.876, 6283.143, 555, 2.452, 12352.853, 541, 5.392, 419.485, 531, 0.382, 31441.678, 519, 4.065, 6208.294,
+ 513, 2.361, 10973.556, 494, 5.737, 9917.697, 450, 3.272, 11015.106, 449, 3.653, 206.186, 447, 2.064, 7079.374,
+ 435, 4.423, 5216.580, 421, 1.906, 245.832, 413, 0.921, 3738.761, 402, 0.840, 20.355, 387, 1.826, 11856.219, 379,
+ 2.344, 3.881, 374, 2.954, 3128.389, 370, 5.031, 536.805, 365, 1.018, 16200.773, 365, 1.083, 88860.057, 352,
+ 5.978, 3894.182, 352, 2.056, 244287.600, 351, 3.713, 6290.189, 340, 1.106, 14712.317, 339, 0.978, 8635.942, 339,
+ 3.202, 5120.601, 333, 0.837, 6496.375, 325, 3.479, 6133.513, 316, 5.089, 21228.392, 316, 1.328, 10873.986, 309,
+ 3.646, 10.637, 303, 1.802, 35371.887, 296, 3.397, 9225.539, 288, 6.026, 154717.610, 281, 2.585, 14314.168, 262,
+ 3.856, 266.607, 262, 2.579, 22483.849, 257, 1.561, 23543.231, 255, 3.949, 1990.745, 251, 3.744, 10575.407, 240,
+ 1.161, 10984.192, 238, 0.106, 7.046, 236, 4.272, 6040.347, 234, 3.577, 10969.965, 211, 3.714, 65147.620, 210,
+ 0.754, 13521.751, 207, 4.228, 5650.292, 202, 0.814, 170.673, 201, 4.629, 6037.244, 200, 0.381, 6172.870, 199,
+ 3.933, 6206.810, 199, 5.197, 6262.300, 197, 1.046, 18209.330, 195, 1.070, 5230.807, 195, 4.869, 36.028, 194,
+ 4.313, 6244.943, 192, 1.229, 709.933, 192, 5.595, 6282.096, 192, 0.602, 6284.056, 189, 3.744, 23.878, 188,
+ 1.904, 15.252, 188, 0.867, 22003.915, 182, 3.681, 15110.466, 181, 0.491, 1.484, 179, 3.222, 39302.097, 179,
+ 1.259, 12559.038,
+ 62833196674749D, 0.000000000000, 0.000000000000, 20605886, 2.67823456, 6283.07584999, 430343, 2.635127,
+ 12566.151700, 42526, 1.59047, 3.52312, 11926, 5.79557, 26.29832, 10898, 2.96618, 1577.34354, 9348, 2.5921,
+ 18849.2275, 7212, 1.1385, 529.6910, 6777, 1.8747, 398.1490, 6733, 4.4092, 5507.5532, 5903, 2.8880, 5223.6939,
+ 5598, 2.1747, 155.4204, 4541, 0.3980, 796.2980, 3637, 0.4662, 775.5226, 2896, 2.6471, 7.1135, 2084, 5.3414,
+ 0.9803, 1910, 1.8463, 5486.7778, 1851, 4.9686, 213.2991, 1729, 2.9912, 6275.9623, 1623, 0.0322, 2544.3144, 1583,
+ 1.4305, 2146.1654, 1462, 1.2053, 10977.0788, 1246, 2.8343, 1748.0164, 1188, 3.2580, 5088.6288, 1181, 5.2738,
+ 1194.4470, 1151, 2.0750, 4694.0030, 1064, 0.7661, 553.5694, 997, 1.303, 6286.599, 972, 4.239, 1349.867, 945,
+ 2.700, 242.729, 858, 5.645, 951.718, 758, 5.301, 2352.866, 639, 2.650, 9437.763, 610, 4.666, 4690.480, 583,
+ 1.766, 1059.382, 531, 0.909, 3154.687, 522, 5.661, 71430.696, 520, 1.854, 801.821, 504, 1.425, 6438.496, 433,
+ 0.241, 6812.767, 426, 0.774, 10447.388, 413, 5.240, 7084.897, 374, 2.001, 8031.092, 356, 2.429, 14143.495, 350,
+ 4.800, 6279.553, 337, 0.888, 12036.461, 337, 3.862, 1592.596, 325, 3.400, 7632.943, 322, 0.616, 8429.241, 318,
+ 3.188, 4705.732, 297, 6.070, 4292.331, 295, 1.431, 5746.271, 290, 2.325, 20.355, 275, 0.935, 5760.498, 270,
+ 4.804, 7234.794, 253, 6.223, 6836.645, 228, 5.003, 17789.846, 225, 5.672, 11499.656, 215, 5.202, 11513.883, 208,
+ 3.955, 10213.286, 208, 2.268, 522.577, 206, 2.224, 5856.478, 206, 2.550, 25132.303, 203, 0.910, 6256.778, 189,
+ 0.532, 3340.612, 188, 4.735, 83996.847, 179, 1.474, 4164.312, 178, 3.025, 5.523, 177, 3.026, 5753.385, 159,
+ 4.637, 3.286, 157, 6.124, 5216.580, 155, 3.077, 6681.225, 154, 4.200, 13367.973, 143, 1.191, 3894.182, 138,
+ 3.093, 135.065, 136, 4.245, 426.598, 134, 5.765, 6040.347, 128, 3.085, 5643.179, 127, 2.092, 6290.189, 125,
+ 3.077, 11926.254, 125, 3.445, 536.805, 114, 3.244, 12168.003, 112, 2.318, 16730.464, 111, 3.901, 11506.770, 111,
+ 5.320, 23.878, 105, 3.750, 7860.419, 103, 2.447, 1990.745, 96, 0.82, 3.88, 96, 4.08, 6127.66, 91, 5.42, 206.19,
+ 91, 0.42, 7079.37, 88, 5.17, 11790.63, 81, 0.34, 9917.70, 80, 3.89, 10973.56, 78, 2.40, 1589.07, 78, 2.58,
+ 11371.70, 77, 3.98, 955.60, 77, 3.36, 36.03, 76, 1.30, 103.09, 75, 5.18, 10969.97, 75, 4.96, 6496.37, 73, 5.21,
+ 38.03, 72, 2.65, 6309.37, 70, 5.61, 3738.76, 69, 2.60, 3496.03, 69, 0.39, 15.25, 69, 2.78, 20.78, 65, 1.13,
+ 7058.60, 64, 4.28, 28.45, 61, 5.63, 10984.19, 60, 0.73, 419.48, 60, 5.28, 10575.41, 58, 5.55, 17298.18, 58,
+ 3.19, 4732.03,
+ 5291887, 0.0000000, 0.0000000, 871984, 1.072097, 6283.075850, 30913, 0.86729, 12566.15170, 2734, 0.0530, 3.5231,
+ 1633, 5.1883, 26.2983, 1575, 3.6846, 155.4204, 954, 0.757, 18849.228, 894, 2.057, 77713.771, 695, 0.827,
+ 775.523, 506, 4.663, 1577.344, 406, 1.031, 7.114, 381, 3.441, 5573.143, 346, 5.141, 796.298, 317, 6.053,
+ 5507.553, 302, 1.192, 242.729, 289, 6.117, 529.691, 271, 0.306, 398.149, 254, 2.280, 553.569, 237, 4.381,
+ 5223.694, 208, 3.754, 0.980, 168, 0.902, 951.718, 153, 5.759, 1349.867, 145, 4.364, 1748.016, 134, 3.721,
+ 1194.447, 125, 2.948, 6438.496, 122, 2.973, 2146.165, 110, 1.271, 161000.686, 104, 0.604, 3154.687, 100, 5.986,
+ 6286.599, 92, 4.80, 5088.63, 89, 5.23, 7084.90, 83, 3.31, 213.30, 76, 3.42, 5486.78, 71, 6.19, 4690.48, 68,
+ 3.43, 4694.00, 65, 1.60, 2544.31, 64, 1.98, 801.82, 61, 2.48, 10977.08, 50, 1.44, 6836.65, 49, 2.34, 1592.60,
+ 46, 1.31, 4292.33, 46, 3.81, 149854.40, 43, 0.04, 7234.79, 40, 4.94, 7632.94, 39, 1.57, 71430.70, 38, 3.17,
+ 6309.37, 35, 0.99, 6040.35, 35, 0.67, 1059.38, 31, 3.18, 2352.87, 31, 3.55, 8031.09, 30, 1.92, 10447.39, 30,
+ 2.52, 6127.66, 28, 4.42, 9437.76, 28, 2.71, 3894.18, 27, 0.67, 25132.30, 26, 5.27, 6812.77, 25, 0.55, 6279.55,
+ 23, 1.38, 4705.73, 22, 0.64, 6256.78, 20, 6.07, 640.88,
+ 28923, 5.84384, 6283.07585, 3496, 0.0000, 0.0000, 1682, 5.4877, 12566.1517, 296, 5.196, 155.420, 129, 4.722,
+ 3.523, 71, 5.30, 18849.23, 64, 5.97, 242.73, 40, 3.79, 553.57,
+ 11408, 3.14159, 0.00000, 772, 4.134, 6283.076, 77, 3.84, 12566.15, 42, 0.42, 155.42,
+ 88, 3.14, 0.00, 17, 2.77, 6283.08, 5, 2.01, 155.42, 3, 2.21, 12566.15,
+ 27962, 3.19870, 84334.66158, 10164, 5.42249, 5507.55324, 8045, 3.8801, 5223.6939, 4381, 3.7044, 2352.8662, 3193,
+ 4.0003, 1577.3435, 2272, 3.9847, 1047.7473, 1814, 4.9837, 6283.0758, 1639, 3.5646, 5856.4777, 1444, 3.7028,
+ 9437.7629, 1430, 3.4112, 10213.2855, 1125, 4.8282, 14143.4952, 1090, 2.0857, 6812.7668, 1037, 4.0566,
+ 71092.8814, 971, 3.473, 4694.003, 915, 1.142, 6620.890, 878, 4.440, 5753.385, 837, 4.993, 7084.897, 770, 5.554,
+ 167621.576, 719, 3.602, 529.691, 692, 4.326, 6275.962, 558, 4.410, 7860.419, 529, 2.484, 4705.732, 521, 6.250,
+ 18073.705,
+ 903, 3.897, 5507.553, 618, 1.730, 5223.694, 380, 5.244, 2352.866,
+ 166, 1.627, 84334.662,
+ 10001398880D, 0.00000000000, 0.00000000000, 167069963, 3.098463508, 6283.075849991, 1395602, 3.0552461,
+ 12566.1517000, 308372, 5.198467, 77713.771468, 162846, 1.173877, 5753.384885, 157557, 2.846852, 7860.419392,
+ 92480, 5.45292, 11506.76977, 54244, 4.56409, 3930.20970, 47211, 3.66100, 5884.92685, 34598, 0.96369, 5507.55324,
+ 32878, 5.89984, 5223.69392, 30678, 0.29867, 5573.14280, 24319, 4.27350, 11790.62909, 21183, 5.84715, 1577.34354,
+ 18575, 5.02194, 10977.07880, 17484, 3.01194, 18849.22755, 10984, 5.05511, 5486.77784, 9832, 0.8868, 6069.7768,
+ 8650, 5.6896, 15720.8388, 8583, 1.2708, 161000.6857, 6490, 0.2725, 17260.1547, 6292, 0.9218, 529.6910, 5706,
+ 2.0137, 83996.8473, 5574, 5.2416, 71430.6956, 4938, 3.2450, 2544.3144, 4696, 2.5781, 775.5226, 4466, 5.5372,
+ 9437.7629, 4252, 6.0111, 6275.9623, 3897, 5.3607, 4694.0030, 3825, 2.3926, 8827.3903, 3749, 0.8295, 19651.0485,
+ 3696, 4.9011, 12139.5535, 3566, 1.6747, 12036.4607, 3454, 1.8427, 2942.4634, 3319, 0.2437, 7084.8968, 3192,
+ 0.1837, 5088.6288, 3185, 1.7778, 398.1490, 2846, 1.2134, 6286.5990, 2779, 1.8993, 6279.5527, 2628, 4.5890,
+ 10447.3878, 2460, 3.7866, 8429.2413, 2393, 4.9960, 5856.4777, 2359, 0.2687, 796.2980, 2329, 2.8078, 14143.4952,
+ 2210, 1.9500, 3154.6871, 2035, 4.6527, 2146.1654, 1951, 5.3823, 2352.8662, 1883, 0.6731, 149854.4001, 1833,
+ 2.2535, 23581.2582, 1796, 0.1987, 6812.7668, 1731, 6.1520, 16730.4637, 1717, 4.4332, 10213.2855, 1619, 5.2316,
+ 17789.8456, 1381, 5.1896, 8031.0923, 1364, 3.6852, 4705.7323, 1314, 0.6529, 13367.9726, 1041, 4.3329,
+ 11769.8537, 1017, 1.5939, 4690.4798, 998, 4.201, 6309.374, 966, 3.676, 27511.468, 874, 6.064, 1748.016, 779,
+ 3.674, 12168.003, 771, 0.312, 7632.943, 756, 2.626, 6256.778, 746, 5.648, 11926.254, 693, 2.924, 6681.225, 680,
+ 1.423, 23013.540, 674, 0.563, 3340.612, 663, 5.661, 11371.705, 659, 3.136, 801.821, 648, 2.650, 19804.827, 615,
+ 3.029, 233141.314, 612, 5.134, 1194.447, 563, 4.341, 90955.552, 552, 2.091, 17298.182, 534, 5.100, 31441.678,
+ 531, 2.407, 11499.656, 523, 4.624, 6438.496, 513, 5.324, 11513.883, 477, 0.256, 11856.219, 461, 1.722, 7234.794,
+ 458, 3.766, 6386.169, 458, 4.466, 5746.271, 423, 1.055, 5760.498, 422, 1.557, 7238.676, 415, 2.599, 7058.598,
+ 401, 3.030, 1059.382, 397, 1.201, 1349.867, 379, 4.907, 4164.312, 360, 5.707, 5643.179, 352, 3.626, 244287.600,
+ 348, 0.761, 10973.556, 342, 3.001, 4292.331, 336, 4.546, 4732.031, 334, 3.138, 6836.645, 324, 4.164, 9917.697,
+ 316, 1.691, 11015.106, 307, 0.238, 35371.887, 298, 1.306, 6283.143, 298, 1.750, 6283.009, 293, 5.738, 16200.773,
+ 286, 5.928, 14712.317, 281, 3.515, 21228.392, 280, 5.663, 8635.942, 277, 0.513, 26.298, 268, 4.207, 18073.705,
+ 266, 0.900, 12352.853, 260, 2.962, 25132.303, 255, 2.477, 6208.294, 242, 2.800, 709.933, 231, 1.054, 22483.849,
+ 229, 1.070, 14314.168, 216, 1.314, 154717.610, 215, 6.038, 10873.986, 200, 0.561, 7079.374, 198, 2.614, 951.718,
+ 197, 4.369, 167283.762, 186, 2.861, 5216.580, 183, 1.660, 39302.097, 183, 5.912, 3738.761, 175, 2.145, 6290.189,
+ 173, 2.168, 10575.407, 171, 3.702, 1592.596, 171, 1.343, 3128.389, 164, 5.550, 6496.375, 164, 5.856, 10984.192,
+ 161, 1.998, 10969.965, 161, 1.909, 6133.513, 157, 4.955, 25158.602, 154, 6.216, 23543.231, 153, 5.357,
+ 13521.751, 150, 5.770, 18209.330, 150, 5.439, 155.420, 139, 1.778, 9225.539, 139, 1.626, 5120.601, 128, 2.460,
+ 13916.019, 123, 0.717, 143571.324, 122, 2.654, 88860.057, 121, 4.414, 3894.182, 121, 1.192, 3.523, 120, 4.030,
+ 553.569, 119, 1.513, 17654.781, 117, 3.117, 14945.316, 113, 2.698, 6040.347, 110, 3.085, 43232.307, 109, 0.998,
+ 955.600, 108, 2.939, 17256.632, 107, 5.285, 65147.620, 103, 0.139, 11712.955, 103, 5.850, 213.299, 102, 3.046,
+ 6037.244, 101, 2.842, 8662.240, 100, 3.626, 6262.300, 98, 2.36, 6206.81, 98, 5.11, 6172.87, 98, 2.00, 15110.47,
+ 97, 2.67, 5650.29, 97, 2.75, 6244.94, 96, 4.02, 6282.10, 96, 5.31, 6284.06, 92, 0.10, 29088.81, 85, 3.26,
+ 20426.57, 84, 2.60, 28766.92, 81, 3.58, 10177.26, 80, 5.81, 5230.81, 78, 2.53, 16496.36, 77, 4.06, 6127.66, 73,
+ 0.04, 5481.25, 72, 5.96, 12559.04, 72, 5.92, 4136.91, 71, 5.49, 22003.91, 70, 3.41, 7.11, 69, 0.62, 11403.68,
+ 69, 3.90, 1589.07, 69, 1.96, 12416.59, 69, 4.51, 426.60, 67, 1.61, 11087.29, 66, 4.50, 47162.52, 66, 5.08,
+ 283.86, 66, 4.32, 16858.48, 65, 1.04, 6062.66, 64, 1.59, 18319.54, 63, 5.70, 45892.73, 63, 4.60, 66567.49, 63,
+ 3.82, 13517.87, 62, 2.62, 11190.38, 61, 1.54, 33019.02, 60, 5.58, 10344.30, 60, 5.38, 316428.23, 60, 5.78,
+ 632.78, 59, 6.12, 9623.69, 57, 0.16, 17267.27, 57, 3.86, 6076.89, 57, 1.98, 7668.64, 56, 4.78, 20199.09, 55,
+ 4.56, 18875.53, 55, 3.51, 17253.04, 54, 3.07, 226858.24, 54, 4.83, 18422.63, 53, 5.02, 12132.44, 52, 3.63,
+ 5333.90, 52, 0.97, 155427.54, 51, 3.36, 20597.24, 50, 0.99, 11609.86, 50, 2.21, 1990.75, 48, 1.62, 12146.67, 48,
+ 1.17, 12569.67, 47, 4.62, 5436.99, 47, 1.81, 12562.63, 47, 0.59, 21954.16, 47, 0.76, 7342.46, 46, 0.27, 4590.91,
+ 46, 3.77, 156137.48, 45, 5.66, 10454.50, 44, 5.84, 3496.03, 43, 0.24, 17996.03, 41, 5.93, 51092.73, 41, 4.21,
+ 12592.45, 40, 5.14, 1551.05, 40, 5.28, 15671.08, 39, 3.69, 18052.93, 39, 4.94, 24356.78, 38, 2.72, 11933.37, 38,
+ 5.23, 7477.52, 38, 4.99, 9779.11, 37, 3.70, 9388.01, 37, 4.44, 4535.06, 36, 2.16, 28237.23, 36, 2.54, 242.73,
+ 36, 0.22, 5429.88, 35, 6.15, 19800.95, 35, 2.92, 36949.23, 34, 5.63, 2379.16, 34, 5.73, 16460.33, 34, 5.11,
+ 5849.36, 33, 6.19, 6268.85,
+ 10301861, 1.10748970, 6283.07584999, 172124, 1.064423, 12566.151700, 70222, 3.14159, 0.00000, 3235, 1.0217,
+ 18849.2275, 3080, 2.8435, 5507.5532, 2497, 1.3191, 5223.6939, 1849, 1.4243, 1577.3435, 1008, 5.9138, 10977.0788,
+ 865, 1.420, 6275.962, 863, 0.271, 5486.778, 507, 1.686, 5088.629, 499, 6.014, 6286.599, 467, 5.987, 529.691,
+ 440, 0.518, 4694.003, 410, 1.084, 9437.763, 387, 4.750, 2544.314, 375, 5.071, 796.298, 352, 0.023, 83996.847,
+ 344, 0.949, 71430.696, 341, 5.412, 775.523, 322, 6.156, 2146.165, 286, 5.484, 10447.388, 284, 3.420, 2352.866,
+ 255, 6.132, 6438.496, 252, 0.243, 398.149, 243, 3.092, 4690.480, 225, 3.689, 7084.897, 220, 4.952, 6812.767,
+ 219, 0.420, 8031.092, 209, 1.282, 1748.016, 193, 5.314, 8429.241, 185, 1.820, 7632.943, 175, 3.229, 6279.553,
+ 173, 1.537, 4705.732, 158, 4.097, 11499.656, 158, 5.539, 3154.687, 150, 3.633, 11513.883, 148, 3.222, 7234.794,
+ 147, 3.653, 1194.447, 144, 0.817, 14143.495, 135, 6.151, 5746.271, 134, 4.644, 6836.645, 128, 2.693, 1349.867,
+ 123, 5.650, 5760.498, 118, 2.577, 13367.973, 113, 3.357, 17789.846, 110, 4.497, 4292.331, 108, 5.828, 12036.461,
+ 102, 5.621, 6256.778, 99, 1.14, 1059.38, 98, 0.66, 5856.48, 93, 2.32, 10213.29, 92, 0.77, 16730.46, 88, 1.50,
+ 11926.25, 86, 1.42, 5753.38, 85, 0.66, 155.42, 81, 1.64, 6681.22, 80, 4.11, 951.72, 66, 4.55, 5216.58, 65, 0.98,
+ 25132.30, 64, 4.19, 6040.35, 64, 0.52, 6290.19, 63, 1.51, 5643.18, 59, 6.18, 4164.31, 57, 2.30, 10973.56, 55,
+ 2.32, 11506.77, 55, 2.20, 1592.60, 55, 5.27, 3340.61, 54, 5.54, 553.57, 53, 5.04, 9917.70, 53, 0.92, 11371.70,
+ 52, 3.98, 17298.18, 52, 3.60, 10969.97, 49, 5.91, 3894.18, 49, 2.51, 6127.66, 48, 1.67, 12168.00, 46, 0.31,
+ 801.82, 42, 3.70, 10575.41, 42, 4.05, 10984.19, 40, 2.17, 7860.42, 40, 4.17, 26.30, 38, 5.82, 7058.60, 37, 3.39,
+ 6496.37, 36, 1.08, 6309.37, 36, 5.34, 7079.37, 34, 3.62, 11790.63, 32, 0.32, 16200.77, 31, 4.24, 3738.76, 29,
+ 4.55, 11856.22, 29, 1.26, 8635.94, 27, 3.45, 5884.93, 26, 5.08, 10177.26, 26, 5.38, 21228.39, 24, 2.26,
+ 11712.96, 24, 1.05, 242.73, 24, 5.59, 6069.78, 23, 3.63, 6284.06, 23, 1.64, 4732.03, 22, 3.46, 213.30, 21, 1.05,
+ 3496.03, 21, 3.92, 13916.02, 21, 4.01, 5230.81, 20, 5.16, 12352.85, 20, 0.69, 1990.75, 19, 2.73, 6062.66, 19,
+ 5.01, 11015.11, 18, 6.04, 6283.01, 18, 2.85, 7238.68, 18, 5.60, 6283.14, 18, 5.16, 17253.04, 18, 2.54, 14314.17,
+ 17, 1.58, 7.11, 17, 0.98, 3930.21, 17, 4.75, 17267.27, 16, 2.19, 6076.89, 16, 2.19, 18073.70, 16, 6.12, 3.52,
+ 16, 4.61, 9623.69, 16, 3.40, 16496.36, 15, 0.19, 9779.11, 15, 5.30, 13517.87, 15, 4.26, 3128.39, 15, 0.81,
+ 709.93, 14, 0.50, 25158.60, 14, 4.38, 4136.91, 13, 0.98, 65147.62, 13, 3.31, 154717.61, 13, 2.11, 1589.07, 13,
+ 1.92, 22483.85, 12, 6.03, 9225.54, 12, 1.53, 12559.04, 12, 5.82, 6282.10, 12, 5.61, 5642.20, 12, 2.38,
+ 167283.76, 12, 0.39, 12132.44, 12, 3.98, 4686.89, 12, 5.81, 12569.67, 12, 0.56, 5849.36, 11, 0.45, 6172.87, 11,
+ 5.80, 16858.48, 11, 6.22, 12146.67, 11, 2.27, 5429.88,
+ 435939, 5.784551, 6283.075850, 12363, 5.57935, 12566.15170, 1234, 3.1416, 0.0000, 879, 3.628, 77713.771, 569,
+ 1.870, 5573.143, 330, 5.470, 18849.228, 147, 4.480, 5507.553, 110, 2.842, 161000.686, 101, 2.815, 5223.694, 85,
+ 3.11, 1577.34, 65, 5.47, 775.52, 61, 1.38, 6438.50, 50, 4.42, 6286.60, 47, 3.66, 7084.90, 46, 5.39, 149854.40,
+ 42, 0.90, 10977.08, 40, 3.20, 5088.63, 35, 1.81, 5486.78, 32, 5.35, 3154.69, 30, 3.52, 796.30, 29, 4.62,
+ 4690.48, 28, 1.84, 4694.00, 27, 3.14, 71430.70, 27, 6.17, 6836.65, 26, 1.42, 2146.17, 25, 2.81, 1748.02, 24,
+ 2.18, 155.42, 23, 4.76, 7234.79, 21, 3.38, 7632.94, 21, 0.22, 4705.73, 20, 4.22, 1349.87, 20, 2.01, 1194.45, 20,
+ 4.58, 529.69, 19, 1.59, 6309.37, 18, 5.70, 6040.35, 18, 6.03, 4292.33, 17, 2.90, 9437.76, 17, 2.00, 8031.09, 17,
+ 5.78, 83996.85, 16, 0.05, 2544.31, 15, 0.95, 6127.66, 14, 0.36, 10447.39, 14, 1.48, 2352.87, 13, 0.77, 553.57,
+ 13, 5.48, 951.72, 13, 5.27, 6279.55, 13, 3.76, 6812.77, 11, 5.41, 6256.78, 10, 0.68, 1592.60, 10, 4.95, 398.15,
+ 10, 1.15, 3894.18, 10, 5.20, 244287.60, 10, 1.94, 11856.22, 9, 5.39, 25132.30, 8, 6.18, 1059.38, 8, 0.69,
+ 8429.24, 8, 5.85, 242.73, 7, 5.26, 14143.50, 7, 0.52, 801.82, 6, 2.24, 8635.94, 6, 4.00, 13367.97, 6, 2.77,
+ 90955.55, 6, 5.17, 7058.60, 5, 1.46, 233141.31, 5, 4.13, 7860.42, 5, 3.91, 26.30, 5, 3.89, 12036.46, 5, 5.58,
+ 6290.19, 5, 5.54, 1990.75, 5, 0.83, 11506.77, 5, 6.22, 6681.22, 4, 5.26, 10575.41, 4, 1.91, 7477.52, 4, 0.43,
+ 10213.29, 4, 1.09, 709.93, 4, 5.09, 11015.11, 4, 4.22, 88860.06, 4, 3.57, 7079.37, 4, 1.98, 6284.06, 4, 3.93,
+ 10973.56, 4, 6.18, 9917.70, 4, 0.36, 10177.26, 4, 2.75, 3738.76, 4, 3.33, 5643.18, 4, 5.36, 25158.60,
+ 14459, 4.27319, 6283.07585, 673, 3.917, 12566.152, 77, 0.00, 0.00, 25, 3.73, 18849.23, 4, 2.80, 6286.60,
+ 386, 2.564, 6283.076, 31, 2.27, 12566.15, 5, 3.44, 5573.14, 2, 2.05, 18849.23, 1, 2.06, 77713.77, 1, 4.41,
+ 161000.69, 1, 3.82, 149854.40, 1, 4.08, 6127.66, 1, 5.26, 6438.50,
+ 9, 1.22, 6283.08, 1, 0.66, 12566.15
+ };
+ private static final double[][] XL1 = new double[][]{
+ {22639.586, 0.78475822, 8328.691424623, 1.5229241, 25.0719, -0.123598, 4586.438, 0.1873974, 7214.06286536, -2.184756, -18.860, 0.08280, 2369.914, 2.5429520, 15542.75428998, -0.661832, 6.212, -0.04080, 769.026, 3.140313, 16657.38284925, 3.04585, 50.144, -0.2472, 666.418, 1.527671, 628.30195521, -0.02664, 0.062, -0.0054, 411.596, 4.826607, 16866.9323150, -1.28012, -1.07, -0.0059, 211.656, 4.115028, -1114.6285593, -3.70768, -43.93, 0.2064, 205.436, 0.230523, 6585.7609101, -2.15812, -18.92, 0.0882, 191.956, 4.898507, 23871.4457146, 0.86109, 31.28, -0.164, 164.729, 2.586078, 14914.4523348, -0.6352, 6.15, -0.035, 147.321, 5.45530, -7700.3894694, -1.5496, -25.01, 0.118, 124.988, 0.48608, 7771.3771450, -0.3309, 3.11, -0.020, 109.380, 3.88323, 8956.9933798, 1.4963, 25.13, -0.129, 55.177, 5.57033, -1324.1780250, 0.6183, 7.3, -0.035, 45.100, 0.89898, 25195.623740, 0.2428, 24.0, -0.129, 39.533, 3.81213, -8538.240890, 2.8030, 26.1, -0.118, 38.430, 4.30115, 22756.817155, -2.8466, -12.6, 0.042, 36.124, 5.49587, 24986.074274, 4.5688, 75.2, -0.371, 30.773, 1.94559, 14428.125731, -4.3695, -37.7, 0.166, 28.397, 3.28586, 7842.364821, -2.2114, -18.8, 0.077, 24.358, 5.64142, 16171.056245, -0.6885, 6.3, -0.046, 18.585, 4.41371, -557.314280, -1.8538, -22.0, 0.10, 17.954, 3.58454, 8399.679100, -0.3576, 3.2, -0.03, 14.530, 4.9416, 23243.143759, 0.888, 31.2, -0.16, 14.380, 0.9709, 32200.137139, 2.384, 56.4, -0.29, 14.251, 5.7641, -2.301200, 1.523, 25.1, -0.12, 13.899, 0.3735, 31085.508580, -1.324, 12.4, -0.08, 13.194, 1.7595, -9443.319984, -5.231, -69.0, 0.33, 9.679, 3.0997, -16029.080894, -3.072, -50.1, 0.24, 9.366, 0.3016, 24080.995180, -3.465, -19.9, 0.08, 8.606, 4.1582, -1742.930514, -3.681, -44.0, 0.21, 8.453, 2.8416, 16100.068570, 1.192, 28.2, -0.14, 8.050, 2.6292, 14286.150380, -0.609, 6.1, -0.03, 7.630, 6.2388, 17285.684804, 3.019, 50.2, -0.25, 7.447, 1.4845, 1256.603910, -0.053, 0.1, -0.01, 7.371, 0.2736, 5957.458955, -2.131, -19.0, 0.09, 7.063, 5.6715, 33.757047, -0.308, -3.6, 0.02, 6.383, 4.7843, 7004.513400, 2.141, 32.4, -0.16, 5.742, 2.6572, 32409.686605, -1.942, 5, -0.05, 4.374, 4.3443, 22128.51520, -2.820, -13, 0.05, 3.998, 3.2545, 33524.31516, 1.766, 49, -0.25, 3.210, 2.2443, 14985.44001, -2.516, -16, 0.06, 2.915, 1.7138, 24499.74767, 0.834, 31, -0.17, 2.732, 1.9887, 13799.82378, -4.343, -38, 0.17, 2.568, 5.4122, -7072.08751, -1.576, -25, 0.11, 2.521, 3.2427, 8470.66678, -2.238, -19, 0.07, 2.489, 4.0719, -486.32660, -3.734, -44, 0.20, 2.146, 5.6135, -1952.47998, 0.645, 7, -0.03, 1.978, 2.7291, 39414.20000, 0.199, 37, -0.21, 1.934, 1.5682, 33314.76570, 6.092, 100, -0.5, 1.871, 0.4166, 30457.20662, -1.297, 12, -0.1, 1.753, 2.0582, -8886.00570, -3.38, -47, 0.2, 1.437, 2.386, -695.87607, 0.59, 7, 0, 1.373, 3.026, -209.54947, 4.33, 51, -0.2, 1.262, 5.940, 16728.37052, 1.17, 28, -0.1, 1.224, 6.172, 6656.74859, -4.04, -41, 0.2, 1.187, 5.873, 6099.43431, -5.89, -63, 0.3, 1.177, 1.014, 31571.83518, 2.41, 56, -0.3, 1.162, 3.840, 9585.29534, 1.47, 25, -0.1, 1.143, 5.639, 8364.73984, -2.18, -19, 0.1, 1.078, 1.229, 70.98768, -1.88, -22, 0.1, 1.059, 3.326, 40528.82856, 3.91, 81, -0.4, 0.990, 5.013, 40738.37803, -0.42, 30, -0.2, 0.948, 5.687, -17772.01141, -6.75, -94, 0.5, 0.876, 0.298, -0.35232, 0, 0, 0, 0.822, 2.994, 393.02097, 0, 0, 0, 0.788, 1.836, 8326.39022, 3.05, 50, -0.2, 0.752, 4.985, 22614.84180, 0.91, 31, -0.2, 0.740, 2.875, 8330.99262, 0, 0, 0, 0.669, 0.744, -24357.77232, -4.60, -75, 0.4, 0.644, 1.314, 8393.12577, -2.18, -19, 0.1, 0.639, 5.888, 575.33849, 0, 0, 0, 0.635, 1.116, 23385.11911, -2.87, -13, 0, 0.584, 5.197, 24428.75999, 2.71, 53, -0.3, 0.583, 3.513, -9095.55517, 0.95, 4, 0, 0.572, 6.059, 29970.88002, -5.03, -32, 0.1, 0.565, 2.960, 0.32863, 1.52, 25, -0.1, 0.561, 4.001, -17981.56087, -2.43, -43, 0.2, 0.557, 0.529, 7143.07519, -0.30, 3, 0, 0.546, 2.311, 25614.37623, 4.54, 75, -0.4, 0.536, 4.229, 15752.30376, -4.99, -45, 0.2, 0.493, 3.316, -8294.9344, -1.83, -29, 0.1, 0.491, 1.744, 8362.4485, 1.21, 21, -0.1, 0.478, 1.803, -10071.6219, -5.20, -69, 0.3, 0.454, 0.857, 15333.2048, 3.66, 57, -0.3, 0.445, 2.071, 8311.7707, -2.18, -19, 0.1, 0.426, 0.345, 23452.6932, -3.44, -20, 0.1, 0.420, 4.941, 33733.8646, -2.56, -2, 0, 0.413, 1.642, 17495.2343, -1.31, -1, 0, 0.404, 1.458, 23314.1314, -0.99, 9, -0.1, 0.395, 2.132, 38299.5714, -3.51, -6, 0, 0.382, 2.700, 31781.3846, -1.92, 5, 0, 0.375, 4.827, 6376.2114, 2.17, 32, -0.2, 0.361, 3.867, 16833.1753, -0.97, 3, 0, 0.358, 5.044, 15056.4277, -4.40, -38, 0.2, 0.350, 5.157, -8257.7037, -3.40, -47, 0.2, 0.344, 4.233, 157.7344, 0, 0, 0, 0.340, 2.672, 13657.8484, -0.58, 6, 0, 0.329, 5.610, 41853.0066, 3.29, 74, -0.4, 0.325, 5.895, -39.8149, 0, 0, 0, 0.309, 4.387, 21500.2132, -2.79, -13, 0.1, 0.302, 1.278, 786.0419, 0, 0, 0, 0.302, 5.341, -24567.3218, -0.27, -24, 0.1, 0.301, 1.045, 5889.8848, -1.57, -12, 0, 0.294, 4.201, -2371.2325, -3.65, -44, 0.2, 0.293, 3.704, 21642.1886, -6.55, -57, 0.2, 0.290, 4.069, 32828.4391, 2.36, 56, -0.3, 0.289, 3.472, 31713.8105, -1.35, 12, -0.1, 0.285, 5.407, -33.7814, 0.31, 4, 0, 0.283, 5.998, -16.9207, -3.71, -44, 0.2, 0.283, 2.772, 38785.8980, 0.23, 37, -0.2, 0.274, 5.343, 15613.7420, -2.54, -16, 0.1, 0.263, 3.997, 25823.9257, 0.22, 24, -0.1, 0.254, 0.600, 24638.3095, -1.61, 2, 0, 0.253, 1.344, 6447.1991, 0.29, 10, -0.1, 0.250, 0.887, 141.9754, -3.76, -44, 0.2, 0.247, 0.317, 5329.1570, -2.10, -19, 0.1, 0.245, 0.141, 36.0484, -3.71, -44, 0.2, 0.231, 2.287, 14357.1381, -2.49, -16, 0.1, 0.227, 5.158, 2.6298, 0, 0, 0, 0.219, 5.085, 47742.8914, 1.72, 63, -0.3, 0.211, 2.145, 6638.7244, -2.18, -19, 0.1, 0.201, 4.415, 39623.7495, -4.13, -14, 0, 0.194, 2.091, 588.4927, 0, 0, 0, 0.193, 3.057, -15400.7789, -3.10, -50, 0, 0.186, 5.598, 16799.3582, -0.72, 6, 0, 0.185, 3.886, 1150.6770, 0, 0, 0, 0.183, 1.619, 7178.0144, 1.52, 25, 0, 0.181, 2.635, 8328.3391, 1.52, 25, 0, 0.181, 2.077, 8329.0437, 1.52, 25, 0, 0.179, 3.215, -9652.8694, -0.90, -18, 0, 0.176, 1.716, -8815.0180, -5.26, -69, 0, 0.175, 5.673, 550.7553, 0, 0, 0, 0.170, 2.060, 31295.0580, -5.6, -39, 0, 0.167, 1.239, 7211.7617, -0.7, 6, 0, 0.165, 4.499, 14967.4158, -0.7, 6, 0, 0.164, 3.595, 15540.4531, 0.9, 31, 0, 0.164, 4.237, 522.3694, 0, 0, 0, 0.163, 4.633, 15545.0555, -2.2, -19, 0, 0.161, 0.478, 6428.0209, -2.2, -19, 0, 0.158, 2.03, 13171.5218, -4.3, -38, 0, 0.157, 2.28, 7216.3641, -3.7, -44, 0, 0.154, 5.65, 7935.6705, 1.5, 25, 0, 0.152, 0.46, 29828.9047, -1.3, 12, 0, 0.151, 1.19, -0.7113, 0, 0, 0, 0.150, 1.42, 23942.4334, -1.0, 9, 0, 0.144, 2.75, 7753.3529, 1.5, 25, 0, 0.137, 2.08, 7213.7105, -2.2, -19, 0, 0.137, 1.44, 7214.4152, -2.2, -19, 0, 0.136, 4.46, -1185.6162, -1.8, -22, 0, 0.136, 3.03, 8000.1048, -2.2, -19, 0, 0.134, 2.83, 14756.7124, -0.7, 6, 0, 0.131, 5.05, 6821.0419, -2.2, -19, 0, 0.128, 5.99, -17214.6971, -4.9, -72, 0, 0.127, 5.35, 8721.7124, 1.5, 25, 0, 0.126, 4.49, 46628.2629, -2.0, 19, 0, 0.125, 5.94, 7149.6285, 1.5, 25, 0, 0.124, 1.09, 49067.0695, 1.1, 55, 0, 0.121, 2.88, 15471.7666, 1.2, 28, 0, 0.111, 3.92, 41643.4571, 7.6, 125, -1, 0.110, 1.96, 8904.0299, 1.5, 25, 0, 0.106, 3.30, -18.0489, -2.2, -19, 0, 0.105, 2.30, -4.9310, 1.5, 25, 0, 0.104, 2.22, -6.5590, -1.9, -22, 0, 0.101, 1.44, 1884.9059, -0.1, 0, 0, 0.100, 5.92, 5471.1324, -5.9, -63, 0, 0.099, 1.12, 15149.7333, -0.7, 6, 0, 0.096, 4.73, 15508.9972, -0.4, 10, 0, 0.095, 5.18, 7230.9835, 1.5, 25, 0, 0.093, 3.37, 39900.5266, 3.9, 81, 0, 0.092, 2.01, 25057.0619, 2.7, 53, 0, 0.092, 1.21, -79.6298, 0, 0, 0, 0.092, 1.65, -26310.2523, -4.0, -68, 0, 0.091, 1.01, 42062.5561, -1.0, 23, 0, 0.090, 6.10, 29342.5781, -5.0, -32, 0, 0.090, 4.43, 15542.4020, -0.7, 6, 0, 0.090, 3.80, 15543.1066, -0.7, 6, 0, 0.089, 4.15, 6063.3859, -2.2, -19, 0, 0.086, 4.03, 52.9691, 0, 0, 0, 0.085, 0.49, 47952.4409, -2.6, 11, 0, 0.085, 1.60, 7632.8154, 2.1, 32, 0, 0.084, 0.22, 14392.0773, -0.7, 6, 0, 0.083, 6.22, 6028.4466, -4.0, -41, 0, 0.083, 0.63, -7909.9389, 2.8, 26, 0, 0.083, 5.20, -77.5523, 0, 0, 0, 0.082, 2.74, 8786.1467, -2.2, -19, 0, 0.080, 2.43, 9166.5428, -2.8, -26, 0, 0.080, 3.70, -25405.1732, 4.1, 27, 0, 0.078, 5.68, 48857.5200, 5.4, 106, -1, 0.077, 1.85, 8315.5735, -2.2, -19, 0, 0.075, 5.46, -18191.1103, 1.9, 8, 0, 0.075, 1.41, -16238.6304, 1.3, 1, 0, 0.074, 5.06, 40110.0761, -0.4, 30, 0, 0.072, 2.10, 64.4343, -3.7, -44, 0, 0.071, 2.17, 37671.2695, -3.5, -6, 0, 0.069, 1.71, 16693.4313, -0.7, 6, 0, 0.069, 3.33, -26100.7028, -8.3, -119, 1, 0.068, 1.09, 8329.4028, 1.5, 25, 0, 0.068, 3.62, 8327.9801, 1.5, 25, 0, 0.068, 2.41, 16833.1509, -1.0, 3, 0, 0.067, 3.40, 24709.2971, -3.5, -20, 0, 0.067, 1.65, 8346.7156, -0.3, 3, 0, 0.066, 2.61, 22547.2677, 1.5, 39, 0, 0.066, 3.50, 15576.5113, -1.0, 3, 0, 0.065, 5.76, 33037.9886, -2.0, 5, 0, 0.065, 4.58, 8322.1325, -0.3, 3, 0, 0.065, 6.20, 17913.9868, 3.0, 50, 0, 0.065, 1.50, 22685.8295, -1.0, 9, 0, 0.065, 2.37, 7180.3058, -1.9, -15, 0, 0.064, 1.06, 30943.5332, 2.4, 56, 0, 0.064, 1.89, 8288.8765, 1.5, 25, 0, 0.064, 4.70, 6.0335, 0.3, 4, 0, 0.063, 2.83, 8368.5063, 1.5, 25, 0, 0.063, 5.66, -2580.7819, 0.7, 7, 0, 0.062, 3.78, 7056.3285, -2.2, -19, 0, 0.061, 1.49, 8294.9100, 1.8, 29, 0, 0.061, 0.12, -10281.1714, -0.9, -18, 0, 0.061, 3.06, -8362.4729, -1.2, -21, 0, 0.061, 4.43, 8170.9571, 1.5, 25, 0, 0.059, 5.78, -13.1179, -3.7, -44, 0, 0.059, 5.97, 6625.5702, -2.2, -19, 0, 0.058, 5.01, -0.5080, -0.3, 0, 0, 0.058, 2.73, 7161.0938, -2.2, -19, 0, 0.057, 0.19, 7214.0629, -2.2, -19, 0, 0.057, 4.00, 22199.5029, -4.7, -35, 0, 0.057, 5.38, 8119.1420, 5.8, 76, 0, 0.056, 1.07, 7542.6495, 1.5, 25, 0, 0.056, 0.28, 8486.4258, 1.5, 25, 0, 0.054, 4.19, 16655.0816, 4.6, 75, 0, 0.053, 0.72, 7267.0320, -2.2, -19, 0, 0.053, 3.12, 12.6192, 0.6, 7, 0, 0.052, 2.99, -32896.013, -1.8, -49, 0, 0.052, 3.46, 1097.708, 0, 0, 0, 0.051, 5.37, -6443.786, -1.6, -25, 0, 0.051, 1.35, 7789.401, -2.2, -19, 0, 0.051, 5.83, 40042.502, 0.2, 38, 0, 0.051, 3.63, 9114.733, 1.5, 25, 0, 0.050, 1.51, 8504.484, -2.5, -22, 0, 0.050, 5.23, 16659.684, 1.5, 25, 0, 0.050, 1.15, 7247.820, -2.5, -23, 0, 0.047, 0.25, -1290.421, 0.3, 0, 0, 0.047, 4.67, -32686.464, -6.1, -100, 0, 0.047, 3.49, 548.678, 0, 0, 0, 0.047, 2.37, 6663.308, -2.2, -19, 0, 0.046, 0.98, 1572.084, 0, 0, 0, 0.046, 2.04, 14954.262, -0.7, 6, 0, 0.046, 3.72, 6691.693, -2.2, -19, 0, 0.045, 6.19, -235.287, 0, 0, 0, 0.044, 2.96, 32967.001, -0.1, 27, 0, 0.044, 3.82, -1671.943, -5.6, -66, 0, 0.043, 5.82, 1179.063, 0, 0, 0, 0.043, 0.07, 34152.617, 1.7, 49, 0, 0.043, 3.71, 6514.773, -0.3, 0, 0, 0.043, 5.62, 15.732, -2.5, -23, 0, 0.043, 5.80, 8351.233, -2.2, -19, 0, 0.042, 0.27, 7740.199, 1.5, 25, 0, 0.042, 6.14, 15385.020, -0.7, 6, 0, 0.042, 6.13, 7285.051, -4.1, -41, 0, 0.041, 1.27, 32757.451, 4.2, 78, 0, 0.041, 4.46, 8275.722, 1.5, 25, 0, 0.040, 0.23, 8381.661, 1.5, 25, 0, 0.040, 5.87, -766.864, 2.5, 29, 0, 0.040, 1.66, 254.431, 0, 0, 0, 0.040, 0.40, 9027.981, -0.4, 0, 0, 0.040, 2.96, 7777.936, 1.5, 25, 0, 0.039, 4.67, 33943.068, 6.1, 100, 0, 0.039, 3.52, 8326.062, 1.5, 25, 0, 0.039, 3.75, 21013.887, -6.5, -57, 0, 0.039, 5.60, 606.978, 0, 0, 0, 0.039, 1.19, 8331.321, 1.5, 25, 0, 0.039, 2.84, 7211.433, -2.2, -19, 0, 0.038, 0.67, 7216.693, -2.2, -19, 0, 0.038, 6.22, 25161.867, 0.6, 28, 0, 0.038, 4.40, 7806.322, 1.5, 25, 0, 0.038, 4.16, 9179.168, -2.2, -19, 0, 0.037, 4.73, 14991.999, -0.7, 6, 0, 0.036, 0.35, 67.514, -0.6, -7, 0, 0.036, 3.70, 25266.611, -1.6, 0, 0, 0.036, 5.39, 16328.796, -0.7, 6, 0, 0.035, 1.44, 7174.248, -2.2, -19, 0, 0.035, 5.00, 15684.730, -4.4, -38, 0, 0.035, 0.39, -15.419, -2.2, -19, 0, 0.035, 6.07, 15020.385, -0.7, 6, 0, 0.034, 6.01, 7371.797, -2.2, -19, 0, 0.034, 0.96, -16623.626, -3.4, -54, 0, 0.033, 6.24, 9479.368, 1.5, 25, 0, 0.033, 3.21, 23661.896, 5.2, 82, 0, 0.033, 4.06, 8311.418, -2.2, -19, 0, 0.033, 2.40, 1965.105, 0, 0, 0, 0.033, 5.17, 15489.785, -0.7, 6, 0, 0.033, 5.03, 21986.540, 0.9, 31, 0, 0.033, 4.10, 16691.140, 2.7, 46, 0, 0.033, 5.13, 47114.589, 1.7, 63, 0, 0.033, 4.45, 8917.184, 1.5, 25, 0, 0.033, 4.23, 2.078, 0, 0, 0, 0.032, 2.33, 75.251, 1.5, 25, 0, 0.032, 2.10, 7253.878, -2.2, -19, 0, 0.032, 3.11, -0.224, 1.5, 25, 0, 0.032, 4.43, 16640.462, -0.7, 6, 0, 0.032, 5.68, 8328.363, 0, 0, 0, 0.031, 5.32, 8329.020, 3.0, 50, 0, 0.031, 3.70, 16118.093, -0.7, 6, 0, 0.030, 3.67, 16721.817, -0.7, 6, 0, 0.030, 5.27, -1881.492, -1.2, -15, 0, 0.030, 5.72, 8157.839, -2.2, -19, 0, 0.029, 5.73, -18400.313, -6.7, -94, 0, 0.029, 2.76, 16.000, -2.2, -19, 0, 0.029, 1.75, 8879.447, 1.5, 25, 0, 0.029, 0.32, 8851.061, 1.5, 25, 0, 0.029, 0.90, 14704.903, 3.7, 57, 0, 0.028, 2.90, 15595.723, -0.7, 6, 0, 0.028, 5.88, 16864.631, 0.2, 24, 0, 0.028, 0.63, 16869.234, -2.8, -26, 0, 0.028, 4.04, -18609.863, -2.4, -43, 0, 0.027, 5.83, 6727.736, -5.9, -63, 0, 0.027, 6.12, 418.752, 4.3, 51, 0, 0.027, 0.14, 41157.131, 3.9, 81, 0, 0.026, 3.80, 15.542, 0, 0, 0, 0.026, 1.68, 50181.698, 4.8, 99, -1, 0.026, 0.32, 315.469, 0, 0, 0, 0.025, 5.67, 19.188, 0.3, 0, 0, 0.025, 3.16, 62.133, -2.2, -19, 0, 0.025, 3.76, 15502.939, -0.7, 6, 0, 0.025, 4.53, 45999.961, -2.0, 19, 0, 0.024, 3.21, 837.851, -4.4, -51, 0, 0.024, 2.82, 38157.596, 0.3, 37, 0, 0.024, 5.21, 15540.124, -0.7, 6, 0, 0.024, 0.26, 14218.576, 0, 13, 0, 0.024, 3.01, 15545.384, -0.7, 6, 0, 0.024, 1.16, -17424.247, -0.6, -21, 0, 0.023, 2.34, -67.574, 0.6, 7, 0, 0.023, 2.44, 18.024, -1.9, -22, 0, 0.023, 3.70, 469.400, 0, 0, 0, 0.023, 0.72, 7136.511, -2.2, -19, 0, 0.023, 4.50, 15582.569, -0.7, 6, 0, 0.023, 2.80, -16586.395, -4.9, -72, 0, 0.023, 1.51, 80.182, 0, 0, 0, 0.023, 1.09, 5261.583, -1.5, -12, 0, 0.023, 0.56, 54956.954, -0.5, 44, 0, 0.023, 4.01, 8550.860, -2.2, -19, 0, 0.023, 4.46, 38995.448, -4.1, -14, 0, 0.023, 3.82, 2358.126, 0, 0, 0, 0.022, 3.77, 32271.125, 0.5, 34, 0, 0.022, 0.82, 15935.775, -0.7, 6, 0, 0.022, 1.07, 24013.421, -2.9, -13, 0, 0.022, 0.40, 8940.078, -2.2, -19, 0, 0.022, 2.06, 15700.489, -0.7, 6, 0, 0.022, 4.27, 15124.002, -5.0, -45, 0, 0.021, 1.16, 56071.583, 3.2, 88, 0, 0.021, 5.58, 9572.189, -2.2, -19, 0, 0.020, 1.70, -17.273, -3.7, -44, 0, 0.020, 3.05, 214.617, 0, 0, 0, 0.020, 4.41, 8391.048, -2.2, -19, 0, 0.020, 5.95, 23869.145, 2.4, 56, 0, 0.020, 0.42, 40947.927, -4.7, -21, 0, 0.019, 1.39, 5818.897, 0.3, 10, 0, 0.019, 0.71, 23873.747, -0.7, 6, 0, 0.019, 2.81, 7291.615, -2.2, -19, 0, 0.019, 5.09, 8428.018, -2.2, -19, 0, 0.019, 4.14, 6518.187, -1.6, -12, 0, 0.019, 3.85, 21.330, 0, 0, 0, 0.018, 0.66, 14445.046, -0.7, 6, 0, 0.018, 1.65, 0.966, -4.0, -48, 0, 0.018, 5.64, -17143.709, -6.8, -94, 0, 0.018, 6.01, 7736.432, -2.2, -19, 0, 0.018, 2.74, 31153.083, -1.9, 5, 0, 0.018, 4.58, 6116.355, -2.2, -19, 0, 0.018, 2.28, 46.401, 0.3, 0, 0, 0.018, 3.80, 10213.597, 1.4, 25, 0, 0.018, 2.84, 56281.132, -1.1, 36, 0, 0.018, 3.53, 8249.062, 1.5, 25, 0, 0.017, 4.43, 20871.911, -3, -13, 0, 0.017, 4.44, 627.596, 0, 0, 0, 0.017, 1.85, 628.308, 0, 0, 0, 0.017, 1.19, 8408.321, 2, 25, 0, 0.017, 1.95, 7214.056, -2, -19, 0, 0.017, 1.57, 7214.070, -2, -19, 0, 0.017, 1.65, 13870.811, -6, -60, 0, 0.017, 0.30, 22.542, -4, -44, 0, 0.017, 2.62, -119.445, 0, 0, 0, 0.016, 4.87, 5747.909, 2, 32, 0, 0.016, 4.45, 14339.108, -1, 6, 0, 0.016, 1.83, 41366.680, 0, 30, 0, 0.016, 4.53, 16309.618, -3, -23, 0, 0.016, 2.54, 15542.754, -1, 6, 0, 0.016, 6.05, 1203.646, 0, 0, 0, 0.015, 5.2, 2751.147, 0, 0, 0, 0.015, 1.8, -10699.924, -5, -69, 0, 0.015, 0.4, 22824.391, -3, -20, 0, 0.015, 2.1, 30666.756, -6, -39, 0, 0.015, 2.1, 6010.417, -2, -19, 0, 0.015, 0.7, -23729.470, -5, -75, 0, 0.015, 1.4, 14363.691, -1, 6, 0, 0.015, 5.8, 16900.689, -2, 0, 0, 0.015, 5.2, 23800.458, 3, 53, 0, 0.015, 5.3, 6035.000, -2, -19, 0, 0.015, 1.2, 8251.139, 2, 25, 0, 0.015, 3.6, -8.860, 0, 0, 0, 0.015, 0.8, 882.739, 0, 0, 0, 0.015, 3.0, 1021.329, 0, 0, 0, 0.015, 0.6, 23296.107, 1, 31, 0, 0.014, 5.4, 7227.181, 2, 25, 0, 0.014, 0.1, 7213.352, -2, -19, 0, 0.014, 4.0, 15506.706, 3, 50, 0, 0.014, 3.4, 7214.774, -2, -19, 0, 0.014, 4.6, 6665.385, -2, -19, 0, 0.014, 0.1, -8.636, -2, -22, 0, 0.014, 3.1, 15465.202, -1, 6, 0, 0.014, 4.9, 508.863, 0, 0, 0, 0.014, 3.5, 8406.244, 2, 25, 0, 0.014, 1.3, 13313.497, -8, -82, 0, 0.014, 2.8, 49276.619, -3, 0, 0, 0.014, 0.1, 30528.194, -3, -10, 0, 0.013, 1.7, 25128.050, 1, 31, 0, 0.013, 2.9, 14128.405, -1, 6, 0, 0.013, 3.4, 57395.761, 3, 80, 0, 0.013, 2.7, 13029.546, -1, 6, 0, 0.013, 3.9, 7802.556, -2, -19, 0, 0.013, 1.6, 8258.802, -2, -19, 0, 0.013, 2.2, 8417.709, -2, -19, 0, 0.013, 0.7, 9965.210, -2, -19, 0, 0.013, 3.4, 50391.247, 0, 48, 0, 0.013, 3.0, 7134.433, -2, -19, 0, 0.013, 2.9, 30599.182, -5, -31, 0, 0.013, 3.6, -9723.857, 1, 0, 0, 0.013, 4.8, 7607.084, -2, -19, 0, 0.012, 0.8, 23837.689, 1, 35, 0, 0.012, 3.6, 4.409, -4, -44, 0, 0.012, 5.0, 16657.031, 3, 50, 0, 0.012, 4.4, 16657.735, 3, 50, 0, 0.012, 1.1, 15578.803, -4, -38, 0, 0.012, 6.0, -11.490, 0, 0, 0, 0.012, 1.9, 8164.398, 0, 0, 0, 0.012, 2.4, 31852.372, -4, -17, 0, 0.012, 2.4, 6607.085, -2, -19, 0, 0.012, 4.2, 8359.870, 0, 0, 0, 0.012, 0.5, 5799.713, -2, -19, 0, 0.012, 2.7, 7220.622, 0, 0, 0, 0.012, 4.3, -139.720, 0, 0, 0, 0.012, 2.3, 13728.836, -2, -16, 0, 0.011, 3.6, 14912.146, 1, 31, 0, 0.011, 4.7, 14916.748, -2, -19, 0},
+ {1.67680, 4.66926, 628.301955, -0.0266, 0.1, -0.005, 0.51642, 3.3721, 6585.760910, -2.158, -18.9, 0.09, 0.41383, 5.7277, 14914.452335, -0.635, 6.2, -0.04, 0.37115, 3.9695, 7700.389469, 1.550, 25.0, -0.12, 0.27560, 0.7416, 8956.993380, 1.496, 25.1, -0.13, 0.24599, 4.2253, -2.301200, 1.523, 25.1, -0.12, 0.07118, 0.1443, 7842.36482, -2.211, -19, 0.08, 0.06128, 2.4998, 16171.05625, -0.688, 6, 0, 0.04516, 0.443, 8399.67910, -0.36, 3, 0, 0.04048, 5.771, 14286.15038, -0.61, 6, 0, 0.03747, 4.626, 1256.60391, -0.05, 0, 0, 0.03707, 3.415, 5957.45895, -2.13, -19, 0.1, 0.03649, 1.800, 23243.14376, 0.89, 31, -0.2, 0.02438, 0.042, 16029.08089, 3.07, 50, -0.2, 0.02165, 1.017, -1742.93051, -3.68, -44, 0.2, 0.01923, 3.097, 17285.68480, 3.02, 50, -0.3, 0.01692, 1.280, 0.3286, 1.52, 25, -0.1, 0.01361, 0.298, 8326.3902, 3.05, 50, -0.2, 0.01293, 4.013, 7072.0875, 1.58, 25, -0.1, 0.01276, 4.413, 8330.9926, 0, 0, 0, 0.01270, 0.101, 8470.6668, -2.24, -19, 0.1, 0.01097, 1.203, 22128.5152, -2.82, -13, 0, 0.01088, 2.545, 15542.7543, -0.66, 6, 0, 0.00835, 0.190, 7214.0629, -2.18, -19, 0.1, 0.00734, 4.855, 24499.7477, 0.83, 31, -0.2, 0.00686, 5.130, 13799.8238, -4.34, -38, 0.2, 0.00631, 0.930, -486.3266, -3.73, -44, 0, 0.00585, 0.699, 9585.2953, 1.5, 25, 0, 0.00566, 4.073, 8328.3391, 1.5, 25, 0, 0.00566, 0.638, 8329.0437, 1.5, 25, 0, 0.00539, 2.472, -1952.4800, 0.6, 7, 0, 0.00509, 2.88, -0.7113, 0, 0, 0, 0.00469, 3.56, 30457.2066, -1.3, 12, 0, 0.00387, 0.78, -0.3523, 0, 0, 0, 0.00378, 1.84, 22614.8418, 0.9, 31, 0, 0.00362, 5.53, -695.8761, 0.6, 7, 0, 0.00317, 2.80, 16728.3705, 1.2, 28, 0, 0.00303, 6.07, 157.7344, 0, 0, 0, 0.00300, 2.53, 33.7570, -0.3, -4, 0, 0.00295, 4.16, 31571.8352, 2.4, 56, 0, 0.00289, 5.98, 7211.7617, -0.7, 6, 0, 0.00285, 2.06, 15540.4531, 0.9, 31, 0, 0.00283, 2.65, 2.6298, 0, 0, 0, 0.00282, 6.17, 15545.0555, -2.2, -19, 0, 0.00278, 1.23, -39.8149, 0, 0, 0, 0.00272, 3.82, 7216.3641, -3.7, -44, 0, 0.00270, 4.37, 70.9877, -1.9, -22, 0, 0.00256, 5.81, 13657.8484, -0.6, 6, 0, 0.00244, 5.64, -0.2237, 1.5, 25, 0, 0.00240, 2.96, 8311.7707, -2.2, -19, 0, 0.00239, 0.87, -33.7814, 0.3, 4, 0, 0.00216, 2.31, 15.9995, -2.2, -19, 0, 0.00186, 3.46, 5329.1570, -2.1, -19, 0, 0.00169, 2.40, 24357.772, 4.6, 75, 0, 0.00161, 5.80, 8329.403, 1.5, 25, 0, 0.00161, 5.20, 8327.980, 1.5, 25, 0, 0.00160, 4.26, 23385.119, -2.9, -13, 0, 0.00156, 1.26, 550.755, 0, 0, 0, 0.00155, 1.25, 21500.213, -2.8, -13, 0, 0.00152, 0.60, -16.921, -3.7, -44, 0, 0.00150, 2.71, -79.630, 0, 0, 0, 0.00150, 5.29, 15.542, 0, 0, 0, 0.00148, 1.06, -2371.232, -3.7, -44, 0, 0.00141, 0.77, 8328.691, 1.5, 25, 0, 0.00141, 3.67, 7143.075, -0.3, 0, 0, 0.00138, 5.45, 25614.376, 4.5, 75, 0, 0.00129, 4.90, 23871.446, 0.9, 31, 0, 0.00126, 4.03, 141.975, -3.8, -44, 0, 0.00124, 6.01, 522.369, 0, 0, 0, 0.00120, 4.94, -10071.622, -5.2, -69, 0, 0.00118, 5.07, -15.419, -2.2, -19, 0, 0.00107, 3.49, 23452.693, -3.4, -20, 0, 0.00104, 4.78, 17495.234, -1.3, 0, 0, 0.00103, 1.44, -18.049, -2.2, -19, 0, 0.00102, 5.63, 15542.402, -0.7, 6, 0, 0.00102, 2.59, 15543.107, -0.7, 6, 0, 0.00100, 4.11, -6.559, -1.9, -22, 0, 0.00097, 0.08, 15400.779, 3.1, 50, 0, 0.00096, 5.84, 31781.385, -1.9, 5, 0, 0.00094, 1.08, 8328.363, 0, 0, 0, 0.00094, 2.46, 16799.358, -0.7, 6, 0, 0.00094, 1.69, 6376.211, 2.2, 32, 0, 0.00093, 3.64, 8329.020, 3.0, 50, 0, 0.00093, 2.65, 16655.082, 4.6, 75, 0, 0.00090, 1.90, 15056.428, -4.4, -38, 0, 0.00089, 1.59, 52.969, 0, 0, 0, 0.00088, 2.02, -8257.704, -3.4, -47, 0, 0.00088, 3.02, 7213.711, -2.2, -19, 0, 0.00087, 0.50, 7214.415, -2.2, -19, 0, 0.00087, 0.49, 16659.684, 1.5, 25, 0, 0.00082, 5.64, -4.931, 1.5, 25, 0, 0.00079, 5.17, 13171.522, -4.3, -38, 0, 0.00076, 3.60, 29828.905, -1.3, 12, 0, 0.00076, 4.08, 24567.322, 0.3, 24, 0, 0.00076, 4.58, 1884.906, -0.1, 0, 0, 0.00073, 0.33, 31713.811, -1.4, 12, 0, 0.00073, 0.93, 32828.439, 2.4, 56, 0, 0.00071, 5.91, 38785.898, 0.2, 37, 0, 0.00069, 2.20, 15613.742, -2.5, -16, 0, 0.00066, 3.87, 15.732, -2.5, -23, 0, 0.00066, 0.86, 25823.926, 0.2, 24, 0, 0.00065, 2.52, 8170.957, 1.5, 25, 0, 0.00063, 0.18, 8322.132, -0.3, 0, 0, 0.00060, 5.84, 8326.062, 1.5, 25, 0, 0.00060, 5.15, 8331.321, 1.5, 25, 0, 0.00060, 2.18, 8486.426, 1.5, 25, 0, 0.00058, 2.30, -1.731, -4, -44, 0, 0.00058, 5.43, 14357.138, -2, -16, 0, 0.00057, 3.09, 8294.910, 2, 29, 0, 0.00057, 4.67, -8362.473, -1, -21, 0, 0.00056, 4.15, 16833.151, -1, 0, 0, 0.00054, 1.93, 7056.329, -2, -19, 0, 0.00054, 5.27, 8315.574, -2, -19, 0, 0.00052, 5.6, 8311.418, -2, -19, 0, 0.00052, 2.7, -77.552, 0, 0, 0, 0.00051, 4.3, 7230.984, 2, 25, 0, 0.00050, 0.4, -0.508, 0, 0, 0, 0.00049, 5.4, 7211.433, -2, -19, 0, 0.00049, 4.4, 7216.693, -2, -19, 0, 0.00049, 4.3, 16864.631, 0, 24, 0, 0.00049, 2.2, 16869.234, -3, -26, 0, 0.00047, 6.1, 627.596, 0, 0, 0, 0.00047, 5.0, 12.619, 1, 7, 0, 0.00045, 4.9, -8815.018, -5, -69, 0, 0.00044, 1.6, 62.133, -2, -19, 0, 0.00042, 2.9, -13.118, -4, -44, 0, 0.00042, 4.1, -119.445, 0, 0, 0, 0.00041, 4.3, 22756.817, -3, -13, 0, 0.00041, 3.6, 8288.877, 2, 25, 0, 0.00040, 0.5, 6663.308, -2, -19, 0, 0.00040, 1.1, 8368.506, 2, 25, 0, 0.00039, 4.1, 6443.786, 2, 25, 0, 0.00039, 3.1, 16657.383, 3, 50, 0, 0.00038, 0.1, 16657.031, 3, 50, 0, 0.00038, 3.0, 16657.735, 3, 50, 0, 0.00038, 4.6, 23942.433, -1, 9, 0, 0.00037, 4.3, 15385.020, -1, 6, 0, 0.00037, 5.0, 548.678, 0, 0, 0, 0.00036, 1.8, 7213.352, -2, -19, 0, 0.00036, 1.7, 7214.774, -2, -19, 0, 0.00035, 1.1, 7777.936, 2, 25, 0, 0.00035, 1.6, -8.860, 0, 0, 0, 0.00035, 4.4, 23869.145, 2, 56, 0, 0.00035, 2.0, 6691.693, -2, -19, 0, 0.00034, 1.3, -1185.616, -2, -22, 0, 0.00034, 2.2, 23873.747, -1, 6, 0, 0.00033, 2.0, -235.287, 0, 0, 0, 0.00033, 3.1, 17913.987, 3, 50, 0, 0.00033, 1.0, 8351.233, -2, -19, 0},
+ {0.004870, 4.6693, 628.30196, -0.027, 0, -0.01, 0.002280, 2.6746, -2.30120, 1.523, 25, -0.12, 0.001500, 3.372, 6585.76091, -2.16, -19, 0.1, 0.001200, 5.728, 14914.45233, -0.64, 6, 0, 0.001080, 3.969, 7700.38947, 1.55, 25, -0.1, 0.000800, 0.742, 8956.99338, 1.50, 25, -0.1, 0.000254, 6.002, 0.3286, 1.52, 25, -0.1, 0.000210, 0.144, 7842.3648, -2.21, -19, 0, 0.000180, 2.500, 16171.0562, -0.7, 6, 0, 0.000130, 0.44, 8399.6791, -0.4, 3, 0, 0.000126, 5.03, 8326.3902, 3.0, 50, 0, 0.000120, 5.77, 14286.1504, -0.6, 6, 0, 0.000118, 5.96, 8330.9926, 0, 0, 0, 0.000110, 1.80, 23243.1438, 0.9, 31, 0, 0.000110, 3.42, 5957.4590, -2.1, -19, 0, 0.000110, 4.63, 1256.6039, -0.1, 0, 0, 0.000099, 4.70, -0.7113, 0, 0, 0, 0.000070, 0.04, 16029.0809, 3.1, 50, 0, 0.000070, 5.14, 8328.3391, 1.5, 25, 0, 0.000070, 5.85, 8329.0437, 1.5, 25, 0, 0.000060, 1.02, -1742.9305, -3.7, -44, 0, 0.000060, 3.10, 17285.6848, 3.0, 50, 0, 0.000054, 5.69, -0.352, 0, 0, 0, 0.000043, 0.52, 15.542, 0, 0, 0, 0.000041, 2.03, 2.630, 0, 0, 0, 0.000040, 0.10, 8470.667, -2.2, -19, 0, 0.000040, 4.01, 7072.088, 1.6, 25, 0, 0.000036, 2.93, -8.860, -0.3, 0, 0, 0.000030, 1.20, 22128.515, -2.8, -13, 0, 0.000030, 2.54, 15542.754, -0.7, 6, 0, 0.000027, 4.43, 7211.762, -0.7, 6, 0, 0.000026, 0.51, 15540.453, 0.9, 31, 0, 0.000026, 1.44, 15545.055, -2.2, -19, 0, 0.000025, 5.37, 7216.364, -3.7, -44, 0},
+ {0.00001200, 1.041, -2.3012, 1.52, 25, -0.1, 0.00000170, 0.31, -0.711, 0, 0, 0}
+ };
+ private static final double[] QI_KB = {
+ 1640650.479938, 15.21842500,
+ 1642476.703182, 15.21874996,
+ 1683430.515601, 15.218750011,
+ 1752157.640664, 15.218749978,
+ 1807675.003759, 15.218620279,
+ 1883627.765182, 15.218612292,
+ 1907369.128100, 15.218449176,
+ 1936603.140413, 15.218425000,
+ 1939145.524180, 15.218466998,
+ 1947180.798300, 15.218524844,
+ 1964362.041824, 15.218533526,
+ 1987372.340971, 15.218513908,
+ 1999653.819126, 15.218530782,
+ 2007445.469786, 15.218535181,
+ 2021324.917146, 15.218526248,
+ 2047257.232342, 15.218519654,
+ 2070282.898213, 15.218425000,
+ 2073204.872850, 15.218515221,
+ 2080144.500926, 15.218530782,
+ 2086703.688963, 15.218523776,
+ 2110033.182763, 15.218425000,
+ 2111190.300888, 15.218425000,
+ 2113731.271005, 15.218515671,
+ 2120670.840263, 15.218425000,
+ 2123973.309063, 15.218425000,
+ 2125068.997336, 15.218477932,
+ 2136026.312633, 15.218472436,
+ 2156099.495538, 15.218425000,
+ 2159021.324663, 15.218425000,
+ 2162308.575254, 15.218461742,
+ 2178485.706538, 15.218425000,
+ 2178759.662849, 15.218445786,
+ 2185334.020800, 15.218425000,
+ 2187525.481425, 15.218425000,
+ 2188621.191481, 15.218437494,
+ 2322147.76
+ };
+ private static final double[] SHUO_KB = {1457698.231017, 29.53067166, 1546082.512234, 29.53085106, 1640640.735300, 29.53060000, 1642472.151543, 29.53085439, 1683430.509300, 29.53086148, 1752148.041079, 29.53085097, 1807665.420323, 29.53059851, 1883618.114100, 29.53060000, 1907360.704700, 29.53060000, 1936596.224900, 29.53060000, 1939135.675300, 29.53060000, 1947168.00};
+ private static final String QB = decode("FrcFs22AFsckF2tsDtFqEtF1posFdFgiFseFtmelpsEfhkF2anmelpFlF1ikrotcnEqEq2FfqmcDsrFor22FgFrcgDscFs22FgEeFtE2sfFs22sCoEsaF2tsD1FpeE2eFsssEciFsFnmelpFcFhkF2tcnEqEpFgkrotcnEqrEtFermcDsrE222FgBmcmr22DaEfnaF222sD1FpeForeF2tssEfiFpEoeFssD1iFstEqFppDgFstcnEqEpFg11FscnEqrAoAF2ClAEsDmDtCtBaDlAFbAEpAAAAAD2FgBiBqoBbnBaBoAAAAAAAEgDqAdBqAFrBaBoACdAAf1AACgAAAeBbCamDgEifAE2AABa1C1BgFdiAAACoCeE1ADiEifDaAEqAAFe1AcFbcAAAAAF1iFaAAACpACmFmAAAAAAAACrDaAAADG0");
+ private static final String SB = decode("EqoFscDcrFpmEsF2DfFideFelFpFfFfFiaipqti1ksttikptikqckstekqttgkqttgkqteksttikptikq2fjstgjqttjkqttgkqtekstfkptikq2tijstgjiFkirFsAeACoFsiDaDiADc1AFbBfgdfikijFifegF1FhaikgFag1E2btaieeibggiffdeigFfqDfaiBkF1kEaikhkigeidhhdiegcFfakF1ggkidbiaedksaFffckekidhhdhdikcikiakicjF1deedFhFccgicdekgiFbiaikcfi1kbFibefgEgFdcFkFeFkdcfkF1kfkcickEiFkDacFiEfbiaejcFfffkhkdgkaiei1ehigikhdFikfckF1dhhdikcfgjikhfjicjicgiehdikcikggcifgiejF1jkieFhegikggcikFegiegkfjebhigikggcikdgkaFkijcfkcikfkcifikiggkaeeigefkcdfcfkhkdgkegieidhijcFfakhfgeidieidiegikhfkfckfcjbdehdikggikgkfkicjicjF1dbidikFiggcifgiejkiegkigcdiegfggcikdbgfgefjF1kfegikggcikdgFkeeijcfkcikfkekcikdgkabhkFikaffcfkhkdgkegbiaekfkiakicjhfgqdq2fkiakgkfkhfkfcjiekgFebicggbedF1jikejbbbiakgbgkacgiejkijjgigfiakggfggcibFifjefjF1kfekdgjcibFeFkijcfkfhkfkeaieigekgbhkfikidfcjeaibgekgdkiffiffkiakF1jhbakgdki1dj1ikfkicjicjieeFkgdkicggkighdF1jfgkgfgbdkicggfggkidFkiekgijkeigfiskiggfaidheigF1jekijcikickiggkidhhdbgcfkFikikhkigeidieFikggikhkffaffijhidhhakgdkhkijF1kiakF1kfheakgdkifiggkigicjiejkieedikgdfcggkigieeiejfgkgkigbgikicggkiaideeijkefjeijikhkiggkiaidheigcikaikffikijgkiahi1hhdikgjfifaakekighie1hiaikggikhkffakicjhiahaikggikhkijF1kfejfeFhidikggiffiggkigicjiekgieeigikggiffiggkidheigkgfjkeigiegikifiggkidhedeijcfkFikikhkiggkidhh1ehigcikaffkhkiggkidhh1hhigikekfiFkFikcidhh1hitcikggikhkfkicjicghiediaikggikhkijbjfejfeFhaikggifikiggkigiejkikgkgieeigikggiffiggkigieeigekijcijikggifikiggkideedeijkefkfckikhkiggkidhh1ehijcikaffkhkiggkidhh1hhigikhkikFikfckcidhh1hiaikgjikhfjicjicgiehdikcikggifikigiejfejkieFhegikggifikiggfghigkfjeijkhigikggifikiggkigieeijcijcikfksikifikiggkidehdeijcfdckikhkiggkhghh1ehijikifffffkhsFngErD1pAfBoDd1BlEtFqA2AqoEpDqElAEsEeB2BmADlDkqBtC1FnEpDqnEmFsFsAFnllBbFmDsDiCtDmAB2BmtCgpEplCpAEiBiEoFqFtEqsDcCnFtADnFlEgdkEgmEtEsCtDmADqFtAFrAtEcCqAE1BoFqC1F1DrFtBmFtAC2ACnFaoCgADcADcCcFfoFtDlAFgmFqBq2bpEoAEmkqnEeCtAE1bAEqgDfFfCrgEcBrACfAAABqAAB1AAClEnFeCtCgAADqDoBmtAAACbFiAAADsEtBqAB2FsDqpFqEmFsCeDtFlCeDtoEpClEqAAFrAFoCgFmFsFqEnAEcCqFeCtFtEnAEeFtAAEkFnErAABbFkADnAAeCtFeAfBoAEpFtAABtFqAApDcCGJ");
+
+ private static String decode(String s) {
+ String o = "0000000000";
+ String o2 = o + o;
+ s = s.replace("J", "00");
+ s = s.replace("I", "000");
+ s = s.replace("H", "0000");
+ s = s.replace("G", "00000");
+ s = s.replace("t", "02");
+ s = s.replace("s", "002");
+ s = s.replace("r", "0002");
+ s = s.replace("q", "00002");
+ s = s.replace("p", "000002");
+ s = s.replace("o", "0000002");
+ s = s.replace("n", "00000002");
+ s = s.replace("m", "000000002");
+ s = s.replace("l", "0000000002");
+ s = s.replace("k", "01");
+ s = s.replace("j", "0101");
+ s = s.replace("i", "001");
+ s = s.replace("h", "001001");
+ s = s.replace("g", "0001");
+ s = s.replace("f", "00001");
+ s = s.replace("e", "000001");
+ s = s.replace("d", "0000001");
+ s = s.replace("c", "00000001");
+ s = s.replace("b", "000000001");
+ s = s.replace("a", "0000000001");
+ s = s.replace("A", o2 + o2 + o2);
+ s = s.replace("B", o2 + o2 + o);
+ s = s.replace("C", o2 + o2);
+ s = s.replace("D", o2 + o);
+ s = s.replace("E", o2);
+ s = s.replace("F", o);
+ return s;
+ }
+
+ public static double nutationLon2(double t) {
+ double a = -1.742 * t, t2 = t * t, dl = 0;
+ for (int i = 0, j = NUT_B.length; i < j; i += 5) {
+ dl += (NUT_B[i + 3] + a) * Math.sin(NUT_B[i] + NUT_B[i + 1] * t + NUT_B[i + 2] * t2);
+ a = 0;
+ }
+ return dl / 100 / SECOND_PER_RAD;
+ }
+
+ public static double eLon(double t, int n) {
+ t /= 10;
+ double v = 0, tn = 1;
+ int n1, n2;
+ int m;
+ double c;
+ int pn = 1;
+ double n0, m0 = XL0[pn + 1] - XL0[pn];
+ for (int i = 0; i < 6; i++, tn *= t) {
+ n1 = (int) XL0[pn + i];
+ n2 = (int) XL0[pn + 1 + i];
+ n0 = n2 - n1;
+ if (n0 == 0) {
+ continue;
+ }
+ if (n < 0) {
+ m = n2;
+ } else {
+ m = (int) (3 * n * n0 / m0 + 0.5) + n1;
+ if (i != 0) {
+ m += 3;
+ }
+ if (m > n2) {
+ m = n2;
+ }
+ }
+ c = 0;
+ for (int j = n1; j < m; j += 3) {
+ c += XL0[j] * Math.cos(XL0[j + 1] + t * XL0[j + 2]);
+ }
+ v += c * tn;
+ }
+ v /= XL0[0];
+ double t2 = t * t;
+ v += (-0.0728 - 2.7702 * t - 1.1019 * t2 - 0.0996 * t2 * t) / SECOND_PER_RAD;
+ return v;
+ }
+
+ public static double mLon(double t, int n) {
+ int obl = XL1[0].length;
+ double tn = 1;
+ double v = 0;
+ int j;
+ double c;
+ double t2 = t * t,
+ t3 = t2 * t,
+ t4 = t3 * t,
+ t5 = t4 * t,
+ tx = t - 10;
+ v += (3.81034409 + 8399.684730072 * t - 3.319e-05 * t2 + 3.11e-08 * t3 - 2.033e-10 * t4) * SECOND_PER_RAD;
+ v += 5028.792262 * t + 1.1124406 * t2 + 0.00007699 * t3 - 0.000023479 * t4 - 0.0000000178 * t5;
+ if (tx > 0) {
+ v += -0.866 + 1.43 * tx + 0.054 * tx * tx;
+ }
+ t2 /= 1e4;
+ t3 /= 1e8;
+ t4 /= 1e8;
+
+ n *= 6;
+ if (n < 0) {
+ n = obl;
+ }
+ for (int i = 0, x = XL1.length; i < x; i++, tn *= t) {
+ double[] f = XL1[i];
+ int l = f.length;
+ int m = (int) (n * l / obl + 0.5);
+ if (i > 0) {
+ m += 6;
+ }
+ if (m >= l) {
+ m = l;
+ }
+ for (j = 0, c = 0; j < m; j += 6) {
+ c += f[j] * Math.cos(f[j + 1] + t * f[j + 2] + t2 * f[j + 3] + t3 * f[j + 4] + t4 * f[j + 5]);
+ }
+ v += c * tn;
+ }
+ v /= SECOND_PER_RAD;
+ return v;
+ }
+
+ public static double gxcSunLon(double t) {
+ double t2 = t * t;
+ double v = -0.043126 + 628.301955 * t - 0.000002732 * t2;
+ double e = 0.016708634 - 0.000042037 * t - 0.0000001267 * t2;
+ return -20.49552 * (1 + e * Math.cos(v)) / SECOND_PER_RAD;
+ }
+
+ public static double ev(double t) {
+ double f = 628.307585 * t;
+ return 628.332 + 21 * Math.sin(1.527 + f) + 0.44 * Math.sin(1.48 + f * 2) + 0.129 * Math.sin(5.82 + f) * t + 0.00055 * Math.sin(4.21 + f) * t * t;
+ }
+
+ public static double saLon(double t, int n) {
+ return eLon(t, n) + nutationLon2(t) + gxcSunLon(t) + Math.PI;
+ }
+
+ public static double dtExt(double y, double jsd) {
+ double dy = (y - 1820) / 100;
+ return -20 + jsd * dy * dy;
+ }
+
+ public static double dtCalc(double y) {
+ int size = DT_AT.length;
+ double y0 = DT_AT[size - 2];
+ double t0 = DT_AT[size - 1];
+ if (y >= y0) {
+ double jsd = 31;
+ if (y > y0 + 100) {
+ return dtExt(y, jsd);
+ }
+ return dtExt(y, jsd) - (dtExt(y0, jsd) - t0) * (y0 + 100 - y) / 100;
+ }
+ int i;
+ for (i = 0; i < size; i += 5) {
+ if (y < DT_AT[i + 5]) {
+ break;
+ }
+ }
+ double t1 = (y - DT_AT[i]) / (DT_AT[i + 5] - DT_AT[i]) * 10, t2 = t1 * t1, t3 = t2 * t1;
+ return DT_AT[i + 1] + DT_AT[i + 2] * t1 + DT_AT[i + 3] * t2 + DT_AT[i + 4] * t3;
+ }
+
+ public static double dtT(double t) {
+ return dtCalc(t / 365.2425 + 2000) / SECOND_PER_DAY;
+ }
+
+ public static double mv(double t) {
+ double v = 8399.71 - 914 * Math.sin(0.7848 + 8328.691425 * t + 0.0001523 * t * t);
+ v -= 179 * Math.sin(2.543 + 15542.7543 * t) + 160 * Math.sin(0.1874 + 7214.0629 * t) + 62 * Math.sin(3.14 + 16657.3828 * t) + 34 * Math.sin(4.827 + 16866.9323 * t) + 22 * Math.sin(4.9 + 23871.4457 * t) + 12 * Math.sin(2.59 + 14914.4523 * t) + 7 * Math.sin(0.23 + 6585.7609 * t) + 5 * Math.sin(0.9 + 25195.624 * t) + 5 * Math.sin(2.32 - 7700.3895 * t) + 5 * Math.sin(3.88 + 8956.9934 * t) + 5 * Math.sin(0.49 + 7771.3771 * t);
+ return v;
+ }
+
+ public static double saLonT(double w) {
+ double v = 628.3319653318;
+ double t = (w - 1.75347 - Math.PI) / v;
+ v = ev(t);
+ t += (w - saLon(t, 10)) / v;
+ v = ev(t);
+ t += (w - saLon(t, -1)) / v;
+ return t;
+ }
+
+ public static double msaLon(double t, int mn, int sn) {
+ return mLon(t, mn) + (-3.4E-6) - (eLon(t, sn) + gxcSunLon(t) + Math.PI);
+ }
+
+ public static double msaLonT(double w) {
+ double v = 7771.37714500204;
+ double t = (w + 1.08472) / v;
+ t += (w - msaLon(t, 3, 3)) / v;
+ v = mv(t) - ev(t);
+ t += (w - msaLon(t, 20, 10)) / v;
+ t += (w - msaLon(t, -1, 60)) / v;
+ return t;
+ }
+
+ public static double saLonT2(double w) {
+ double v = 628.3319653318;
+ double t = (w - 1.75347 - Math.PI) / v;
+ t -= (0.000005297 * t * t + 0.0334166 * Math.cos(4.669257 + 628.307585 * t) + 0.0002061 * Math.cos(2.67823 + 628.307585 * t) * t) / v;
+ t += (w - eLon(t, 8) - Math.PI + (20.5 + 17.2 * Math.sin(2.1824 - 33.75705 * t)) / SECOND_PER_RAD) / v;
+ return t;
+ }
+
+ public static double msaLonT2(double w) {
+ double v = 7771.37714500204;
+ double t = (w + 1.08472) / v;
+ double t2 = t * t;
+ t -= (-0.00003309 * t2 + 0.10976 * Math.cos(0.784758 + 8328.6914246 * t + 0.000152292 * t2) + 0.02224 * Math.cos(0.18740 + 7214.0628654 * t - 0.00021848 * t2) - 0.03342 * Math.cos(4.669257 + 628.307585 * t)) / v;
+ t2 = t * t;
+ double l = mLon(t, 20) - (4.8950632 + 628.3319653318 * t + 0.000005297 * t2 + 0.0334166 * Math.cos(4.669257 + 628.307585 * t) + 0.0002061 * Math.cos(2.67823 + 628.307585 * t) * t + 0.000349 * Math.cos(4.6261 + 1256.61517 * t) - 20.5 / SECOND_PER_RAD);
+ v = 7771.38 - 914 * Math.sin(0.7848 + 8328.691425 * t + 0.0001523 * t2) - 179 * Math.sin(2.543 + 15542.7543 * t) - 160 * Math.sin(0.1874 + 7214.0629 * t);
+ t += (w - l) / v;
+ return t;
+ }
+
+ public static double qiHigh(double w) {
+ double t = saLonT2(w) * 36525;
+ t = t - dtT(t) + ONE_THIRD;
+ double v = ((t + 0.5) % 1) * SECOND_PER_DAY;
+ if (v < 1200 || v > SECOND_PER_DAY - 1200) {
+ t = saLonT(w) * 36525 - dtT(t) + ONE_THIRD;
+ }
+ return t;
+ }
+
+ public static double shuoHigh(double w) {
+ double t = msaLonT2(w) * 36525;
+ t = t - dtT(t) + ONE_THIRD;
+ double v = ((t + 0.5) % 1) * SECOND_PER_DAY;
+ if (v < 1800 || v > SECOND_PER_DAY - 1800) {
+ t = msaLonT(w) * 36525 - dtT(t) + ONE_THIRD;
+ }
+ return t;
+ }
+
+ public static double qiLow(double w) {
+ double v = 628.3319653318;
+ double t = (w - 4.895062166) / v;
+ t -= (53 * t * t + 334116 * Math.cos(4.67 + 628.307585 * t) + 2061 * Math.cos(2.678 + 628.3076 * t) * t) / v / 10000000;
+ double n = 48950621.66 + 6283319653.318 * t + 53 * t * t + 334166 * Math.cos(4.669257 + 628.307585 * t) + 3489 * Math.cos(4.6261 + 1256.61517 * t) + 2060.6 * Math.cos(2.67823 + 628.307585 * t) * t - 994 - 834 * Math.sin(2.1824 - 33.75705 * t);
+ t -= (n / 10000000 - w) / 628.332 + (32 * (t + 1.8) * (t + 1.8) - 20) / SECOND_PER_DAY / 36525;
+ return t * 36525 + ONE_THIRD;
+ }
+
+ public static double shuoLow(double w) {
+ double v = 7771.37714500204;
+ double t = (w + 1.08472) / v;
+ t -= (-0.0000331 * t * t + 0.10976 * Math.cos(0.785 + 8328.6914 * t) + 0.02224 * Math.cos(0.187 + 7214.0629 * t) - 0.03342 * Math.cos(4.669 + 628.3076 * t)) / v + (32 * (t + 1.8) * (t + 1.8) - 20) / SECOND_PER_DAY / 36525;
+ return t * 36525 + ONE_THIRD;
+ }
+
+ public static double calcShuo(double jd) {
+ int size = SHUO_KB.length;
+ double d = 0;
+ int pc = 14, i;
+ jd += 2451545;
+ double f1 = SHUO_KB[0] - pc, f2 = SHUO_KB[size - 1] - pc, f3 = 2436935;
+ if (jd < f1 || jd >= f3) {
+ d = Math.floor(shuoHigh(Math.floor((jd + pc - 2451551) / 29.5306) * PI_2) + 0.5);
+ } else if (jd >= f1 && jd < f2) {
+ for (i = 0; i < size; i += 2) {
+ if (jd + pc < SHUO_KB[i + 2]) {
+ break;
+ }
+ }
+ d = SHUO_KB[i] + SHUO_KB[i + 1] * Math.floor((jd + pc - SHUO_KB[i]) / SHUO_KB[i + 1]);
+ d = Math.floor(d + 0.5);
+ if (d == 1683460) {
+ d++;
+ }
+ d -= 2451545;
+ } else if (jd >= f2) {
+ d = Math.floor(shuoLow(Math.floor((jd + pc - 2451551) / 29.5306) * PI_2) + 0.5);
+ int from = (int) ((jd - f2) / 29.5306);
+ String n = SB.substring(from, from + 1);
+ if ("1".equals(n)) {
+ d += 1;
+ } else if ("2".equals(n)) {
+ d -= 1;
+ }
+ }
+ return d;
+ }
+
+ public static double calcQi(double jd) {
+ int size = QI_KB.length;
+ double d = 0;
+ int pc = 7, i;
+ jd += 2451545;
+ double f1 = QI_KB[0] - pc, f2 = QI_KB[size - 1] - pc, f3 = 2436935;
+ if (jd < f1 || jd >= f3) {
+ d = Math.floor(qiHigh(Math.floor((jd + pc - 2451259) / 365.2422 * 24) * Math.PI / 12) + 0.5);
+ } else if (jd >= f1 && jd < f2) {
+ for (i = 0; i < size; i += 2) {
+ if (jd + pc < QI_KB[i + 2]) {
+ break;
+ }
+ }
+ d = QI_KB[i] + QI_KB[i + 1] * Math.floor((jd + pc - QI_KB[i]) / QI_KB[i + 1]);
+ d = Math.floor(d + 0.5);
+ if (d == 1683460) {
+ d++;
+ }
+ d -= 2451545;
+ } else if (jd >= f2) {
+ d = Math.floor(qiLow(Math.floor((jd + pc - 2451259) / 365.2422 * 24) * Math.PI / 12) + 0.5);
+ int from = (int) ((jd - f2) / 365.2422 * 24);
+ String n = QB.substring(from, from + 1);
+ if ("1".equals(n)) {
+ d += 1;
+ } else if ("2".equals(n)) {
+ d -= 1;
+ }
+ }
+ return d;
+ }
+
+ public static double qiAccurate(double w) {
+ double t = saLonT(w) * 36525;
+ return t - dtT(t) + ONE_THIRD;
+ }
+
+ public static double qiAccurate2(double jd) {
+ double d = Math.PI / 12;
+ double w = Math.floor((jd + 293) / 365.2422 * 24) * d;
+ double a = qiAccurate(w);
+ if (a - jd > 5) {
+ return qiAccurate(w - d);
+ }
+ if (a - jd < -5) {
+ return qiAccurate(w + d);
+ }
+ return a;
+ }
+
+}
diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java
new file mode 100755
index 0000000000..8f364218de
--- /dev/null
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java
@@ -0,0 +1,360 @@
+/*********************************************************************************
+ * *
+ * The MIT License (MIT) *
+ * *
+ * Copyright (c) 2015-2024 miaixz.org and other contributors. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy *
+ * of this software and associated documentation files (the "Software"), to deal *
+ * in the Software without restriction, including without limitation the rights *
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in *
+ * all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
+ * THE SOFTWARE. *
+ * *
+ ********************************************************************************/
+package org.miaixz.bus.core.center.date.culture;
+
+import org.miaixz.bus.core.center.date.culture.solar.SolarDay;
+import org.miaixz.bus.core.center.date.culture.solar.SolarMonth;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 法定假日(自2001-12-29起)
+ *
+ * @author Kimi Liu
+ * @since Java 17+
+ */
+public class Holiday extends Loops {
+
+ /**
+ * 法定假日名称
+ */
+ public static final String[] NAMES = {
+ "元旦节", "春节", "清明节", "劳动节", "端午节", "中秋节", "国庆节", "国庆中秋", "抗战胜利日"
+ };
+
+ /**
+ * 默认节假日数据
+ * 完整格式:日期+下标+调休+节日
+ * 日期:YYYYMMDD
+ * 节日:{@link Holiday#NAMES} 下标位置,例如,元旦-0,抗战胜利日-8
+ * 调休:0工作日,1调休
+ * 节日:YYYYMMDD
+ */
+ private static final String DATA = "200112290020020101" + "200112300020020101" +
+ "200201010120020101" + "200201020120020101" + "200201030120020101" + "200202091020020212" +
+ "200202101020020212" + "200202121120020212" + "200202131120020212" + "200202141120020212" +
+ "200202151120020212" + "200202161120020212" + "200202171120020212" + "200202181120020212" +
+ "200204273020020501" + "200204283020020501" + "200205013120020501" + "200205023120020501" +
+ "200205033120020501" + "200205043120020501" + "200205053120020501" + "200205063120020501" +
+ "200205073120021001" + "200209286020021001" + "200209296020021001" + "200210016120021001" +
+ "200210026120021001" + "200210036120021001" + "200210046120021001" + "200210056120021001" +
+ "200210066120021001" + "200210076120021001" + "200301010120030101" + "200302011120030201" +
+ "200302021120030201" + "200302031120030201" + "200302041120030201" + "200302051120030201" +
+ "200302061120030201" + "200302071120030201" + "200302081020030201" + "200302091020030201" +
+ "200304263020030501" + "200304273020030501" + "200305013120030501" + "200305023120030501" +
+ "200305033120030501" + "200305043120030501" + "200305053120030501" + "200305063120030501" +
+ "200305073120031001" + "200309276020031001" + "200309286020031001" + "200310016120031001" +
+ "200310026120031001" + "200310036120031001" + "200310046120031001" + "200310056120031001" +
+ "200310066120031001" + "200310076120031001" + "200401010120040101" + "200401171020040122" +
+ "200401181020040122" + "200401221120040122" + "200401231120040122" + "200401241120040122" +
+ "200401251120040122" + "200401261120040122" + "200401271120040122" + "200401281120040122" +
+ "200405013120040501" + "200405023120040501" + "200405033120040501" + "200405043120040501" +
+ "200405053120040501" + "200405063120040501" + "200405073120041001" + "200405083020040501" +
+ "200405093020040501" + "200410016120041001" + "200410026120041001" + "200410036120041001" +
+ "200410046120041001" + "200410056120041001" + "200410066120041001" + "200410076120041001" +
+ "200410096020041001" + "200410106020041001" + "200501010120050101" + "200501020120050101" +
+ "200501030120050101" + "200502051020050209" + "200502061020050209" + "200502091120050209" +
+ "200502101120050209" + "200502111120050209" + "200502121120050209" + "200502131120050209" +
+ "200502141120050209" + "200502151120050209" + "200504303020050501" + "200505013120050501" +
+ "200505023120050501" + "200505033120050501" + "200505043120050501" + "200505053120050501" +
+ "200505063120050501" + "200505073120051001" + "200505083020050501" + "200510016120051001" +
+ "200510026120051001" + "200510036120051001" + "200510046120051001" + "200510056120051001" +
+ "200510066120051001" + "200510076120051001" + "200510086020051001" + "200510096020051001" +
+ "200512310020060101" + "200601010120060101" + "200601020120060101" + "200601030120060101" +
+ "200601281020060129" + "200601291120060129" + "200601301120060129" + "200601311120060129" +
+ "200602011120060129" + "200602021120060129" + "200602031120060129" + "200602041120060129" +
+ "200602051020060129" + "200604293020060501" + "200604303020060501" + "200605013120060501" +
+ "200605023120060501" + "200605033120060501" + "200605043120060501" + "200605053120060501" +
+ "200605063120060501" + "200605073120061001" + "200609306020061001" + "200610016120061001" +
+ "200610026120061001" + "200610036120061001" + "200610046120061001" + "200610056120061001" +
+ "200610066120061001" + "200610076120061001" + "200610086020061001" + "200612300020070101" +
+ "200612310020070101" + "200701010120070101" + "200701020120070101" + "200701030120070101" +
+ "200702171020070218" + "200702181120070218" + "200702191120070218" + "200702201120070218" +
+ "200702211120070218" + "200702221120070218" + "200702231120070218" + "200702241120070218" +
+ "200702251020070218" + "200704283020070501" + "200704293020070501" + "200705013120070501" +
+ "200705023120070501" + "200705033120070501" + "200705043120070501" + "200705053120070501" +
+ "200705063120070501" + "200705073120070501" + "200709296020071001" + "200709306020071001" +
+ "200710016120071001" + "200710026120071001" + "200710036120071001" + "200710046120071001" +
+ "200710056120071001" + "200710066120071001" + "200710076120071001" + "200712290020080101" +
+ "200712300120080101" + "200712310120080101" + "200801010120080101" + "200802021020080206" +
+ "200802031020080206" + "200802061120080206" + "200802071120080206" + "200802081120080206" +
+ "200802091120080206" + "200802101120080206" + "200802111120080206" + "200802121120080206" +
+ "200804042120080404" + "200804052120080404" + "200804062120080404" + "200805013120080501" +
+ "200805023120080501" + "200805033120080501" + "200805043020080501" + "200806074120080608" +
+ "200806084120080608" + "200806094120080608" + "200809135120080914" + "200809145120080914" +
+ "200809155120080914" + "200809276020081001" + "200809286020081001" + "200809296120081001" +
+ "200809306120081001" + "200810016120081001" + "200810026120081001" + "200810036120081001" +
+ "200810046120081001" + "200810056120081001" + "200901010120090101" + "200901020120090101" +
+ "200901030120090101" + "200901040020090101" + "200901241020090125" + "200901251120090125" +
+ "200901261120090125" + "200901271120090125" + "200901281120090125" + "200901291120090125" +
+ "200901301120090125" + "200901311120090125" + "200902011020090125" + "200904042120090404" +
+ "200904052120090404" + "200904062120090404" + "200905013120090501" + "200905023120090501" +
+ "200905033120090501" + "200905284120090528" + "200905294120090528" + "200905304120090528" +
+ "200905314020090528" + "200909276020091001" + "200910016120091001" + "200910026120091001" +
+ "200910036120091001" + "200910046120091001" + "200910055120091003" + "200910065120091003" +
+ "200910075120091003" + "200910085120091003" + "200910105020091003" + "201001010120100101" +
+ "201001020120100101" + "201001030120100101" + "201002131120100213" + "201002141120100213" +
+ "201002151120100213" + "201002161120100213" + "201002171120100213" + "201002181120100213" +
+ "201002191120100213" + "201002201020100213" + "201002211020100213" + "201004032120100405" +
+ "201004042120100405" + "201004052120100405" + "201005013120100501" + "201005023120100501" +
+ "201005033120100501" + "201006124020100616" + "201006134020100616" + "201006144120100616" +
+ "201006154120100616" + "201006164120100616" + "201009195020100922" + "201009225120100922" +
+ "201009235120100922" + "201009245120100922" + "201009255020100922" + "201009266020101001" +
+ "201010016120101001" + "201010026120101001" + "201010036120101001" + "201010046120101001" +
+ "201010056120101001" + "201010066120101001" + "201010076120101001" + "201010096020101001" +
+ "201101010120110101" + "201101020120110101" + "201101030120110101" + "201101301020110203" +
+ "201102021120110203" + "201102031120110203" + "201102041120110203" + "201102051120110203" +
+ "201102061120110203" + "201102071120110203" + "201102081120110203" + "201102121020110203" +
+ "201104022020110405" + "201104032120110405" + "201104042120110405" + "201104052120110405" +
+ "201104303120110501" + "201105013120110501" + "201105023120110501" + "201106044120110606" +
+ "201106054120110606" + "201106064120110606" + "201109105120110912" + "201109115120110912" +
+ "201109125120110912" + "201110016120111001" + "201110026120111001" + "201110036120111001" +
+ "201110046120111001" + "201110056120111001" + "201110066120111001" + "201110076120111001" +
+ "201110086020111001" + "201110096020111001" + "201112310020120101" + "201201010120120101" +
+ "201201020120120101" + "201201030120120101" + "201201211020120123" + "201201221120120123" +
+ "201201231120120123" + "201201241120120123" + "201201251120120123" + "201201261120120123" +
+ "201201271120120123" + "201201281120120123" + "201201291020120123" + "201203312020120404" +
+ "201204012020120404" + "201204022120120404" + "201204032120120404" + "201204042120120404" +
+ "201204283020120501" + "201204293120120501" + "201204303120120501" + "201205013120120501" +
+ "201205023020120501" + "201206224120120623" + "201206234120120623" + "201206244120120623" +
+ "201209295020120930" + "201209305120120930" + "201210016120121001" + "201210026120121001" +
+ "201210036120121001" + "201210046120121001" + "201210056120121001" + "201210066120121001" +
+ "201210076120121001" + "201210086020121001" + "201301010120130101" + "201301020120130101" +
+ "201301030120130101" + "201301050020130101" + "201301060020130101" + "201302091120130210" +
+ "201302101120130210" + "201302111120130210" + "201302121120130210" + "201302131120130210" +
+ "201302141120130210" + "201302151120130210" + "201302161020130210" + "201302171020130210" +
+ "201304042120130404" + "201304052120130404" + "201304062120130404" + "201304273020130501" +
+ "201304283020130501" + "201304293120130501" + "201304303120130501" + "201305013120130501" +
+ "201306084020130612" + "201306094020130612" + "201306104120130612" + "201306114120130612" +
+ "201306124120130612" + "201309195120130919" + "201309205120130919" + "201309215120130919" +
+ "201309225020130919" + "201309296020131001" + "201310016120131001" + "201310026120131001" +
+ "201310036120131001" + "201310046120131001" + "201310056120131001" + "201310066120131001" +
+ "201310076120131001" + "201401010120140101" + "201401261020140131" + "201401311120140131" +
+ "201402011120140131" + "201402021120140131" + "201402031120140131" + "201402041120140131" +
+ "201402051120140131" + "201402061120140131" + "201402081020140131" + "201404052120140405" +
+ "201404062120140405" + "201404072120140405" + "201405013120140501" + "201405023120140501" +
+ "201405033120140501" + "201405043020140501" + "201405314120140602" + "201406014120140602" +
+ "201406024120140602" + "201409065120140908" + "201409075120140908" + "201409085120140908" +
+ "201409286020141001" + "201410016120141001" + "201410026120141001" + "201410036120141001" +
+ "201410046120141004" + "201410056120141001" + "201410066120141001" + "201410076120141001" +
+ "201410116020141001" + "201501010120150101" + "201501020120150101" + "201501030120150101" +
+ "201501040020150101" + "201502151020150219" + "201502181120150219" + "201502191120150219" +
+ "201502201120150219" + "201502211120150219" + "201502221120150219" + "201502231120150219" +
+ "201502241120150219" + "201502281020150219" + "201504042120150405" + "201504052120150405" +
+ "201504062120150405" + "201505013120150501" + "201505023120150501" + "201505033120150501" +
+ "201506204120150620" + "201506214120150620" + "201506224120150620" + "201509038120150903" +
+ "201509048120150903" + "201509058120150903" + "201509068020150903" + "201509265120150927" +
+ "201509275120150927" + "201510016120151001" + "201510026120151001" + "201510036120151001" +
+ "201510046120151004" + "201510056120151001" + "201510066120151001" + "201510076120151001" +
+ "201510106020151001" + "201601010120160101" + "201601020120160101" + "201601030120160101" +
+ "201602061020160208" + "201602071120160208" + "201602081120160208" + "201602091120160208" +
+ "201602101120160208" + "201602111120160208" + "201602121120160208" + "201602131120160208" +
+ "201602141020160208" + "201604022120160404" + "201604032120160404" + "201604042120160404" +
+ "201604303120160501" + "201605013120160501" + "201605023120160501" + "201606094120160609" +
+ "201606104120160609" + "201606114120160609" + "201606124020160609" + "201609155120160915" +
+ "201609165120160915" + "201609175120160915" + "201609185020160915" + "201610016120161001" +
+ "201610026120161001" + "201610036120161001" + "201610046120161001" + "201610056120161001" +
+ "201610066120161001" + "201610076120161001" + "201610086020161001" + "201610096020161001" +
+ "201612310120170101" + "201701010120170101" + "201701020120170101" + "201701221020170128" +
+ "201701271120170128" + "201701281120170128" + "201701291120170128" + "201701301120170128" +
+ "201701311120170128" + "201702011120170128" + "201702021120170128" + "201702041020170128" +
+ "201704012020170404" + "201704022120170404" + "201704032120170404" + "201704042120170404" +
+ "201704293120170501" + "201704303120170501" + "201705013120170501" + "201705274020170530" +
+ "201705284120170530" + "201705294120170530" + "201705304120170530" + "201709306020171001" +
+ "201710016120171001" + "201710026120171001" + "201710036120171001" + "201710045120171004" +
+ "201710056120171001" + "201710066120171001" + "201710076120171001" + "201710086120171001" +
+ "201712300120180101" + "201712310120180101" + "201801010120180101" + "201802111020180216" +
+ "201802151120180216" + "201802161120180216" + "201802171120180216" + "201802181120180216" +
+ "201802191120180216" + "201802201120180216" + "201802211120180216" + "201802241020180216" +
+ "201804052120180405" + "201804062120180405" + "201804072120180405" + "201804082020180405" +
+ "201804283020180501" + "201804293120180501" + "201804303120180501" + "201805013120180501" +
+ "201806164120180618" + "201806174120180618" + "201806184120180618" + "201809225120180924" +
+ "201809235120180924" + "201809245120180924" + "201809296020181001" + "201809306020181001" +
+ "201810016120181001" + "201810026120181001" + "201810036120181001" + "201810046120181001" +
+ "201810056120181001" + "201810066120181001" + "201810076120181001" + "201812290020190101" +
+ "201812300120190101" + "201812310120190101" + "201901010120190101" + "201902021020190205" +
+ "201902031020190205" + "201902041120190205" + "201902051120190205" + "201902061120190205" +
+ "201902071120190205" + "201902081120190205" + "201902091120190205" + "201902101120190205" +
+ "201904052120190405" + "201904062120190405" + "201904072120190405" + "201904283020190501" +
+ "201905013120190501" + "201905023120190501" + "201905033120190501" + "201905043120190501" +
+ "201905053020190501" + "201906074120190607" + "201906084120190607" + "201906094120190607" +
+ "201909135120190913" + "201909145120190913" + "201909155120190913" + "201909296020191001" +
+ "201910016120191001" + "201910026120191001" + "201910036120191001" + "201910046120191001" +
+ "201910056120191001" + "201910066120191001" + "201910076120191001" + "201910126020191001" +
+ "202001010120200101" + "202001191020200125" + "202001241120200125" + "202001251120200125" +
+ "202001261120200125" + "202001271120200125" + "202001281120200125" + "202001291120200125" +
+ "202001301120200125" + "202001311120200125" + "202002011120200125" + "202002021120200125" +
+ "202004042120200404" + "202004052120200404" + "202004062120200404" + "202004263020200501" +
+ "202005013120200501" + "202005023120200501" + "202005033120200501" + "202005043120200501" +
+ "202005053120200501" + "202005093020200501" + "202006254120200625" + "202006264120200625" +
+ "202006274120200625" + "202006284020200625" + "202009277020201001" + "202010017120201001" +
+ "202010026120201001" + "202010036120201001" + "202010046120201001" + "202010056120201001" +
+ "202010066120201001" + "202010076120201001" + "202010086120201001" + "202010106020201001" +
+ "202101010120210101" + "202101020120210101" + "202101030120210101" + "202102071020210212" +
+ "202102111120210212" + "202102121120210212" + "202102131120210212" + "202102141120210212" +
+ "202102151120210212" + "202102161120210212" + "202102171120210212" + "202102201020210212" +
+ "202104032120210404" + "202104042120210404" + "202104052120210404" + "202104253020210501" +
+ "202105013120210501" + "202105023120210501" + "202105033120210501" + "202105043120210501" +
+ "202105053120210501" + "202105083020210501" + "202106124120210614" + "202106134120210614" +
+ "202106144120210614" + "202109185020210921" + "202109195120210921" + "202109205120210921" +
+ "202109215120210921" + "202109266020211001" + "202110016120211001" + "202110026120211001" +
+ "202110036120211001" + "202110046120211001" + "202110056120211001" + "202110066120211001" +
+ "202110076120211001" + "202110096020211001" + "202201010120220101" + "202201020120220101" +
+ "202201030120220101" + "202201291020220201" + "202201301020220201" + "202201311120220201" +
+ "202202011120220201" + "202202021120220201" + "202202031120220201" + "202202041120220201" +
+ "202202051120220201" + "202202061120220201" + "202204022020220405" + "202204032120220405" +
+ "202204042120220405" + "202204052120220405" + "202204243020220501" + "202204303120220501" +
+ "202205013120220501" + "202205023120220501" + "202205033120220501" + "202205043120220501" +
+ "202205073020220501" + "202206034120220603" + "202206044120220603" + "202206054120220603" +
+ "202209105120220910" + "202209115120220910" + "202209125120220910" + "202210016120221001" +
+ "202210026120221001" + "202210036120221001" + "202210046120221001" + "202210056120221001" +
+ "202210066120221001" + "202210076120221001" + "202210086020221001" + "202210096020221001" +
+ "202210096020221001" + "202212310120230101" + "202301010120230101" + "202301020120230101" +
+ "202301211120230122" + "202301221120230122" + "202301231120230122" + "202301241120230122" +
+ "202301251120230122" + "202301261120230122" + "202301271120230122" + "202301281020230122" +
+ "202301291020230122" + "202304052120230405" + "202304233020230501" + "202304293120230501" +
+ "202304303120230501" + "202305013120230501" + "202305023120230501" + "202305033120230501" +
+ "202305063020230501" + "202306224120230622" + "202306234120230622" + "202306244120230622" +
+ "202306254020230622" + "202309295120230929" + "202309306120231001" + "202310016120231001" +
+ "202310026120231001" + "202310036120231001" + "202310046120231001" + "202310056120231001" +
+ "202310066120231001" + "202310076020231001" + "202310086020231001" + "202312300120240101" +
+ "202312310120240101" + "202401010120240101" + "202402041020240210" + "202402101120240210" +
+ "202402111120240210" + "202402121120240210" + "202402131120240210" + "202402141120240210" +
+ "202402151120240210" + "202402161120240210" + "202402171120240210" + "202402181020240210" +
+ "202404042120240404" + "202404052120240404" + "202404062120240404" + "202404072020240404" +
+ "202404283020240501" + "202405013120240501" + "202405023120240501" + "202405033120240501" +
+ "202405043120240501" + "202405053120240501" + "202405113020240501" + "202406084120240610" +
+ "202406094120240610" + "202406104120240610" + "202409145020240917" + "202409155120240917" +
+ "202409165120240917" + "202409175120240917" + "202409296020241001" + "202410016120241001" +
+ "202410026120241001" + "202410036120241001" + "202410046120241001" + "202410056120241001" +
+ "202410066120241001" + "202410076120241001" + "202410126020241001";
+ /**
+ * 公历日
+ */
+ protected SolarDay day;
+
+ /**
+ * 名称
+ */
+ protected String name;
+
+ /**
+ * 是否上班
+ */
+ protected boolean work;
+
+ public Holiday(int year, int month, int day, String data) {
+ this.day = SolarDay.fromYmd(year, month, day);
+ work = '0' == data.charAt(8);
+ name = NAMES[data.charAt(9) - '0'];
+ }
+
+
+ public static Holiday fromYmd(int year, int month, int day) {
+ Matcher matcher = Pattern.compile(String.format("%04d%02d%02d[0-1][0-8][\\+|-]\\d{2}", year, month, day)).matcher(DATA);
+ if (!matcher.find()) {
+ return null;
+ }
+ return new Holiday(year, month, day, matcher.group());
+ }
+
+ public Holiday next(int n) {
+ SolarMonth m = day.getMonth();
+ int year = m.getYear().getYear();
+ int month = m.getMonth();
+ if (n == 0) {
+ return fromYmd(year, month, day.getDay());
+ }
+ List data = new ArrayList<>();
+ String reg = "%04d\\d{4}[0-1][0-8][\\+|-]\\d{2}";
+ String today = String.format("%04d%02d%02d", year, month, day.getDay());
+ Matcher matcher = Pattern.compile(String.format(reg, year)).matcher(DATA);
+ while (matcher.find()) {
+ data.add(matcher.group());
+ }
+ int index = -1;
+ int size = data.size();
+ for (int i = 0; i < size; i++) {
+ if (data.get(i).startsWith(today)) {
+ index = i;
+ break;
+ }
+ }
+ if (index == -1) {
+ return null;
+ }
+ index += n;
+ int y = year;
+ boolean forward = n > 0;
+ int add = forward ? 1 : -1;
+ while (forward ? (index >= size) : (index < 0)) {
+ if (forward) {
+ index -= size;
+ }
+ y += add;
+ data.clear();
+ matcher = Pattern.compile(String.format(reg, y)).matcher(DATA);
+ while (matcher.find()) {
+ data.add(matcher.group());
+ }
+ size = data.size();
+ if (size < 1) {
+ return null;
+ }
+ if (!forward) {
+ index += size;
+ }
+ }
+ String d = data.get(index);
+ return new Holiday(Integer.parseInt(d.substring(0, 4)), Integer.parseInt(d.substring(4, 6)), Integer.parseInt(d.substring(6, 8)), d);
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s %s(%s)", day, name, work ? "班" : "休");
+ }
+
+ public SolarDay getDay() {
+ return day;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * 是否上班
+ *
+ * @return true/false
+ */
+ public boolean isWork() {
+ return work;
+ }
+
+}
diff --git a/bus-proxy/src/main/java/org/miaixz/bus/proxy/Interceptor.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Loops.java
similarity index 93%
rename from bus-proxy/src/main/java/org/miaixz/bus/proxy/Interceptor.java
rename to bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Loops.java
index 4bdb651286..cc5985f413 100755
--- a/bus-proxy/src/main/java/org/miaixz/bus/proxy/Interceptor.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Loops.java
@@ -23,16 +23,14 @@
* THE SOFTWARE. *
* *
********************************************************************************/
-package org.miaixz.bus.proxy;
+package org.miaixz.bus.core.center.date.culture;
/**
- * "拦截"方法调用
+ * 抽象的轮回
*
* @author Kimi Liu
* @since Java 17+
*/
-public interface Interceptor {
-
- Object intercept(Invocation invocation) throws Throwable;
+public abstract class Loops extends Tradition implements Culture {
}
diff --git a/bus-limiter/src/main/java/org/miaixz/bus/limiter/annotation/RateLimiter.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Replenish.java
similarity index 73%
rename from bus-limiter/src/main/java/org/miaixz/bus/limiter/annotation/RateLimiter.java
rename to bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Replenish.java
index dfba6cacf1..930ddebef2 100755
--- a/bus-limiter/src/main/java/org/miaixz/bus/limiter/annotation/RateLimiter.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Replenish.java
@@ -23,47 +23,53 @@
* THE SOFTWARE. *
* *
********************************************************************************/
-package org.miaixz.bus.limiter.annotation;
+package org.miaixz.bus.core.center.date.culture;
-import org.miaixz.bus.core.lang.Normal;
-
-import java.lang.annotation.*;
+import org.miaixz.bus.core.center.date.Almanac;
/**
- * 限流
+ * 附加索引的传统文化
*
* @author Kimi Liu
* @since Java 17+
*/
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Inherited
-@Documented
-public @interface RateLimiter {
-
- String limiter() default Normal.EMPTY;
-
- String key() default Normal.EMPTY;
+public abstract class Replenish extends Tradition {
- String fallback() default "defaultFallbackResolver";
-
- String errorHandler() default "defaultErrorHandler";
-
- String[] argumentInjectors() default {};
+ /**
+ * 传统文化
+ */
+ protected Tradition tradition;
/**
- * 限制的频率 默认 1次/秒
- *
- * @return the double
+ * 天索引
*/
- double rate() default 10.0d;
+ protected int dayIndex;
+
+ public Replenish(Tradition tradition, int dayIndex) {
+ this.tradition = tradition;
+ this.dayIndex = dayIndex;
+ }
/**
- * 最大可累计的令牌容量
- * 默认为 1 且最小为1
+ * 天索引
*
- * @return the long
+ * @return 索引
*/
- long capacity() default 10;
+ public int getDayIndex() {
+ return dayIndex;
+ }
+
+ protected Almanac getTradition() {
+ return tradition;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s第%d天", tradition, dayIndex + 1);
+ }
+
+ public String getName() {
+ return tradition.getName();
+ }
}
diff --git a/bus-tracer/src/main/java/org/miaixz/bus/tracer/monitor/GcEntity.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Samsara.java
old mode 100644
new mode 100755
similarity index 55%
rename from bus-tracer/src/main/java/org/miaixz/bus/tracer/monitor/GcEntity.java
rename to bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Samsara.java
index 4e1bc5017f..5be9e1d9e8
--- a/bus-tracer/src/main/java/org/miaixz/bus/tracer/monitor/GcEntity.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Samsara.java
@@ -23,101 +23,109 @@
* THE SOFTWARE. *
* *
********************************************************************************/
-package org.miaixz.bus.tracer.monitor;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+package org.miaixz.bus.core.center.date.culture;
/**
+ * 轮回的信息
+ * 季度/月/星期/日/小时/分钟等
+ *
* @author Kimi Liu
* @since Java 17+
*/
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class GcEntity {
+public abstract class Samsara extends Loops {
/**
- * 当前应用进程ID
- */
- private Integer id;
- /**
- * 当前应用名称
- */
- private String name;
- /**
- * 时间 格式 MM/dd HH:mm"
+ * 名称列表
*/
- private String date;
+ protected String[] names;
/**
- * Survivor0空间的大小。单位KB。
- */
- private String s0c;
- /**
- * Survivor1空间的大小。单位KB。
- */
- private String s1c;
- /**
- * Survivor0已用空间的大小。单位KB
- */
- private String s0u;
- /**
- * Survivor1已用空间的大小。单位KB。
- */
- private String s1u;
- /**
- * Eden空间的大小。单位KB。
- */
- private String ec;
- /**
- * Eden已用空间的大小。单位KB。
+ * 索引,从0开始
*/
- private String eu;
- /**
- * 老年代空间的大小。单位KB。
- */
- private String oc;
- /**
- * 老年代已用空间的大小。单位KB。
- */
- private String OU;
- /**
- * 元空间的大小(Metaspace)
- */
- private String mc;
+ protected int index;
+
/**
- * 元空间已使用大小(KB)
+ * 通过索引初始化
+ *
+ * @param names 名称列表
+ * @param index 索引,支持负数,自动轮转
*/
- private String mu;
+ protected Samsara(String[] names, int index) {
+ this.names = names;
+ this.index = indexOf(index);
+ }
+
/**
- * 压缩类空间大小(compressed class space)
+ * 通过名称初始化
+ *
+ * @param names 名称列表
+ * @param name 名称
*/
- private String ccsc;
+ protected Samsara(String[] names, String name) {
+ this.names = names;
+ this.index = indexOf(name);
+ }
+
/**
- * 压缩类空间已使用大小(KB)
+ * 名称
+ *
+ * @return 名称
*/
- private String ccsu;
+ public String getName() {
+ return names[index];
+ }
+
/**
- * 新生代gc次数
+ * 索引
+ *
+ * @return 索引,从0开始
*/
- private String ygc;
+ public int getIndex() {
+ return index;
+ }
+
/**
- * 新生代gc耗时(秒)
+ * 数量
+ *
+ * @return 数量
*/
- private String ygct;
+ public int getSize() {
+ return names.length;
+ }
+
/**
- * Full gc次数
- */
- private String fgc;
+ * 名称对应的索引
+ *
+ * @param name 名称
+ * @return 索引,从0开始
+ */
+ protected int indexOf(String name) {
+ for (int i = 0, j = getSize(); i < j; i++) {
+ if (names[i].equals(name)) {
+ return i;
+ }
+ }
+ throw new IllegalArgumentException(String.format("illegal name: %s", name));
+ }
+
/**
- * Full gc耗时(秒)
+ * 转换为不超范围的索引
+ *
+ * @param index 索引
+ * @return 索引,从0开始
*/
- private String fgct;
+ protected int indexOf(int index) {
+ return indexOf(index, getSize());
+ }
+
/**
- * gc总耗时(秒)
+ * 推移后的索引
+ *
+ * @param n 推移步数
+ * @return 索引,从0开始
*/
- private String gct;
+ protected int nextIndex(int n) {
+ return indexOf(index + n);
+ }
}
diff --git a/bus-tracer/src/main/java/org/miaixz/bus/tracer/thread/ThreadLocalMap.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Tradition.java
similarity index 77%
rename from bus-tracer/src/main/java/org/miaixz/bus/tracer/thread/ThreadLocalMap.java
rename to bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Tradition.java
index 98405bccfb..1879bb395d 100755
--- a/bus-tracer/src/main/java/org/miaixz/bus/tracer/thread/ThreadLocalMap.java
+++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Tradition.java
@@ -23,29 +23,41 @@
* THE SOFTWARE. *
* *
********************************************************************************/
-package org.miaixz.bus.tracer.thread;
+package org.miaixz.bus.core.center.date.culture;
-import java.util.HashMap;
-import java.util.Map;
+import org.miaixz.bus.core.center.date.Almanac;
/**
+ * 中国传统文化
+ *
* @author Kimi Liu
* @since Java 17+
*/
-class ThreadLocalMap extends InheritableThreadLocal