java 实现二十四节气
来源:互联网 发布:jquery数组删除空元素 编辑:程序博客网 时间:2024/05/13 02:21
直接贴代码
public class _24SolarTerms { private static final double D = 0.2422; private final static Map<String, Integer[]> INCREASE_OFFSETMAP = new HashMap<String, Integer[]>();// +1偏移 private final static Map<String, Integer[]> DECREASE_OFFSETMAP = new HashMap<String, Integer[]>();// -1偏移 /** 24节气 **/ private static enum SolarTermsEnum { LICHUN, // --立春 YUSHUI, // --雨水 JINGZHE, // --惊蛰 CHUNFEN, // 春分 QINGMING, // 清明 GUYU, // 谷雨 LIXIA, // 立夏 XIAOMAN, // 小满 MANGZHONG, // 芒种 XIAZHI, // 夏至 XIAOSHU, // 小暑 DASHU, // 大暑 LIQIU, // 立秋 CHUSHU, // 处暑 BAILU, // 白露 QIUFEN, // 秋分 HANLU, // 寒露 SHUANGJIANG, // 霜降 LIDONG, // 立冬 XIAOXUE, // 小雪 DAXUE, // 大雪 DONGZHI, // 冬至 XIAOHAN, // 小寒 DAHAN;// 大寒 } static { DECREASE_OFFSETMAP.put(SolarTermsEnum.YUSHUI.name(), new Integer[] { 2026 });// 雨水 INCREASE_OFFSETMAP.put(SolarTermsEnum.CHUNFEN.name(), new Integer[] { 2084 });// 春分 INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOMAN.name(), new Integer[] { 2008 });// 小满 INCREASE_OFFSETMAP.put(SolarTermsEnum.MANGZHONG.name(), new Integer[] { 1902 });// 芒种 INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAZHI.name(), new Integer[] { 1928 });// 夏至 INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOSHU.name(), new Integer[] { 1925, 2016 });// 小暑 INCREASE_OFFSETMAP.put(SolarTermsEnum.DASHU.name(), new Integer[] { 1922 });// 大暑 INCREASE_OFFSETMAP.put(SolarTermsEnum.LIQIU.name(), new Integer[] { 2002 });// 立秋 INCREASE_OFFSETMAP.put(SolarTermsEnum.BAILU.name(), new Integer[] { 1927 });// 白露 INCREASE_OFFSETMAP.put(SolarTermsEnum.QIUFEN.name(), new Integer[] { 1942 });// 秋分 INCREASE_OFFSETMAP.put(SolarTermsEnum.SHUANGJIANG.name(), new Integer[] { 2089 });// 霜降 INCREASE_OFFSETMAP.put(SolarTermsEnum.LIDONG.name(), new Integer[] { 2089 });// 立冬 INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOXUE.name(), new Integer[] { 1978 });// 小雪 INCREASE_OFFSETMAP.put(SolarTermsEnum.DAXUE.name(), new Integer[] { 1954 });// 大雪 DECREASE_OFFSETMAP.put(SolarTermsEnum.DONGZHI.name(), new Integer[] { 1918, 2021 });// 冬至 INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOHAN.name(), new Integer[] { 1982 });// 小寒 DECREASE_OFFSETMAP.put(SolarTermsEnum.XIAOHAN.name(), new Integer[] { 2019 });// 小寒 INCREASE_OFFSETMAP.put(SolarTermsEnum.DAHAN.name(), new Integer[] { 2082 });// 大寒 } // 定义一个二维数组,第一维数组存储的是20世纪的节气C值,第二维数组存储的是21世纪的节气C值,0到23个,依次代表立春、雨水...大寒节气的C值 private static final double[][] CENTURY_ARRAY = { { 4.6295, 19.4599, 6.3826, 21.4155, 5.59, 20.888, 6.318, 21.86, 6.5, 22.2, 7.928, 23.65, 8.35, 23.95, 8.44, 23.822, 9.098, 24.218, 8.218, 23.08, 7.9, 22.6, 6.11, 20.84 }, { 3.87, 18.73, 5.63, 20.646, 4.81, 20.1, 5.52, 21.04, 5.678, 21.37, 7.108, 22.83, 7.5, 23.13, 7.646, 23.042, 8.318, 23.438, 7.438, 22.36, 7.18, 21.94, 5.4055, 20.12 } }; /** * * @param year * 年份 * @param name * 节气的名称 * @return 返回节气是相应月份的第几天 */ public static int getSolarTermNum(int year, String name) { double centuryValue = 0;// 节气的世纪值,每个节气的每个世纪值都不同 name = name.trim().toUpperCase(); int ordinal = SolarTermsEnum.valueOf(name).ordinal(); int centuryIndex = -1; if (year >= 1901 && year <= 2000) {// 20世纪 centuryIndex = 0; } else if (year >= 2001 && year <= 2100) {// 21世纪 centuryIndex = 1; } else { throw new RuntimeException("不支持此年份:" + year + ",目前只支持1901年到2100年的时间范围"); } centuryValue = CENTURY_ARRAY[centuryIndex][ordinal]; int dateNum = 0; /** * 计算 num =[Y*D+C]-L这是传说中的寿星通用公式 * 公式解读:年数的后2位乘0.2422加C(即:centuryValue)取整数后,减闰年数 */ int y = year % 100;// 步骤1:取年分的后两位数 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年 if (ordinal == SolarTermsEnum.XIAOHAN.ordinal() || ordinal == SolarTermsEnum.DAHAN.ordinal() || ordinal == SolarTermsEnum.LICHUN.ordinal() || ordinal == SolarTermsEnum.YUSHUI.ordinal()) { // 注意:凡闰年3月1日前闰年数要减一,即:L=[(Y-1)/4],因为小寒、大寒、立春、雨水这两个节气都小于3月1日,所以 // y = y-1 y = y - 1;// 步骤2 } } dateNum = (int) (y * D + centuryValue) - (int) (y / 4);// 步骤3,使用公式[Y*D+C]-L计算 dateNum += specialYearOffset(year, name);// 步骤4,加上特殊的年分的节气偏移量 return dateNum; } /** * 特例,特殊的年分的节气偏移量,由于公式并不完善,所以算出的个别节气的第几天数并不准确,在此返回其偏移量 * * @param year * 年份 * @param name * 节气名称 * @return 返回其偏移量 */ private static int specialYearOffset(int year, String name) { int offset = 0; offset += getOffset(DECREASE_OFFSETMAP, year, name, -1); offset += getOffset(INCREASE_OFFSETMAP, year, name, 1); return offset; } private static int getOffset(Map<String, Integer[]> map, int year, String name, int offset) { int off = 0; Integer[] years = map.get(name); if (null != years) { for (int i : years) { if (i == year) { off = offset; break; } } } return off; } private static int mYear; private static List<String> mSolarData = new ArrayList<String>(); private static List<String> mSolarName = new ArrayList<String>();/** * 判断一天是什么节气 * @data2015-12-2下午2:49:32 * @param year * @param data 月份占两位,日不确定,如一月一日为:011,五月十日为0510 * @return */ public static String getSolatName(int year, String data) { if (year != mYear) { solarTermToString(year); } if (mSolarData.contains(data)) { return mSolarName.get(mSolarData.indexOf(data)); } else { return null; } } private static void solarTermToString(int year) { mYear = year; if (mSolarData != null) { mSolarData.clear(); } else { mSolarData = new ArrayList<String>(); } if (mSolarName != null) { mSolarName.clear(); } else { mSolarName = new ArrayList<String>(); } // 1 mSolarName.add("立春"); mSolarData.add("02" + getSolarTermNum(year, SolarTermsEnum.LICHUN.name())); // 2 mSolarName.add("雨水"); mSolarData.add("02" + getSolarTermNum(year, SolarTermsEnum.YUSHUI.name())); // 3 mSolarName.add("惊蛰"); mSolarData.add("03" + getSolarTermNum(year, SolarTermsEnum.JINGZHE.name())); // 4 mSolarName.add("春分"); mSolarData.add("03" + getSolarTermNum(year, SolarTermsEnum.CHUNFEN.name())); // 5 mSolarName.add("清明"); mSolarData.add("04" + getSolarTermNum(year, SolarTermsEnum.QINGMING.name())); // 6 mSolarName.add("谷雨"); mSolarData.add("04" + getSolarTermNum(year, SolarTermsEnum.GUYU.name())); // 7 mSolarName.add("立夏"); mSolarData .add("05" + getSolarTermNum(year, SolarTermsEnum.LIXIA.name())); // 8 mSolarName.add("小满"); mSolarData.add("05" + getSolarTermNum(year, SolarTermsEnum.XIAOMAN.name())); // 9 mSolarName.add("芒种"); mSolarData.add("06" + getSolarTermNum(year, SolarTermsEnum.MANGZHONG.name())); // 10 mSolarName.add("夏至"); mSolarData.add("06" + getSolarTermNum(year, SolarTermsEnum.XIAZHI.name())); // 11 mSolarName.add("小暑"); mSolarData.add("07" + getSolarTermNum(year, SolarTermsEnum.XIAOSHU.name())); // 12 mSolarName.add("大暑"); mSolarData .add("07" + getSolarTermNum(year, SolarTermsEnum.DASHU.name())); // 13 mSolarName.add("立秋"); mSolarData .add("08" + getSolarTermNum(year, SolarTermsEnum.LIQIU.name())); // 14 mSolarName.add("处暑"); mSolarData.add("08" + getSolarTermNum(year, SolarTermsEnum.CHUSHU.name())); // 15 mSolarName.add("白露"); mSolarData .add("09" + getSolarTermNum(year, SolarTermsEnum.BAILU.name())); // 16 mSolarName.add("秋分"); mSolarData.add("09" + getSolarTermNum(year, SolarTermsEnum.QIUFEN.name())); // 17 mSolarName.add("寒露"); mSolarData.add("10" + getSolarTermNum(year, SolarTermsEnum.HANLU.name())); // 18 mSolarName.add("霜降"); mSolarData.add("10" + getSolarTermNum(year, SolarTermsEnum.SHUANGJIANG.name())); // 19 mSolarName.add("立冬"); mSolarData.add("11" + getSolarTermNum(year, SolarTermsEnum.LIDONG.name())); // 20 mSolarName.add("小雪"); mSolarData.add("11" + getSolarTermNum(year, SolarTermsEnum.XIAOXUE.name())); // 21 mSolarName.add("大雪"); mSolarData.add("12" + getSolarTermNum(year, SolarTermsEnum.DAXUE.name())); // 22 mSolarName.add("冬至"); mSolarData.add("12" + getSolarTermNum(year, SolarTermsEnum.DONGZHI.name())); // 23 mSolarName.add("小寒"); mSolarData.add("01" + getSolarTermNum(year, SolarTermsEnum.XIAOHAN.name())); // 24 mSolarName.add("大寒"); mSolarData .add("01" + getSolarTermNum(year, SolarTermsEnum.DAHAN.name())); }}
0 0
- java 实现二十四节气
- java实现二十四节气计算
- 二十四节气
- 二十四节气
- 二十四节气
- 详解二十四节气
- 二十四节气歌
- [转载]二十四节气养生大全
- 中国农历二十四节气
- 苇岸的《二十四节气》
- 二十四节气的研究
- 二十四节气的计算方法
- VC阴阳历转化与二十四节气
- [转]天文方法计算二十四节气
- Cftea.WebControls.Countdown 二十四节气事件包
- 二十四节气(历法)_The 24 Solar Terms
- php 根据时间获取二十四节气,返回json
- oRbIt 的专栏 用天文方法计算二十四节气(上)
- JDK9新特性
- 深入浅出 http 请求
- Create an ASP.NET web app in Azure App Service
- 解决Get请求中文乱码的问题
- 数据结构(Java)——图的基础算法
- java 实现二十四节气
- ios 快速集成环信EaseUI
- 笔记本分享WiFi
- codeforce 414a
- 字符串截取,替换
- android——TextView默认文字开发时显示运行时隐藏
- Hive 数据倾斜 (Data Skew) 总结
- elasticsearch学习(一)
- ie6,ie7,ie8 css bug兼容解决记录