From ecccdd63800ce1b97ef33e456a4ae1d18ff3ca98 Mon Sep 17 00:00:00 2001 From: 6tail <6tail@6tail.cn> Date: Sun, 11 Apr 2021 21:09:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=810001=E5=88=B09999=E5=B9=B4?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/nlf/calendar/Lunar.java | 1595 ++++++++--------- .../java/com/nlf/calendar/LunarMonth.java | 100 ++ src/main/java/com/nlf/calendar/LunarYear.java | 175 ++ src/main/java/com/nlf/calendar/Solar.java | 48 +- .../java/com/nlf/calendar/SolarHalfYear.java | 1 + .../java/com/nlf/calendar/SolarMonth.java | 1 + .../java/com/nlf/calendar/SolarSeason.java | 1 + src/main/java/com/nlf/calendar/SolarWeek.java | 3 + .../java/com/nlf/calendar/eightchar/Yun.java | 7 +- .../java/com/nlf/calendar/util/LunarUtil.java | 118 +- .../com/nlf/calendar/util/ShouXingUtil.java | 265 +++ .../java/com/nlf/calendar/util/SolarUtil.java | 21 +- src/test/java/sample/YearTest.java | 31 +- src/test/java/test/BaZiTest.java | 12 + src/test/java/test/GanZhiTest.java | 124 ++ src/test/java/test/LunarTest.java | 45 +- src/test/java/test/SolarTest.java | 6 + src/test/java/test/XingZuoTest.java | 2 +- src/test/java/test/YunTest.java | 27 + 19 files changed, 1576 insertions(+), 1006 deletions(-) create mode 100644 src/main/java/com/nlf/calendar/LunarMonth.java create mode 100644 src/main/java/com/nlf/calendar/LunarYear.java create mode 100644 src/main/java/com/nlf/calendar/util/ShouXingUtil.java create mode 100644 src/test/java/test/YunTest.java diff --git a/src/main/java/com/nlf/calendar/Lunar.java b/src/main/java/com/nlf/calendar/Lunar.java index bb0e9ee..9fff4fd 100644 --- a/src/main/java/com/nlf/calendar/Lunar.java +++ b/src/main/java/com/nlf/calendar/Lunar.java @@ -9,143 +9,204 @@ import com.nlf.calendar.util.SolarUtil; * 农历日期 * * @author 6tail - * */ -public class Lunar{ - /** 节气表头部追加农历上年末的节气名(节令:大雪),以示区分 */ +public class Lunar { + /** + * 节气表头部追加农历上年末的节气名(节令:大雪),以示区分 + */ public static final String JIE_QI_PREPEND = "DA_XUE"; - /** 节气表尾部追加农历下年初的节气名(气令:冬至),以示区分 */ + /** + * 节气表尾部追加农历下年初的节气名(气令:冬至),以示区分 + */ public static final String JIE_QI_APPEND = "DONG_ZHI"; - /** 农历年初节气名(气令:冬至) */ + /** + * 农历年初节气名(气令:冬至) + */ public static final String JIE_QI_FIRST = "冬至"; - /** 农历年末节气名(节令:大雪) */ + /** + * 农历年末节气名(节令:大雪) + */ public static final String JIE_QI_LAST = "大雪"; - /** 节气表尾部追加阳历下年初的第一个节气名(节令:小寒),以示区分 */ + /** + * 节气表尾部追加阳历下年初的第一个节气名(节令:小寒),以示区分 + */ public static final String JIE_APPEND_SOLAR_FIRST = "XIAO_HAN"; - /** 节气表尾部追加阳历下年初的第二个节气名(气令:大寒),以示区分 */ + /** + * 节气表尾部追加阳历下年初的第二个节气名(气令:大寒),以示区分 + */ public static final String QI_APPEND_SOLAR_SECOND = "DA_HAN"; - /** 阳历下年初的第一个节气名(节令:小寒) */ + /** + * 阳历下年初的第一个节气名(节令:小寒) + */ public static final String JIE_SOLAR_FIRST = "小寒"; - /** 阳历下年初的第二个节气名(气令:大寒) */ + /** + * 阳历下年初的第二个节气名(气令:大寒) + */ public static final String QI_SOLAR_SECOND = "大寒"; - /** 1弧度对应的角秒 */ - private static final double SECOND_PER_RAD = 180 * 3600 / Math.PI; - /** 1天对应的毫秒 */ + /** + * 1天对应的毫秒 + */ private static final long MS_PER_DAY = 86400000L; - /** 节气表,国标以冬至为首个节气 */ - private static final String[] JIE_QI = {"冬至","小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪"}; - 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.4, 0, 0, 2015, 69}; - 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[] 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 String QB = "0000000000000200000001000000000000222000000000000000000000000000000000000000000000000000000000000000000000000200000001010000000000202002000000000000000000000000000000020000000000000020000000000000000000002000000000010000020000002002000000000000000010000000000000100100000000000020000010000000000020000000020000010000000002000002002000000000000000000000000100100101000000000020000000001000000020000000020000010000000002000002000000000000000000020000000000100101000200000020200000001000000020000000000000000000000002000000000000000000000000220000000000000010000200000000200000001000000000000000000000000000000002000200000000000000002000222000000000000010000000000000200000001000100000000000000000000000000000000200000001000000000000222000000000000010000000000000000000000000100000000000200000000000000000000200200001000000000000222002000000000000000000000000000000000000000000000020000000000000000000000200000000010000000000202002000000000000000000000000000000100000000000000020000010000000000000000000020000010000000000002002002000000000000000000000000000100100000000000020000000000000000020000000020000010000000002000002000000000000000001000000000000100101000000000020200000001000000020000000000000000000000002000000000000000000000000020000000000000101000200000020200000001000000020000000000000000000000002000200000000000000000000020000000000000001000200000000200000001000000000000000000000000000000002000200000000000000000000222000000000000010000000000000000000000000000000000000000000000000000000000200000001000000002000222000000000000000000000000000000000000000100000000000000000000000010000000200000000010000000000222002000000000000000000000000000000100000000000000020000010000000000000000200020000010000000000202002002000000000000000000000000100100000000000000020000000000000000000000000020000010000000000002002000000000000000000000000000000100100000000000020200000000000000000000000020000000000000002000002000000000000000000000000000000000100000000000020200000001000000020000000000000000000000002000000000000000000000000020000000000000111000000000000200000001000000020000000000000000000000002000200000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000010000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000020000002000000000000000000000000000000000000000000000000000000000010000000200000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000001000000002000000000000000000000000000000000100000000000000000000001000010000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000010000000000000000100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000001000010000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000010000000000000000001000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; - /** 农历年 */ + /** + * 节气表,国标以冬至为首个节气 + */ + public static final String[] JIE_QI = {"冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪"}; + public static final String[] JIE_QI_IN_USE = {JIE_QI_PREPEND, "冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", JIE_QI_APPEND, JIE_APPEND_SOLAR_FIRST, QI_APPEND_SOLAR_SECOND}; + + /** + * 农历年 + */ private int year; - /** 农历月,闰月为负,即闰2月=-2 */ + /** + * 农历月,闰月为负,即闰2月=-2 + */ private int month; - /** 农历日 */ + /** + * 农历日 + */ private int day; - /** 对应阳历 */ + /** + * 对应阳历 + */ private Solar solar; - /** 相对于基准日的偏移天数 */ - private int dayOffset; - /** 时对应的天干下标,0-9 */ + /** + * 时对应的天干下标,0-9 + */ private int timeGanIndex; - /** 时对应的地支下标,0-11 */ + /** + * 时对应的地支下标,0-11 + */ private int timeZhiIndex; - /** 日对应的天干下标,0-9 */ + /** + * 日对应的天干下标,0-9 + */ private int dayGanIndex; - /** 日对应的地支下标,0-11 */ + /** + * 日对应的地支下标,0-11 + */ private int dayZhiIndex; - /** 日对应的天干下标(八字流派1,晚子时日柱算明天),0-9 */ + /** + * 日对应的天干下标(八字流派1,晚子时日柱算明天),0-9 + */ private int dayGanIndexExact; - /** 日对应的地支下标(八字流派1,晚子时日柱算明天),0-11 */ + /** + * 日对应的地支下标(八字流派1,晚子时日柱算明天),0-11 + */ private int dayZhiIndexExact; - /** 日对应的天干下标(八字流派2,晚子时日柱算当天),0-9 */ + /** + * 日对应的天干下标(八字流派2,晚子时日柱算当天),0-9 + */ private int dayGanIndexExact2; - /** 日对应的地支下标(八字流派2,晚子时日柱算当天),0-11 */ + /** + * 日对应的地支下标(八字流派2,晚子时日柱算当天),0-11 + */ private int dayZhiIndexExact2; - /** 月对应的天干下标(以节交接当天起算),0-9 */ + /** + * 月对应的天干下标(以节交接当天起算),0-9 + */ private int monthGanIndex; - /** 月对应的地支下标(以节交接当天起算),0-11 */ + /** + * 月对应的地支下标(以节交接当天起算),0-11 + */ private int monthZhiIndex; - /** 月对应的天干下标(最精确的,供八字用,以节交接时刻起算),0-9 */ + /** + * 月对应的天干下标(最精确的,供八字用,以节交接时刻起算),0-9 + */ private int monthGanIndexExact; - /** 月对应的地支下标(最精确的,供八字用,以节交接时刻起算),0-11 */ + /** + * 月对应的地支下标(最精确的,供八字用,以节交接时刻起算),0-11 + */ private int monthZhiIndexExact; - /** 年对应的天干下标(国标,以正月初一为起点),0-9 */ + /** + * 年对应的天干下标(国标,以正月初一为起点),0-9 + */ private int yearGanIndex; - /** 年对应的地支下标(国标,以正月初一为起点),0-11 */ + /** + * 年对应的地支下标(国标,以正月初一为起点),0-11 + */ private int yearZhiIndex; - /** 年对应的天干下标(月干计算用,以立春为起点),0-9 */ + /** + * 年对应的天干下标(月干计算用,以立春为起点),0-9 + */ private int yearGanIndexByLiChun; - /** 年对应的地支下标(月支计算用,以立春为起点),0-11 */ + /** + * 年对应的地支下标(月支计算用,以立春为起点),0-11 + */ private int yearZhiIndexByLiChun; - /** 年对应的天干下标(最精确的,供八字用,以立春交接时刻为起点),0-9 */ + /** + * 年对应的天干下标(最精确的,供八字用,以立春交接时刻为起点),0-9 + */ private int yearGanIndexExact; - /** 年对应的地支下标(最精确的,供八字用,以立春交接时刻为起点),0-11 */ + /** + * 年对应的地支下标(最精确的,供八字用,以立春交接时刻为起点),0-11 + */ private int yearZhiIndexExact; - /** 周下标,0-6 */ + /** + * 周下标,0-6 + */ private int weekIndex; - /** 阳历小时 */ + /** + * 阳历小时 + */ private int hour; - /** 阳历分钟 */ + /** + * 阳历分钟 + */ private int minute; - /** 阳历秒钟 */ + /** + * 阳历秒钟 + */ private int second; - /** 八字 */ + /** + * 八字 + */ private EightChar eightChar; - /** 24节气表(对应阳历的准确时刻) */ - private Map jieQi = new LinkedHashMap(); + /** + * 24节气表(对应阳历的准确时刻) + */ + private Map jieQi = new LinkedHashMap(); /** * 默认使用当前日期初始化 */ - public Lunar(){ + public Lunar() { this(new Date()); } /** * 通过农历年月日初始化 * - * @param lunarYear 年(农历) + * @param lunarYear 年(农历) * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 - * @param lunarDay 日(农历),1到30 + * @param lunarDay 日(农历),1到30 */ - public Lunar(int lunarYear,int lunarMonth,int lunarDay){ - this(lunarYear,lunarMonth,lunarDay,0,0,0); + public Lunar(int lunarYear, int lunarMonth, int lunarDay) { + this(lunarYear, lunarMonth, lunarDay, 0, 0, 0); } /** * 通过农历年月日时初始化 * - * @param lunarYear 年(农历) + * @param lunarYear 年(农历) * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 - * @param lunarDay 日(农历),1到30 - * @param hour 小时(阳历) - * @param minute 分钟(阳历) - * @param second 秒钟(阳历) + * @param lunarDay 日(农历),1到30 + * @param hour 小时(阳历) + * @param minute 分钟(阳历) + * @param second 秒钟(阳历) */ - public Lunar(int lunarYear,int lunarMonth,int lunarDay,int hour,int minute,int second){ - int m = Math.abs(lunarMonth); - if(m<1||m>12){ - throw new IllegalArgumentException("lunar month must between 1 and 12, or negative"); + public Lunar(int lunarYear, int lunarMonth, int lunarDay, int hour, int minute, int second) { + LunarYear y = LunarYear.fromYear(lunarYear); + LunarMonth m = y.getMonth(lunarMonth); + if (null == m) { + throw new IllegalArgumentException(String.format("wrong lunar year %d month %d", lunarYear, lunarMonth)); } - if(lunarMonth<0){ - int leapMonth = LunarUtil.getLeapMonth(lunarYear); - if(leapMonth==0){ - throw new IllegalArgumentException(String.format("no leap month in lunar year %d",lunarYear)); - }else if(leapMonth!=m){ - throw new IllegalArgumentException(String.format("leap month is %d in lunar year %d",leapMonth,lunarYear)); - } + if (lunarDay < 1) { + throw new IllegalArgumentException("lunar day must bigger than 0"); } - if(lunarDay<1||lunarDay>30){ - throw new IllegalArgumentException("lunar day must between 1 and 30"); - } - int days = LunarUtil.getDaysOfMonth(lunarYear,lunarMonth); - if(lunarDay>days){ - throw new IllegalArgumentException(String.format("only %d days in lunar year %d month %d",days,lunarYear,lunarMonth)); + int days = m.getDayCount(); + if (lunarDay > days) { + throw new IllegalArgumentException(String.format("only %d days in lunar year %d month %d", days, lunarYear, lunarMonth)); } this.year = lunarYear; this.month = lunarMonth; @@ -153,294 +214,64 @@ public class Lunar{ this.hour = hour; this.minute = minute; this.second = second; - dayOffset = LunarUtil.computeAddDays(year,month,day); - this.solar = toSolar(); - compute(); + Solar noon = Solar.fromJulianDay(m.getFirstJulianDay() + lunarDay - 1); + this.solar = Solar.fromYmdHms(noon.getYear(), noon.getMonth(), noon.getDay(), hour, minute, second); + compute(y); } /** * 通过阳历日期初始化 + * * @param date 阳历日期 */ - public Lunar(Date date){ + @SuppressWarnings("MagicConstant") + public Lunar(Date date) { solar = new Solar(date); + Calendar c = Calendar.getInstance(); + c.set(solar.getYear(), solar.getMonth() - 1, solar.getDay(), 0, 0, 0); + c.set(Calendar.MILLISECOND, 0); + long solarTime = c.getTimeInMillis(); int y = solar.getYear(); - int m = solar.getMonth(); - int d = solar.getDay(); - int startYear,startMonth,startDay; - int lunarYear,lunarMonth,lunarDay; - if(y<2000){ - startYear = SolarUtil.BASE_YEAR; - startMonth = SolarUtil.BASE_MONTH; - startDay = SolarUtil.BASE_DAY; - lunarYear = LunarUtil.BASE_YEAR; - lunarMonth = LunarUtil.BASE_MONTH; - lunarDay = LunarUtil.BASE_DAY; - }else{ - startYear = SolarUtil.BASE_YEAR+99; - startMonth = 1; - startDay = 1; - lunarYear = LunarUtil.BASE_YEAR+99; - lunarMonth = 11; - lunarDay = 25; - } - int diff = 0; - for(int i=startYear;ilastDate){ - lunarDay -= lastDate; - lunarMonth = LunarUtil.nextMonth(lunarYear,lunarMonth); - if(lunarMonth==1){ - lunarYear++; - } - lastDate = LunarUtil.getDaysOfMonth(lunarYear,lunarMonth); - } - year = lunarYear; - month = lunarMonth; - day = lunarDay; - hour = solar.getHour(); - minute = solar.getMinute(); - second = solar.getSecond(); - dayOffset = LunarUtil.computeAddDays(year,month,day); - compute(); - } - - private double nutationLon2(double t) { - double a, t2 = t * t, dl = 0; - for (int i = 0, j = NUT_B.length; i < j; i += 5) { - if (i == 0) { - a = -1.742 * t; - } else { - a = 0; - } - dl += (NUT_B[i + 3] + a) * Math.sin(NUT_B[i] + NUT_B[i + 1] * t + NUT_B[i + 2] * t2); - } - return dl / 100 / SECOND_PER_RAD; - } - - private double eLon(double t, int n) { - t /= 10; - double v = 0, tn = 1; - int n1,n2; - double 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, t3 = t2 * t; - v += (-0.0728 - 2.7702 * t - 1.1019 * t2 - 0.0996 * t3) / SECOND_PER_RAD; - return v; - } - - private double gxcSunLon(double t) { - double v = -0.043126 + 628.301955 * t - 0.000002732 * t * t; - double e = 0.016708634 - 0.000042037 * t - 0.0000001267 * t * t; - return -20.49552 * (1 + e * Math.cos(v)) / SECOND_PER_RAD; - } - - private 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; - } - - private double saLon(double t,int n){ - return eLon(t, n) + nutationLon2(t) + gxcSunLon(t) + Math.PI; - } - - private double dtExt(double y, double jsd){ - double dy = (y - 1820) / 100; - return - 20 + jsd * dy * dy; - } - - private 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); - } - double v = dtExt(y, jsd); - double dv = dtExt(y0, jsd) - t0; - return v - dv * (y0 + 100 - y) / 100; - } - int i; - for (i = 0; i < size; i += 5) { - if (y < DT_AT[i + 5]) { + LunarYear ly = LunarYear.fromYear(y); + for (LunarMonth m : ly.getMonths()) { + // 初一 + Calendar firstDay = Solar.fromJulianDay(m.getFirstJulianDay()).getCalendar(); + firstDay.set(Calendar.HOUR_OF_DAY, 0); + firstDay.set(Calendar.MINUTE, 0); + firstDay.set(Calendar.SECOND, 0); + firstDay.set(Calendar.MILLISECOND, 0); + int days = (int) ((solarTime - firstDay.getTimeInMillis()) / MS_PER_DAY); + if (days < m.getDayCount()) { + year = m.getYear(); + month = m.getMonth(); + day = days + 1; 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; - } - - private double dtT(double t){ - return dtCalc(t / 365.2425 + 2000) / 86400.0; - } - - private double saLonT(double w){ - double t, v = 628.3319653318; - 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; - } - - private double qiLow(double w){ - double t, l, v = 628.3319653318; - 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; - l = 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 -= (l / 10000000 - w) / 628.332 + (32 * (t + 1.8) * (t + 1.8) - 20) / 86400 / 36525; - return t * 36525 + 8D / 24; - } - - private double saLonT2(double w){ - double t, v = 628.3319653318; - 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; - } - - private double qiHigh(double w){ - double t = saLonT2(w) * 36525; - t = t - dtT(t) + 8D / 24; - double v = ((t + 0.5) % 1) * 86400; - if (v < 1200 || v > 86400 - 1200){ - t = saLonT(w) * 36525 - dtT(t) + 8D / 24; - } - return t; - } - - private double calcJieQi(double jd) { - int size = QI_KB.length; - double d = 0; - int pc = 7; - 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) * 24D / 365.2422) * Math.PI / 12) + 0.5); - }else if (jd >= f1 && jd < f2) { - int i = 0; - for (; 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 && jd < f3) { - d = Math.floor(qiLow(Math.floor((jd + pc - 2451259) * 24D / 365.2422) * 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; - } - if ("2".equals(n)) { - d -= 1; - } - } - return d; - } - - private double qiAccurate(double w){ - double t = saLonT(w) * 36525; - return t - dtT(t) + 8D / 24; - } - - private double qiAccurate2(double jd) { - double d = Math.PI / 12; - double w = Math.floor((jd + 293) * 24 / 365.2422) * d; - double a = qiAccurate(w); - if (a - jd > 5){ - return qiAccurate(w - d); - }else if (a - jd < -5){ - return qiAccurate(w + d); - } - return a; + hour = solar.getHour(); + minute = solar.getMinute(); + second = solar.getSecond(); + compute(ly); } /** * 计算节气表 */ - private void computeJieQi(){ - double jd = Math.floor((solar.getYear() - 2000) * 365.2422 + 180); - double w = Math.floor((jd - 355 + 183) / 365.2422) * 365.2422 + 355; - if (calcJieQi(w) > jd){ - w -= 365.2422; + private void computeJieQi(LunarYear lunarYear) { + List julianDays = lunarYear.getJieQiJulianDays(); + for (int i = 0, j = JIE_QI_IN_USE.length; i < j; i++) { + jieQi.put(JIE_QI_IN_USE[i], Solar.fromJulianDay(julianDays.get(i))); } - //追加上一农历年末的大雪 - double q = calcJieQi(w - 15.2184); - jieQi.put(JIE_QI_PREPEND, Solar.fromJulianDay(qiAccurate2(q) + Solar.J2000)); - int size = JIE_QI.length; - for (int i=0;i=0) { + } else { + if (solarYmd.compareTo(liChunYmd) >= 0) { g++; z++; } - if(solar.toYmdHms().compareTo(liChun.toYmdHms())>=0) { + if (solarYmdHms.compareTo(liChunYmdHms) >= 0) { gExact++; zExact++; } } - if(g<0){ + if (g < 0) { g += 10; } - if(g>=10){ - g-=10; + if (g >= 10) { + g -= 10; } - if(z<0){ + if (z < 0) { z += 12; } - if(z>=12){ - z-=12; + if (z >= 12) { + z -= 12; } - if(gExact<0){ + if (gExact < 0) { gExact += 10; } - if(gExact>=10){ - gExact-=10; + if (gExact >= 10) { + gExact -= 10; } - if(zExact<0){ + if (zExact < 0) { zExact += 12; } - if(zExact>=12){ - zExact-=12; + if (zExact >= 12) { + zExact -= 12; } yearGanIndexByLiChun = g; @@ -511,61 +347,62 @@ public class Lunar{ /** * 干支纪月计算 */ - private void computeMonth(){ + private void computeMonth() { Solar start = null; Solar end; //干偏移值(以立春当天起算) - int gOffset = ((yearGanIndexByLiChun%5+1)*2)%10; + int gOffset = ((yearGanIndexByLiChun % 5 + 1) * 2) % 10; //干偏移值(以立春交接时刻起算) - int gOffsetExact = ((yearGanIndexExact%5+1)*2)%10; + int gOffsetExact = ((yearGanIndexExact % 5 + 1) * 2) % 10; //序号:大雪到小寒之间-2,小寒到立春之间-1,立春之后0 int index = -2; - for(String jie:LunarUtil.JIE){ + for (String jie : LunarUtil.JIE) { end = jieQi.get(jie); String ymd = solar.toYmd(); - String symd = null==start?ymd:start.toYmd(); + String symd = null == start ? ymd : start.toYmd(); String eymd = end.toYmd(); - if(ymd.compareTo(symd)>=0&&ymd.compareTo(eymd)<0){ + if (ymd.compareTo(symd) >= 0 && ymd.compareTo(eymd) < 0) { break; } start = end; index++; } - if(index<0){ + if (index < 0) { index += 12; } - monthGanIndex = (index+gOffset)%10; - monthZhiIndex = (index+LunarUtil.BASE_MONTH_ZHI_INDEX)%12; + monthGanIndex = (index + gOffset) % 10; + monthZhiIndex = (index + LunarUtil.BASE_MONTH_ZHI_INDEX) % 12; //序号:大雪到小寒之间-2,小寒到立春之间-1,立春之后0 int indexExact = -2; - for(String jie:LunarUtil.JIE){ + for (String jie : LunarUtil.JIE) { end = jieQi.get(jie); String time = solar.toYmdHms(); - String stime = null==start?time:start.toYmdHms(); + String stime = null == start ? time : start.toYmdHms(); String etime = end.toYmdHms(); - if(time.compareTo(stime)>=0&&time.compareTo(etime)<0){ + if (time.compareTo(stime) >= 0 && time.compareTo(etime) < 0) { break; } start = end; indexExact++; } - if(indexExact<0){ + if (indexExact < 0) { indexExact += 12; } - monthGanIndexExact = (indexExact+gOffsetExact)%10; - monthZhiIndexExact = (indexExact+LunarUtil.BASE_MONTH_ZHI_INDEX)%12; + monthGanIndexExact = (indexExact + gOffsetExact) % 10; + monthZhiIndexExact = (indexExact + LunarUtil.BASE_MONTH_ZHI_INDEX) % 12; } /** * 干支纪日计算 */ - private void computeDay(){ - int addDays = (dayOffset + LunarUtil.BASE_DAY_GANZHI_INDEX)%60; - dayGanIndex = addDays%10; - dayZhiIndex = addDays%12; + private void computeDay() { + Solar noon = Solar.fromYmdHms(solar.getYear(), solar.getMonth(), solar.getDay(), 12, 0, 0); + int offset = (int) noon.getJulianDay() - 11; + dayGanIndex = offset % 10; + dayZhiIndex = offset % 12; int dayGanExact = dayGanIndex; int dayZhiExact = dayZhiIndex; @@ -575,14 +412,14 @@ public class Lunar{ dayZhiIndexExact2 = dayZhiExact; // 八字流派1,晚子时(夜子/子夜)日柱算明天 - String hm = (hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute; - if(hm.compareTo("23:00")>=0&&hm.compareTo("23:59")<=0){ + String hm = (hour < 10 ? "0" : "") + hour + ":" + (minute < 10 ? "0" : "") + minute; + if (hm.compareTo("23:00") >= 0 && hm.compareTo("23:59") <= 0) { dayGanExact++; - if(dayGanExact>=10){ + if (dayGanExact >= 10) { dayGanExact -= 10; } dayZhiExact++; - if(dayZhiExact>=12){ + if (dayZhiExact >= 12) { dayZhiExact -= 12; } } @@ -594,21 +431,21 @@ public class Lunar{ /** * 干支纪时计算 */ - private void computeTime(){ - String hm = (hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute; + private void computeTime() { + String hm = (hour < 10 ? "0" : "") + hour + ":" + (minute < 10 ? "0" : "") + minute; timeZhiIndex = LunarUtil.getTimeZhiIndex(hm); - timeGanIndex = (dayGanIndexExact%5*2+timeZhiIndex)%10; + timeGanIndex = (dayGanIndexExact % 5 * 2 + timeZhiIndex) % 10; } /** * 星期计算 */ - private void computeWeek(){ - weekIndex = (dayOffset+LunarUtil.BASE_WEEK_INDEX)%7; + private void computeWeek() { + this.weekIndex = solar.getWeek(); } - private void compute(){ - computeJieQi(); + private void compute(LunarYear lunarYear) { + computeJieQi(lunarYear); computeYear(); computeMonth(); computeDay(); @@ -622,35 +459,35 @@ public class Lunar{ * @param date 阳历日期 * @return 农历 */ - public static Lunar fromDate(Date date){ + public static Lunar fromDate(Date date) { return new Lunar(date); } /** * 通过指定农历年月日获取农历 * - * @param lunarYear 年(农历) + * @param lunarYear 年(农历) * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 - * @param lunarDay 日(农历),1到31 + * @param lunarDay 日(农历),1到31 * @return 农历 */ - public static Lunar fromYmd(int lunarYear,int lunarMonth,int lunarDay){ - return new Lunar(lunarYear,lunarMonth,lunarDay); + public static Lunar fromYmd(int lunarYear, int lunarMonth, int lunarDay) { + return new Lunar(lunarYear, lunarMonth, lunarDay); } /** * 通过指定农历年月日获取农历 * - * @param lunarYear 年(农历) + * @param lunarYear 年(农历) * @param lunarMonth 月(农历),1到12,闰月为负,即闰2月=-2 - * @param lunarDay 日(农历),1到31 - * @param hour 小时(阳历) - * @param minute 分钟(阳历) - * @param second 秒钟(阳历) + * @param lunarDay 日(农历),1到31 + * @param hour 小时(阳历) + * @param minute 分钟(阳历) + * @param second 秒钟(阳历) * @return 农历 */ - public static Lunar fromYmdHms(int lunarYear,int lunarMonth,int lunarDay,int hour,int minute,int second){ - return new Lunar(lunarYear,lunarMonth,lunarDay,hour,minute,second); + public static Lunar fromYmdHms(int lunarYear, int lunarMonth, int lunarDay, int hour, int minute, int second) { + return new Lunar(lunarYear, lunarMonth, lunarDay, hour, minute, second); } /** @@ -660,7 +497,7 @@ public class Lunar{ * @deprecated 使用getYearGan */ @Deprecated - public String getGan(){ + public String getGan() { return getYearGan(); } @@ -669,8 +506,8 @@ public class Lunar{ * * @return 天干,如辛 */ - public String getYearGan(){ - return LunarUtil.GAN[yearGanIndex+1]; + public String getYearGan() { + return LunarUtil.GAN[yearGanIndex + 1]; } /** @@ -678,8 +515,8 @@ public class Lunar{ * * @return 天干,如辛 */ - public String getYearGanByLiChun(){ - return LunarUtil.GAN[yearGanIndexByLiChun+1]; + public String getYearGanByLiChun() { + return LunarUtil.GAN[yearGanIndexByLiChun + 1]; } /** @@ -687,8 +524,8 @@ public class Lunar{ * * @return 天干,如辛 */ - public String getYearGanExact(){ - return LunarUtil.GAN[yearGanIndexExact+1]; + public String getYearGanExact() { + return LunarUtil.GAN[yearGanIndexExact + 1]; } /** @@ -698,7 +535,7 @@ public class Lunar{ * @deprecated 使用getYearZhi */ @Deprecated - public String getZhi(){ + public String getZhi() { return getYearZhi(); } @@ -707,8 +544,8 @@ public class Lunar{ * * @return 地支,如亥 */ - public String getYearZhi(){ - return LunarUtil.ZHI[yearZhiIndex+1]; + public String getYearZhi() { + return LunarUtil.ZHI[yearZhiIndex + 1]; } /** @@ -716,8 +553,8 @@ public class Lunar{ * * @return 地支,如亥 */ - public String getYearZhiByLiChun(){ - return LunarUtil.ZHI[yearZhiIndexByLiChun+1]; + public String getYearZhiByLiChun() { + return LunarUtil.ZHI[yearZhiIndexByLiChun + 1]; } /** @@ -725,32 +562,35 @@ public class Lunar{ * * @return 地支,如亥 */ - public String getYearZhiExact(){ - return LunarUtil.ZHI[yearZhiIndexExact+1]; + public String getYearZhiExact() { + return LunarUtil.ZHI[yearZhiIndexExact + 1]; } /** * 获取干支纪年(年柱)(以正月初一作为新年的开始) + * * @return 年份的干支(年柱),如辛亥 */ - public String getYearInGanZhi(){ - return getYearGan()+getYearZhi(); + public String getYearInGanZhi() { + return getYearGan() + getYearZhi(); } /** * 获取干支纪年(年柱)(以立春当天作为新年的开始) + * * @return 年份的干支(年柱),如辛亥 */ - public String getYearInGanZhiByLiChun(){ - return getYearGanByLiChun()+getYearZhiByLiChun(); + public String getYearInGanZhiByLiChun() { + return getYearGanByLiChun() + getYearZhiByLiChun(); } /** * 获取干支纪年(年柱)(以立春交接的时刻作为新年的开始) + * * @return 年份的干支(年柱),如辛亥 */ - public String getYearInGanZhiExact(){ - return getYearGanExact()+getYearZhiExact(); + public String getYearInGanZhiExact() { + return getYearGanExact() + getYearZhiExact(); } /** @@ -760,8 +600,8 @@ public class Lunar{ * * @return 干支纪月(月柱),如己卯 */ - public String getMonthInGanZhi(){ - return getMonthGan()+getMonthZhi(); + public String getMonthInGanZhi() { + return getMonthGan() + getMonthZhi(); } /** @@ -771,40 +611,44 @@ public class Lunar{ * * @return 干支纪月(月柱),如己卯 */ - public String getMonthInGanZhiExact(){ - return getMonthGanExact()+getMonthZhiExact(); + public String getMonthInGanZhiExact() { + return getMonthGanExact() + getMonthZhiExact(); } /** * 获取月天干(以节交接当天起算) + * * @return 月天干,如己 */ - public String getMonthGan(){ - return LunarUtil.GAN[monthGanIndex+1]; + public String getMonthGan() { + return LunarUtil.GAN[monthGanIndex + 1]; } /** * 获取精确的月天干(以节交接时刻起算) + * * @return 月天干,如己 */ - public String getMonthGanExact(){ - return LunarUtil.GAN[monthGanIndexExact+1]; + public String getMonthGanExact() { + return LunarUtil.GAN[monthGanIndexExact + 1]; } /** * 获取月地支(以节交接当天起算) + * * @return 月地支,如卯 */ - public String getMonthZhi(){ - return LunarUtil.ZHI[monthZhiIndex+1]; + public String getMonthZhi() { + return LunarUtil.ZHI[monthZhiIndex + 1]; } /** * 获取精确的月地支(以节交接时刻起算) + * * @return 月地支,如卯 */ - public String getMonthZhiExact(){ - return LunarUtil.ZHI[monthZhiIndexExact+1]; + public String getMonthZhiExact() { + return LunarUtil.ZHI[monthZhiIndexExact + 1]; } /** @@ -812,8 +656,8 @@ public class Lunar{ * * @return 干支纪日(日柱),如己卯 */ - public String getDayInGanZhi(){ - return getDayGan()+getDayZhi(); + public String getDayInGanZhi() { + return getDayGan() + getDayZhi(); } /** @@ -821,8 +665,8 @@ public class Lunar{ * * @return 干支纪日(日柱),如己卯 */ - public String getDayInGanZhiExact(){ - return getDayGanExact()+getDayZhiExact(); + public String getDayInGanZhiExact() { + return getDayGanExact() + getDayZhiExact(); } /** @@ -830,8 +674,8 @@ public class Lunar{ * * @return 干支纪日(日柱),如己卯 */ - public String getDayInGanZhiExact2(){ - return getDayGanExact2()+getDayZhiExact2(); + public String getDayInGanZhiExact2() { + return getDayGanExact2() + getDayZhiExact2(); } /** @@ -839,8 +683,8 @@ public class Lunar{ * * @return 日天干,如甲 */ - public String getDayGan(){ - return LunarUtil.GAN[dayGanIndex+1]; + public String getDayGan() { + return LunarUtil.GAN[dayGanIndex + 1]; } /** @@ -848,8 +692,8 @@ public class Lunar{ * * @return 日天干,如甲 */ - public String getDayGanExact(){ - return LunarUtil.GAN[dayGanIndexExact+1]; + public String getDayGanExact() { + return LunarUtil.GAN[dayGanIndexExact + 1]; } /** @@ -857,8 +701,8 @@ public class Lunar{ * * @return 日天干,如甲 */ - public String getDayGanExact2(){ - return LunarUtil.GAN[dayGanIndexExact2+1]; + public String getDayGanExact2() { + return LunarUtil.GAN[dayGanIndexExact2 + 1]; } /** @@ -866,8 +710,8 @@ public class Lunar{ * * @return 日地支,如卯 */ - public String getDayZhi(){ - return LunarUtil.ZHI[dayZhiIndex+1]; + public String getDayZhi() { + return LunarUtil.ZHI[dayZhiIndex + 1]; } /** @@ -875,8 +719,8 @@ public class Lunar{ * * @return 日地支,如卯 */ - public String getDayZhiExact(){ - return LunarUtil.ZHI[dayZhiIndexExact+1]; + public String getDayZhiExact() { + return LunarUtil.ZHI[dayZhiIndexExact + 1]; } /** @@ -884,8 +728,8 @@ public class Lunar{ * * @return 日地支,如卯 */ - public String getDayZhiExact2(){ - return LunarUtil.ZHI[dayZhiIndexExact2+1]; + public String getDayZhiExact2() { + return LunarUtil.ZHI[dayZhiIndexExact2 + 1]; } /** @@ -895,7 +739,7 @@ public class Lunar{ * @deprecated 使用getYearShengXiao */ @Deprecated - public String getShengxiao(){ + public String getShengxiao() { return getYearShengXiao(); } @@ -904,8 +748,8 @@ public class Lunar{ * * @return 年生肖,如虎 */ - public String getYearShengXiao(){ - return LunarUtil.SHENGXIAO[yearZhiIndex+1]; + public String getYearShengXiao() { + return LunarUtil.SHENGXIAO[yearZhiIndex + 1]; } /** @@ -913,8 +757,8 @@ public class Lunar{ * * @return 年生肖,如虎 */ - public String getYearShengXiaoByLiChun(){ - return LunarUtil.SHENGXIAO[yearZhiIndexByLiChun+1]; + public String getYearShengXiaoByLiChun() { + return LunarUtil.SHENGXIAO[yearZhiIndexByLiChun + 1]; } /** @@ -922,8 +766,8 @@ public class Lunar{ * * @return 年生肖,如虎 */ - public String getYearShengXiaoExact(){ - return LunarUtil.SHENGXIAO[yearZhiIndexExact+1]; + public String getYearShengXiaoExact() { + return LunarUtil.SHENGXIAO[yearZhiIndexExact + 1]; } /** @@ -931,8 +775,8 @@ public class Lunar{ * * @return 月生肖,如虎 */ - public String getMonthShengXiao(){ - return LunarUtil.SHENGXIAO[monthZhiIndex+1]; + public String getMonthShengXiao() { + return LunarUtil.SHENGXIAO[monthZhiIndex + 1]; } /** @@ -940,8 +784,8 @@ public class Lunar{ * * @return 日生肖,如虎 */ - public String getDayShengXiao(){ - return LunarUtil.SHENGXIAO[dayZhiIndex+1]; + public String getDayShengXiao() { + return LunarUtil.SHENGXIAO[dayZhiIndex + 1]; } /** @@ -949,8 +793,8 @@ public class Lunar{ * * @return 时辰生肖,如虎 */ - public String getTimeShengXiao(){ - return LunarUtil.SHENGXIAO[timeZhiIndex+1]; + public String getTimeShengXiao() { + return LunarUtil.SHENGXIAO[timeZhiIndex + 1]; } /** @@ -958,11 +802,11 @@ public class Lunar{ * * @return 中文年,如二零零一 */ - public String getYearInChinese(){ - String y = (year+""); + public String getYearInChinese() { + String y = (year + ""); StringBuilder s = new StringBuilder(); - for(int i=0,j=y.length();i getFestivals(){ + public List getFestivals() { List l = new ArrayList(); - String f = LunarUtil.FESTIVAL.get(month+"-"+day); - if(null!=f){ + String f = LunarUtil.FESTIVAL.get(month + "-" + day); + if (null != f) { l.add(f); } return l; @@ -1164,392 +1015,423 @@ public class Lunar{ * * @return 非正式的节日列表,如中元节 */ - public List getOtherFestivals(){ + public List getOtherFestivals() { List l = new ArrayList(); - List fs = LunarUtil.OTHER_FESTIVAL.get(month+"-"+day); - if(null!=fs){ + List fs = LunarUtil.OTHER_FESTIVAL.get(month + "-" + day); + if (null != fs) { l.addAll(fs); } return l; } - /** - * 转换为阳历日期 - * - * @return 阳历日期 - */ - private Solar toSolar(){ - Calendar c = Calendar.getInstance(); - c.set(SolarUtil.BASE_YEAR,SolarUtil.BASE_MONTH-1,SolarUtil.BASE_DAY,hour,minute,second); - c.add(Calendar.DATE,dayOffset); - return new Solar(c); - } - /** * 获取彭祖百忌天干 + * * @return 彭祖百忌天干 */ - public String getPengZuGan(){ - return LunarUtil.PENGZU_GAN[dayGanIndex+1]; + public String getPengZuGan() { + return LunarUtil.PENGZU_GAN[dayGanIndex + 1]; } /** * 获取彭祖百忌地支 + * * @return 彭祖百忌地支 */ - public String getPengZuZhi(){ - return LunarUtil.PENGZU_ZHI[dayZhiIndex+1]; + public String getPengZuZhi() { + return LunarUtil.PENGZU_ZHI[dayZhiIndex + 1]; } /** * 获取日喜神方位 + * * @return 喜神方位,如艮 * @deprecated 使用getDayPositionXi */ - public String getPositionXi(){ + public String getPositionXi() { return getDayPositionXi(); } /** * 获取喜神方位描述 + * * @return 喜神方位描述,如东北 * @deprecated 使用getDayPositionXiDesc */ - public String getPositionXiDesc(){ + public String getPositionXiDesc() { return getDayPositionXiDesc(); } /** * 获取阳贵神方位 + * * @return 阳贵神方位,如艮 * @deprecated 使用getDayPositionYangGui */ - public String getPositionYangGui(){ + public String getPositionYangGui() { return getDayPositionYangGui(); } /** * 获取阳贵神方位描述 + * * @return 阳贵神方位描述,如东北 * @deprecated 使用getDayPositionYangGuiDesc */ - public String getPositionYangGuiDesc(){ + public String getPositionYangGuiDesc() { return getDayPositionYangGuiDesc(); } /** * 获取阴贵神方位 + * * @return 阴贵神方位,如艮 * @deprecated 使用getDayPositionYinGui */ - public String getPositionYinGui(){ + public String getPositionYinGui() { return getDayPositionYinGui(); } /** * 获取阴贵神方位描述 + * * @return 阴贵神方位描述,如东北 * @deprecated 使用getDayPositionYinGuiDesc */ - public String getPositionYinGuiDesc(){ + public String getPositionYinGuiDesc() { return getDayPositionYinGuiDesc(); } /** * 获取福神方位 + * * @return 福神方位,如艮 * @deprecated 使用getDayPositionFu */ - public String getPositionFu(){ + public String getPositionFu() { return getDayPositionFu(); } /** * 获取福神方位描述 + * * @return 福神方位描述,如东北 * @deprecated 使用getDayPositionFuDesc */ - public String getPositionFuDesc(){ + public String getPositionFuDesc() { return getDayPositionFuDesc(); } /** * 获取财神方位 + * * @return 财神方位,如艮 * @deprecated 使用getDayPositionCai */ - public String getPositionCai(){ + public String getPositionCai() { return getDayPositionCai(); } /** * 获取财神方位描述 + * * @return 财神方位描述,如东北 * @deprecated 使用getDayPositionCaiDesc */ - public String getPositionCaiDesc(){ + public String getPositionCaiDesc() { return getDayPositionCaiDesc(); } /** * 获取日喜神方位 + * * @return 喜神方位,如艮 */ - public String getDayPositionXi(){ - return LunarUtil.POSITION_XI[dayGanIndex+1]; + public String getDayPositionXi() { + return LunarUtil.POSITION_XI[dayGanIndex + 1]; } /** * 获取日喜神方位描述 + * * @return 喜神方位描述,如东北 */ - public String getDayPositionXiDesc(){ + public String getDayPositionXiDesc() { return LunarUtil.POSITION_DESC.get(getDayPositionXi()); } /** * 获取日阳贵神方位 + * * @return 阳贵神方位,如艮 */ - public String getDayPositionYangGui(){ - return LunarUtil.POSITION_YANG_GUI[dayGanIndex+1]; + public String getDayPositionYangGui() { + return LunarUtil.POSITION_YANG_GUI[dayGanIndex + 1]; } /** * 获取日阳贵神方位描述 + * * @return 阳贵神方位描述,如东北 */ - public String getDayPositionYangGuiDesc(){ + public String getDayPositionYangGuiDesc() { return LunarUtil.POSITION_DESC.get(getDayPositionYangGui()); } /** * 获取日阴贵神方位 + * * @return 阴贵神方位,如艮 */ - public String getDayPositionYinGui(){ - return LunarUtil.POSITION_YIN_GUI[dayGanIndex+1]; + public String getDayPositionYinGui() { + return LunarUtil.POSITION_YIN_GUI[dayGanIndex + 1]; } /** * 获取日阴贵神方位描述 + * * @return 阴贵神方位描述,如东北 */ - public String getDayPositionYinGuiDesc(){ + public String getDayPositionYinGuiDesc() { return LunarUtil.POSITION_DESC.get(getDayPositionYinGui()); } /** * 获取日福神方位 + * * @return 福神方位,如艮 */ - public String getDayPositionFu(){ - return LunarUtil.POSITION_FU[dayGanIndex+1]; + public String getDayPositionFu() { + return LunarUtil.POSITION_FU[dayGanIndex + 1]; } /** * 获取日福神方位描述 + * * @return 福神方位描述,如东北 */ - public String getDayPositionFuDesc(){ + public String getDayPositionFuDesc() { return LunarUtil.POSITION_DESC.get(getDayPositionFu()); } /** * 获取日财神方位 + * * @return 财神方位,如艮 */ - public String getDayPositionCai(){ - return LunarUtil.POSITION_CAI[dayGanIndex+1]; + public String getDayPositionCai() { + return LunarUtil.POSITION_CAI[dayGanIndex + 1]; } /** * 获取日财神方位描述 + * * @return 财神方位描述,如东北 */ - public String getDayPositionCaiDesc(){ + public String getDayPositionCaiDesc() { return LunarUtil.POSITION_DESC.get(getDayPositionCai()); } /** * 获取时辰喜神方位 + * * @return 喜神方位,如艮 */ - public String getTimePositionXi(){ - return LunarUtil.POSITION_XI[timeGanIndex+1]; + public String getTimePositionXi() { + return LunarUtil.POSITION_XI[timeGanIndex + 1]; } /** * 获取时辰喜神方位描述 + * * @return 喜神方位描述,如东北 */ - public String getTimePositionXiDesc(){ + public String getTimePositionXiDesc() { return LunarUtil.POSITION_DESC.get(getTimePositionXi()); } /** * 获取时辰阳贵神方位 + * * @return 阳贵神方位,如艮 */ - public String getTimePositionYangGui(){ - return LunarUtil.POSITION_YANG_GUI[timeGanIndex+1]; + public String getTimePositionYangGui() { + return LunarUtil.POSITION_YANG_GUI[timeGanIndex + 1]; } /** * 获取时辰阳贵神方位描述 + * * @return 阳贵神方位描述,如东北 */ - public String getTimePositionYangGuiDesc(){ + public String getTimePositionYangGuiDesc() { return LunarUtil.POSITION_DESC.get(getTimePositionYangGui()); } /** * 获取时辰阴贵神方位 + * * @return 阴贵神方位,如艮 */ - public String getTimePositionYinGui(){ - return LunarUtil.POSITION_YIN_GUI[timeGanIndex+1]; + public String getTimePositionYinGui() { + return LunarUtil.POSITION_YIN_GUI[timeGanIndex + 1]; } /** * 获取时辰阴贵神方位描述 + * * @return 阴贵神方位描述,如东北 */ - public String getTimePositionYinGuiDesc(){ + public String getTimePositionYinGuiDesc() { return LunarUtil.POSITION_DESC.get(getTimePositionYinGui()); } /** * 获取时辰福神方位 + * * @return 福神方位,如艮 */ - public String getTimePositionFu(){ - return LunarUtil.POSITION_FU[timeGanIndex+1]; + public String getTimePositionFu() { + return LunarUtil.POSITION_FU[timeGanIndex + 1]; } /** * 获取时辰福神方位描述 + * * @return 福神方位描述,如东北 */ - public String getTimePositionFuDesc(){ + public String getTimePositionFuDesc() { return LunarUtil.POSITION_DESC.get(getTimePositionFu()); } /** * 获取时辰财神方位 + * * @return 财神方位,如艮 */ - public String getTimePositionCai(){ - return LunarUtil.POSITION_CAI[timeGanIndex+1]; + public String getTimePositionCai() { + return LunarUtil.POSITION_CAI[timeGanIndex + 1]; } /** * 获取时辰财神方位描述 + * * @return 财神方位描述,如东北 */ - public String getTimePositionCaiDesc(){ + public String getTimePositionCaiDesc() { return LunarUtil.POSITION_DESC.get(getTimePositionCai()); } /** * 获取冲 + * * @return 冲,如申 * @deprecated 使用getDayChong */ @Deprecated - public String getChong(){ + public String getChong() { return getDayChong(); } /** * 获取无情之克的冲天干 + * * @return 无情之克的冲天干,如甲 * @deprecated 使用getDayChongGan */ @Deprecated - public String getChongGan(){ + public String getChongGan() { return getDayChongGan(); } /** * 获取有情之克的冲天干 + * * @return 有情之克的冲天干,如甲 * @deprecated 使用getDayChongGanTie */ @Deprecated - public String getChongGanTie(){ + public String getChongGanTie() { return getDayChongGanTie(); } /** * 获取冲生肖 + * * @return 冲生肖,如猴 * @deprecated 使用getDayChongShengXiao */ @Deprecated - public String getChongShengXiao(){ + public String getChongShengXiao() { return getDayChongShengXiao(); } /** * 获取冲描述 + * * @return 冲描述,如(壬申)猴 * @deprecated 使用getDayChongDesc */ @Deprecated - public String getChongDesc(){ + public String getChongDesc() { return getDayChongDesc(); } /** * 获取煞 + * * @return 煞,如北 * @deprecated 使用getDaySha */ @Deprecated - public String getSha(){ + public String getSha() { return getDaySha(); } /** * 获取年纳音 + * * @return 年纳音,如剑锋金 */ - public String getYearNaYin(){ + public String getYearNaYin() { return LunarUtil.NAYIN.get(getYearInGanZhi()); } /** * 获取月纳音 + * * @return 月纳音,如剑锋金 */ - public String getMonthNaYin(){ + public String getMonthNaYin() { return LunarUtil.NAYIN.get(getMonthInGanZhi()); } /** * 获取日纳音 + * * @return 日纳音,如剑锋金 */ - public String getDayNaYin(){ + public String getDayNaYin() { return LunarUtil.NAYIN.get(getDayInGanZhi()); } /** * 获取时辰纳音 + * * @return 时辰纳音,如剑锋金 */ - public String getTimeNaYin(){ + public String getTimeNaYin() { return LunarUtil.NAYIN.get(getTimeInGanZhi()); } /** * 获取八字,男性也称乾造,女性也称坤造(以立春交接时刻作为新年的开始) + * * @return 八字(男性也称乾造,女性也称坤造) * @deprecated 使用getEightChar */ @Deprecated - public List getBaZi(){ + public List getBaZi() { List l = new ArrayList(4); EightChar eightChar = getEightChar(); l.add(eightChar.getYear()); @@ -1561,11 +1443,12 @@ public class Lunar{ /** * 获取八字五行 + * * @return 八字五行 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiWuXing(){ + public List getBaZiWuXing() { List l = new ArrayList(4); EightChar eightChar = getEightChar(); l.add(eightChar.getYearWuXing()); @@ -1577,11 +1460,12 @@ public class Lunar{ /** * 获取八字纳音 + * * @return 八字纳音 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiNaYin(){ + public List getBaZiNaYin() { List l = new ArrayList(4); EightChar eightChar = getEightChar(); l.add(eightChar.getYearNaYin()); @@ -1593,11 +1477,12 @@ public class Lunar{ /** * 获取八字天干十神,日柱十神为日主,其余三柱根据天干十神表查询 + * * @return 八字天干十神 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiShiShenGan(){ + public List getBaZiShiShenGan() { List l = new ArrayList(4); EightChar eightChar = getEightChar(); l.add(eightChar.getYearShiShenGan()); @@ -1609,11 +1494,12 @@ public class Lunar{ /** * 获取八字地支十神,根据地支十神表查询 + * * @return 八字地支十神 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiShiShenZhi(){ + public List getBaZiShiShenZhi() { List l = new ArrayList(4); EightChar eightChar = getEightChar(); l.add(eightChar.getYearShiShenZhi().get(0)); @@ -1625,195 +1511,216 @@ public class Lunar{ /** * 获取八字年支十神 + * * @return 八字年支十神 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiShiShenYearZhi(){ + public List getBaZiShiShenYearZhi() { return getEightChar().getYearShiShenZhi(); } /** * 获取八字月支十神 + * * @return 八字月支十神 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiShiShenMonthZhi(){ + public List getBaZiShiShenMonthZhi() { return getEightChar().getMonthShiShenZhi(); } /** * 获取八字日支十神 + * * @return 八字日支十神 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiShiShenDayZhi(){ + public List getBaZiShiShenDayZhi() { return getEightChar().getDayShiShenZhi(); } /** * 获取八字时支十神 + * * @return 八字时支十神 * @deprecated 使用getEightChar */ @Deprecated - public List getBaZiShiShenTimeZhi(){ + public List getBaZiShiShenTimeZhi() { return getEightChar().getTimeShiShenZhi(); } /** * 获取十二执星:建、除、满、平、定、执、破、危、成、收、开、闭。当月支与日支相同即为建,依次类推 + * * @return 执星 */ - public String getZhiXing(){ - int offset = dayZhiIndex-monthZhiIndex; - if(offset<0){ + public String getZhiXing() { + int offset = dayZhiIndex - monthZhiIndex; + if (offset < 0) { offset += 12; } - return LunarUtil.ZHI_XING[offset+1]; + return LunarUtil.ZHI_XING[offset + 1]; } /** * 获取值日天神 + * * @return 值日天神 */ - public String getDayTianShen(){ + public String getDayTianShen() { String monthZhi = getMonthZhi(); int offset = LunarUtil.ZHI_TIAN_SHEN_OFFSET.get(monthZhi); - return LunarUtil.TIAN_SHEN[(dayZhiIndex+offset)%12+1]; + return LunarUtil.TIAN_SHEN[(dayZhiIndex + offset) % 12 + 1]; } /** * 获取值时天神 + * * @return 值时天神 */ - public String getTimeTianShen(){ + public String getTimeTianShen() { String dayZhi = getDayZhiExact(); int offset = LunarUtil.ZHI_TIAN_SHEN_OFFSET.get(dayZhi); - return LunarUtil.TIAN_SHEN[(timeZhiIndex+offset)%12+1]; + return LunarUtil.TIAN_SHEN[(timeZhiIndex + offset) % 12 + 1]; } /** * 获取值日天神类型:黄道/黑道 + * * @return 值日天神类型:黄道/黑道 */ - public String getDayTianShenType(){ + public String getDayTianShenType() { return LunarUtil.TIAN_SHEN_TYPE.get(getDayTianShen()); } /** * 获取值时天神类型:黄道/黑道 + * * @return 值时天神类型:黄道/黑道 */ - public String getTimeTianShenType(){ + public String getTimeTianShenType() { return LunarUtil.TIAN_SHEN_TYPE.get(getTimeTianShen()); } /** * 获取值日天神吉凶 + * * @return 吉/凶 */ - public String getDayTianShenLuck(){ + public String getDayTianShenLuck() { return LunarUtil.TIAN_SHEN_TYPE_LUCK.get(getDayTianShenType()); } /** * 获取值时天神吉凶 + * * @return 吉/凶 */ - public String getTimeTianShenLuck(){ + public String getTimeTianShenLuck() { return LunarUtil.TIAN_SHEN_TYPE_LUCK.get(getTimeTianShenType()); } /** * 获取逐日胎神方位 + * * @return 逐日胎神方位 */ - public String getDayPositionTai(){ - int offset = dayGanIndex-dayZhiIndex; - if(offset<0){ + public String getDayPositionTai() { + int offset = dayGanIndex - dayZhiIndex; + if (offset < 0) { offset += 12; } - return LunarUtil.POSITION_TAI_DAY[offset*5+dayGanIndex]; + return LunarUtil.POSITION_TAI_DAY[offset * 5 + dayGanIndex]; } /** * 获取逐月胎神方位,闰月无 + * * @return 逐月胎神方位 */ - public String getMonthPositionTai(){ - if(month<0){ + public String getMonthPositionTai() { + if (month < 0) { return ""; } - return LunarUtil.POSITION_TAI_MONTH[month-1]; + return LunarUtil.POSITION_TAI_MONTH[month - 1]; } /** * 获取每日宜,如果没有,返回["无"] + * * @return 宜 */ - public List getDayYi(){ - return LunarUtil.getDayYi(getMonthInGanZhiExact(),getDayInGanZhi()); + public List getDayYi() { + return LunarUtil.getDayYi(getMonthInGanZhiExact(), getDayInGanZhi()); } /** * 获取每日忌,如果没有,返回["无"] + * * @return 忌 */ - public List getDayJi(){ - return LunarUtil.getDayJi(getMonthInGanZhiExact(),getDayInGanZhi()); + public List getDayJi() { + return LunarUtil.getDayJi(getMonthInGanZhiExact(), getDayInGanZhi()); } /** * 获取日吉神(宜趋),如果没有,返回["无"] + * * @return 日吉神 */ - public List getDayJiShen(){ - return LunarUtil.getDayJiShen(getMonth(),getDayInGanZhi()); + public List getDayJiShen() { + return LunarUtil.getDayJiShen(getMonth(), getDayInGanZhi()); } /** * 获取日凶煞(宜忌),如果没有,返回["无"] + * * @return 日凶煞 */ - public List getDayXiongSha(){ - return LunarUtil.getDayXiongSha(getMonth(),getDayInGanZhi()); + public List getDayXiongSha() { + return LunarUtil.getDayXiongSha(getMonth(), getDayInGanZhi()); } /** * 获取日冲 + * * @return 日冲,如申 */ - public String getDayChong(){ - return LunarUtil.CHONG[dayZhiIndex+1]; + public String getDayChong() { + return LunarUtil.CHONG[dayZhiIndex + 1]; } /** * 获取日煞 + * * @return 日煞,如北 */ - public String getDaySha(){ + public String getDaySha() { return LunarUtil.SHA.get(getDayZhi()); } /** * 获取日冲描述 + * * @return 日冲描述,如(壬申)猴 */ - public String getDayChongDesc(){ - return "("+getDayChongGan()+getDayChong()+")"+getDayChongShengXiao(); + public String getDayChongDesc() { + return "(" + getDayChongGan() + getDayChong() + ")" + getDayChongShengXiao(); } /** * 获取日冲生肖 + * * @return 日冲生肖,如猴 */ - public String getDayChongShengXiao(){ + public String getDayChongShengXiao() { String chong = getDayChong(); - for(int i=0,j=LunarUtil.ZHI.length;i getTimeYi(){ - return LunarUtil.getTimeYi(getDayInGanZhiExact(),getTimeInGanZhi()); + public List getTimeYi() { + return LunarUtil.getTimeYi(getDayInGanZhiExact(), getTimeInGanZhi()); } /** * 获取时辰忌,如果没有,返回["无"] + * * @return 忌 */ - public List getTimeJi(){ - return LunarUtil.getTimeJi(getDayInGanZhiExact(),getTimeInGanZhi()); + public List getTimeJi() { + return LunarUtil.getTimeJi(getDayInGanZhiExact(), getTimeInGanZhi()); } /** * 获取月相 + * * @return 月相 */ public String getYueXiang() { @@ -1916,11 +1834,12 @@ public class Lunar{ /** * 获取值年九星(流年紫白星起例歌诀:年上吉星论甲子,逐年星逆中宫起;上中下作三元汇,一上四中七下兑。) + * * @return 值年九星 */ - public NineStar getYearNineStar(){ - int index = LunarUtil.BASE_YEAR_JIU_XING_INDEX-(year-LunarUtil.BASE_YEAR)%9; - if(index<0){ + public NineStar getYearNineStar() { + int index = -(year - 1900) % 9; + if (index < 0) { index += 9; } return new NineStar(index); @@ -1928,9 +1847,10 @@ public class Lunar{ /** * 获取值月九星(月紫白星歌诀:子午卯酉八白起,寅申巳亥二黑求,辰戌丑未五黄中。) + * * @return 值月九星 */ - public NineStar getMonthNineStar(){ + public NineStar getMonthNineStar() { int start = 2; String yearZhi = getYearZhi(); if ("子午卯酉".contains(yearZhi)) { @@ -1939,12 +1859,12 @@ public class Lunar{ start = 5; } // 寅月起,所以需要-2 - int monthIndex = monthZhiIndex-2; - if(monthIndex<0){ + int monthIndex = monthZhiIndex - 2; + if (monthIndex < 0) { monthIndex += 12; } - int index = start-monthIndex-1; - while(index<0){ + int index = start - monthIndex - 1; + while (index < 0) { index += 9; } return new NineStar(index); @@ -1952,9 +1872,10 @@ public class Lunar{ /** * 获取值日九星(日家紫白星歌诀:日家白法不难求,二十四气六宫周;冬至雨水及谷雨,阳顺一七四中游;夏至处暑霜降后,九三六星逆行求。) + * * @return 值日九星 */ - public NineStar getDayNineStar(){ + public NineStar getDayNineStar() { //顺逆 String solarYmd = solar.toYmd(); String dongZhi = jieQi.get("冬至").toYmd(); @@ -1966,26 +1887,26 @@ public class Lunar{ int start = 6; boolean asc = false; - if(solarYmd.compareTo(dongZhi)>=0 && solarYmd.compareTo(yuShui)<0){ + if (solarYmd.compareTo(dongZhi) >= 0 && solarYmd.compareTo(yuShui) < 0) { asc = true; start = 1; - } else if(solarYmd.compareTo(yuShui)>=0 && solarYmd.compareTo(guYu)<0){ + } else if (solarYmd.compareTo(yuShui) >= 0 && solarYmd.compareTo(guYu) < 0) { asc = true; start = 7; - } else if(solarYmd.compareTo(guYu)>=0 && solarYmd.compareTo(xiaZhi)<0){ + } else if (solarYmd.compareTo(guYu) >= 0 && solarYmd.compareTo(xiaZhi) < 0) { asc = true; start = 4; - } else if(solarYmd.compareTo(xiaZhi)>=0 && solarYmd.compareTo(chuShu)<0){ + } else if (solarYmd.compareTo(xiaZhi) >= 0 && solarYmd.compareTo(chuShu) < 0) { start = 9; - } else if(solarYmd.compareTo(chuShu)>=0 && solarYmd.compareTo(shuangJiang)<0){ + } else if (solarYmd.compareTo(chuShu) >= 0 && solarYmd.compareTo(shuangJiang) < 0) { start = 3; } - int ganZhiIndex = LunarUtil.getJiaZiIndex(getDayInGanZhi())%9; - int index = asc?start+ganZhiIndex-1:start-ganZhiIndex-1; - if(index>8){ + int ganZhiIndex = LunarUtil.getJiaZiIndex(getDayInGanZhi()) % 9; + int index = asc ? start + ganZhiIndex - 1 : start - ganZhiIndex - 1; + if (index > 8) { index -= 9; } - if(index<0){ + if (index < 0) { index += 9; } return new NineStar(index); @@ -1993,27 +1914,28 @@ public class Lunar{ /** * 获取值时九星(时家紫白星歌诀:三元时白最为佳,冬至阳生顺莫差,孟日七宫仲一白,季日四绿发萌芽,每把时辰起甲子,本时星耀照光华,时星移入中宫去,顺飞八方逐细查。夏至阴生逆回首,孟归三碧季加六,仲在九宫时起甲,依然掌中逆轮跨。) + * * @return 值时九星 */ - public NineStar getTimeNineStar(){ + public NineStar getTimeNineStar() { //顺逆 String solarYmd = solar.toYmd(); boolean asc = false; - if(solarYmd.compareTo(jieQi.get("冬至").toYmd())>=0 && solarYmd.compareTo(jieQi.get("夏至").toYmd())<0){ + if (solarYmd.compareTo(jieQi.get("冬至").toYmd()) >= 0 && solarYmd.compareTo(jieQi.get("夏至").toYmd()) < 0) { asc = true; } - int start = asc?7:3; + int start = asc ? 7 : 3; String dayZhi = getDayZhi(); if ("子午卯酉".contains(dayZhi)) { - start = asc?1:9; + start = asc ? 1 : 9; } else if ("辰戌丑未".contains(dayZhi)) { - start = asc?4:6; + start = asc ? 4 : 6; } - int index = asc?start+timeZhiIndex-1:start-timeZhiIndex-1; - if(index>8){ + int index = asc ? start + timeZhiIndex - 1 : start - timeZhiIndex - 1; + if (index > 8) { index -= 9; } - if(index<0){ + if (index < 0) { index += 9; } return new NineStar(index); @@ -2021,115 +1943,123 @@ public class Lunar{ /** * 获取节气表(节气名称:阳历),节气交接时刻精确到秒,以冬至开头,按先后顺序排列 + * * @return 节气表 */ - public Map getJieQiTable(){ + public Map getJieQiTable() { return jieQi; } /** * 获取下一节令(顺推的第一个节令) + * * @return 节气 */ - public JieQi getNextJie(){ - return getNearJieQi(true,LunarUtil.JIE); + public JieQi getNextJie() { + return getNearJieQi(true, LunarUtil.JIE); } /** * 获取上一节令(逆推的第一个节令) + * * @return 节气 */ - public JieQi getPrevJie(){ - return getNearJieQi(false,LunarUtil.JIE); + public JieQi getPrevJie() { + return getNearJieQi(false, LunarUtil.JIE); } /** * 获取下一气令(顺推的第一个气令) + * * @return 节气 */ - public JieQi getNextQi(){ - return getNearJieQi(true,LunarUtil.QI); + public JieQi getNextQi() { + return getNearJieQi(true, LunarUtil.QI); } /** * 获取上一气令(逆推的第一个气令) + * * @return 节气 */ - public JieQi getPrevQi(){ - return getNearJieQi(false,LunarUtil.QI); + public JieQi getPrevQi() { + return getNearJieQi(false, LunarUtil.QI); } /** * 获取下一节气(顺推的第一个节气) + * * @return 节气 */ - public JieQi getNextJieQi(){ - return getNearJieQi(true,null); + public JieQi getNextJieQi() { + return getNearJieQi(true, null); } /** * 获取上一节气(逆推的第一个节气) + * * @return 节气 */ - public JieQi getPrevJieQi(){ - return getNearJieQi(false,null); + public JieQi getPrevJieQi() { + return getNearJieQi(false, null); } /** * 获取最近的节气,如果未找到匹配的,返回null - * @param forward 是否顺推,true为顺推,false为逆推 + * + * @param forward 是否顺推,true为顺推,false为逆推 * @param conditions 过滤条件,如果设置过滤条件,仅返回匹配该名称的 * @return 节气 */ - protected JieQi getNearJieQi(boolean forward, String[] conditions){ + protected JieQi getNearJieQi(boolean forward, String[] conditions) { String name = null; Solar near = null; Set filters = new HashSet(); - if(null!=conditions) { + if (null != conditions) { Collections.addAll(filters, conditions); } boolean filter = !filters.isEmpty(); String today = solar.toYmdHms(); - for(Map.Entry entry:jieQi.entrySet()){ + for (Map.Entry entry : jieQi.entrySet()) { String jq = entry.getKey(); - if(JIE_QI_APPEND.equals(jq)){ + if (JIE_QI_APPEND.equals(jq)) { jq = JIE_QI_FIRST; } - if(JIE_QI_PREPEND.equals(jq)){ + if (JIE_QI_PREPEND.equals(jq)) { jq = JIE_QI_LAST; } - if(JIE_APPEND_SOLAR_FIRST.equals(jq)){ + if (JIE_APPEND_SOLAR_FIRST.equals(jq)) { jq = JIE_SOLAR_FIRST; } - if(QI_APPEND_SOLAR_SECOND.equals(jq)){ + if (QI_APPEND_SOLAR_SECOND.equals(jq)) { jq = QI_SOLAR_SECOND; } - if(filter){ - if(!filters.contains(jq)){ + if (filter) { + if (!filters.contains(jq)) { continue; } } Solar solar = entry.getValue(); String day = solar.toYmdHms(); - if(forward){ - if(day.compareTo(today)<0){ + if (forward) { + if (day.compareTo(today) < 0) { continue; } - if(null==near || day.compareTo(near.toYmdHms())<0){ + if (null == near || day.compareTo(near.toYmdHms()) < 0) { name = jq; near = solar; } - }else{ - if(day.compareTo(today)>0){ + } else { + if (day.compareTo(today) > 0) { continue; } - if(null==near || day.compareTo(near.toYmdHms())>0) { + if (null == near || day.compareTo(near.toYmdHms()) > 0) { name = jq; near = solar; } } } - if(null==near){ + if (null == near) { return null; } return new JieQi(name, near); @@ -2137,24 +2067,25 @@ public class Lunar{ /** * 获取节气名称,如果无节气,返回空字符串 + * * @return 节气名称 */ - public String getJieQi(){ + public String getJieQi() { String name = ""; - for(Map.Entry jq:jieQi.entrySet()){ + for (Map.Entry jq : jieQi.entrySet()) { Solar d = jq.getValue(); - if(d.getYear()==solar.getYear()&&d.getMonth()==solar.getMonth()&&d.getDay()==solar.getDay()){ + if (d.getYear() == solar.getYear() && d.getMonth() == solar.getMonth() && d.getDay() == solar.getDay()) { name = jq.getKey(); break; } } - if(JIE_QI_APPEND.equals(name)){ + if (JIE_QI_APPEND.equals(name)) { name = JIE_QI_FIRST; - }else if(JIE_QI_PREPEND.equals(name)){ + } else if (JIE_QI_PREPEND.equals(name)) { name = JIE_QI_LAST; - }else if(JIE_APPEND_SOLAR_FIRST.equals(name)){ + } else if (JIE_APPEND_SOLAR_FIRST.equals(name)) { name = JIE_SOLAR_FIRST; - }else if(QI_APPEND_SOLAR_SECOND.equals(name)){ + } else if (QI_APPEND_SOLAR_SECOND.equals(name)) { name = QI_SOLAR_SECOND; } return name; @@ -2162,32 +2093,35 @@ public class Lunar{ /** * 获取当天节气对象,如果无节气,返回null + * * @return 节气对象 */ - public JieQi getCurrentJieQi(){ + public JieQi getCurrentJieQi() { String name = getJieQi(); - return name.length()>0 ? new JieQi(name,solar) : null; + return name.length() > 0 ? new JieQi(name, solar) : null; } /** * 获取当天节令对象,如果无节令,返回null + * * @return 节气对象 */ - public JieQi getCurrentJie(){ + public JieQi getCurrentJie() { String name = getJie(); - return name.length()>0 ? new JieQi(name,solar) : null; + return name.length() > 0 ? new JieQi(name, solar) : null; } /** * 获取当天气令对象,如果无气令,返回null + * * @return 节气对象 */ - public JieQi getCurrentQi(){ + public JieQi getCurrentQi() { String name = getQi(); - return name.length()>0 ? new JieQi(name,solar) : null; + return name.length() > 0 ? new JieQi(name, solar) : null; } - public String toFullString(){ + public String toFullString() { StringBuilder s = new StringBuilder(); s.append(toString()); s.append(" "); @@ -2216,18 +2150,18 @@ public class Lunar{ s.append(getTimeNaYin()); s.append("] 星期"); s.append(getWeekInChinese()); - for(String f:getFestivals()){ + for (String f : getFestivals()) { s.append(" ("); s.append(f); s.append(")"); } - for(String f:getOtherFestivals()){ + for (String f : getOtherFestivals()) { s.append(" ("); s.append(f); s.append(")"); } String jq = getJieQi(); - if(jq.length()>0){ + if (jq.length() > 0) { s.append(" ["); s.append(jq); s.append("]"); @@ -2275,8 +2209,8 @@ public class Lunar{ } @Override - public String toString(){ - return getYearInChinese()+"年"+getMonthInChinese()+"月"+getDayInChinese(); + public String toString() { + return getYearInChinese() + "年" + getMonthInChinese() + "月" + getDayInChinese(); } /** @@ -2284,7 +2218,7 @@ public class Lunar{ * * @return 如2015 */ - public int getYear(){ + public int getYear() { return year; } @@ -2293,7 +2227,7 @@ public class Lunar{ * * @return 1到12,负数为闰月 */ - public int getMonth(){ + public int getMonth() { return month; } @@ -2302,7 +2236,7 @@ public class Lunar{ * * @return 日期 */ - public int getDay(){ + public int getDay() { return day; } @@ -2311,7 +2245,7 @@ public class Lunar{ * * @return 0到23之间的数字 */ - public int getHour(){ + public int getHour() { return hour; } @@ -2320,7 +2254,7 @@ public class Lunar{ * * @return 0到59之间的数字 */ - public int getMinute(){ + public int getMinute() { return minute; } @@ -2329,7 +2263,7 @@ public class Lunar{ * * @return 0到59之间的数字 */ - public int getSecond(){ + public int getSecond() { return second; } @@ -2397,20 +2331,20 @@ public class Lunar{ return monthZhiIndexExact; } - public int getYearGanIndexExact(){ + public int getYearGanIndexExact() { return yearGanIndexExact; } - public int getYearZhiIndexExact(){ + public int getYearZhiIndexExact() { return yearZhiIndexExact; } - public Solar getSolar(){ + public Solar getSolar() { return solar; } - public EightChar getEightChar(){ - if(null==eightChar){ + public EightChar getEightChar() { + if (null == eightChar) { eightChar = new EightChar(this); } return eightChar; @@ -2418,294 +2352,274 @@ public class Lunar{ /** * 获取往后推几天的农历日期,如果要往前推,则天数用负数 + * * @param days 天数 * @return 农历日期 */ - public Lunar next(int days){ - int y = year; - int m = month; - int d = day; - if(days>0){ - int daysInMonth = LunarUtil.getDaysOfMonth(y,m); - int rest = day+days; - while(daysInMonth < rest) { - if(m>0){ - if(LunarUtil.getLeapMonth(y)!=m){ - m++; - }else{ - m = -m; - } - }else{ - m = 1-m; - } - if(13==m){ - y++; - m=1; - } - rest -= daysInMonth; - daysInMonth = LunarUtil.getDaysOfMonth(y,m); - } - d = rest; - }else if(days<0){ - int daysInMonth = day; - int rest = -days; - while(daysInMonth <= rest) { - if(m>0){ - m--; - if(0==m){ - y--; - m = LunarUtil.getLeapMonth(y)!=12?12:-12; - } - }else{ - m = -m; - } - rest -= daysInMonth; - daysInMonth = LunarUtil.getDaysOfMonth(y,m); - } - d = daysInMonth - rest; - } - return new Lunar(y,m,d,hour,minute,second); + public Lunar next(int days) { + return solar.next(days).getLunar(); } /** * 获取年所在旬(以正月初一作为新年的开始) + * * @return 旬 */ - public String getYearXun(){ + public String getYearXun() { return LunarUtil.getXun(getYearInGanZhi()); } /** * 获取年所在旬(以立春当天作为新年的开始) + * * @return 旬 */ - public String getYearXunByLiChun(){ + public String getYearXunByLiChun() { return LunarUtil.getXun(getYearInGanZhiByLiChun()); } /** * 获取年所在旬(以立春交接时刻作为新年的开始) + * * @return 旬 */ - public String getYearXunExact(){ + public String getYearXunExact() { return LunarUtil.getXun(getYearInGanZhiExact()); } /** * 获取值年空亡(以正月初一作为新年的开始) + * * @return 空亡(旬空) */ - public String getYearXunKong(){ + public String getYearXunKong() { return LunarUtil.getXunKong(getYearInGanZhi()); } /** * 获取值年空亡(以立春当天作为新年的开始) + * * @return 空亡(旬空) */ - public String getYearXunKongByLiChun(){ + public String getYearXunKongByLiChun() { return LunarUtil.getXunKong(getYearInGanZhiByLiChun()); } /** * 获取值年空亡(以立春交接时刻作为新年的开始) + * * @return 空亡(旬空) */ - public String getYearXunKongExact(){ + public String getYearXunKongExact() { return LunarUtil.getXunKong(getYearInGanZhiExact()); } /** * 获取月所在旬(以节交接当天起算) + * * @return 旬 */ - public String getMonthXun(){ + public String getMonthXun() { return LunarUtil.getXun(getMonthInGanZhi()); } /** * 获取月所在旬(以节交接时刻起算) + * * @return 旬 */ - public String getMonthXunExact(){ + public String getMonthXunExact() { return LunarUtil.getXun(getMonthInGanZhiExact()); } /** * 获取值月空亡(以节交接当天起算) + * * @return 空亡(旬空) */ - public String getMonthXunKong(){ + public String getMonthXunKong() { return LunarUtil.getXunKong(getMonthInGanZhi()); } /** * 获取值月空亡(以节交接时刻起算) + * * @return 空亡(旬空) */ - public String getMonthXunKongExact(){ + public String getMonthXunKongExact() { return LunarUtil.getXunKong(getMonthInGanZhiExact()); } /** * 获取日所在旬(以节交接当天起算) + * * @return 旬 */ - public String getDayXun(){ + public String getDayXun() { return LunarUtil.getXun(getDayInGanZhi()); } /** * 获取日所在旬(晚子时日柱算明天) + * * @return 旬 */ - public String getDayXunExact(){ + public String getDayXunExact() { return LunarUtil.getXun(getDayInGanZhiExact()); } /** * 获取日所在旬(晚子时日柱算当天) + * * @return 旬 */ - public String getDayXunExact2(){ + public String getDayXunExact2() { return LunarUtil.getXun(getDayInGanZhiExact2()); } /** * 获取值日空亡 + * * @return 空亡(旬空) */ - public String getDayXunKong(){ + public String getDayXunKong() { return LunarUtil.getXunKong(getDayInGanZhi()); } /** * 获取值日空亡(晚子时日柱算明天) + * * @return 空亡(旬空) */ - public String getDayXunKongExact(){ + public String getDayXunKongExact() { return LunarUtil.getXunKong(getDayInGanZhiExact()); } /** * 获取值日空亡(晚子时日柱算当天) + * * @return 空亡(旬空) */ - public String getDayXunKongExact2(){ + public String getDayXunKongExact2() { return LunarUtil.getXunKong(getDayInGanZhiExact2()); } /** * 获取时辰所在旬 + * * @return 旬 */ - public String getTimeXun(){ + public String getTimeXun() { return LunarUtil.getXun(getTimeInGanZhi()); } /** * 获取值时空亡 + * * @return 空亡(旬空) */ - public String getTimeXunKong(){ + public String getTimeXunKong() { return LunarUtil.getXunKong(getTimeInGanZhi()); } /** * 获取数九 + * * @return 数九,如果不是数九天,返回null */ - public ShuJiu getShuJiu(){ + @SuppressWarnings("MagicConstant") + public ShuJiu getShuJiu() { Calendar currentCalendar = Calendar.getInstance(); - currentCalendar.set(solar.getYear(),solar.getMonth()-1,solar.getDay(),0,0,0); - currentCalendar.set(Calendar.MILLISECOND,0); + currentCalendar.set(solar.getYear(), solar.getMonth() - 1, solar.getDay(), 0, 0, 0); + currentCalendar.set(Calendar.MILLISECOND, 0); Solar start = jieQi.get(JIE_QI_APPEND); Calendar startCalendar = Calendar.getInstance(); - startCalendar.set(start.getYear(),start.getMonth()-1,start.getDay(),0,0,0); - startCalendar.set(Calendar.MILLISECOND,0); + startCalendar.set(start.getYear(), start.getMonth() - 1, start.getDay(), 0, 0, 0); + startCalendar.set(Calendar.MILLISECOND, 0); - if(currentCalendar.compareTo(startCalendar)<0){ + if (currentCalendar.compareTo(startCalendar) < 0) { start = jieQi.get(JIE_QI_FIRST); - startCalendar.set(start.getYear(),start.getMonth()-1,start.getDay(),0,0,0); + startCalendar.set(start.getYear(), start.getMonth() - 1, start.getDay(), 0, 0, 0); } Calendar endCalendar = Calendar.getInstance(); - endCalendar.set(start.getYear(),start.getMonth()-1,start.getDay(),0,0,0); - endCalendar.add(Calendar.DATE,81); - endCalendar.set(Calendar.MILLISECOND,0); + endCalendar.set(start.getYear(), start.getMonth() - 1, start.getDay(), 0, 0, 0); + endCalendar.add(Calendar.DATE, 81); + endCalendar.set(Calendar.MILLISECOND, 0); - if(currentCalendar.compareTo(startCalendar)<0||currentCalendar.compareTo(endCalendar)>=0){ + if (currentCalendar.compareTo(startCalendar) < 0 || currentCalendar.compareTo(endCalendar) >= 0) { return null; } - int days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/MS_PER_DAY); - return new ShuJiu(LunarUtil.NUMBER[days/9+1]+"九",days%9+1); + int days = (int) ((currentCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / MS_PER_DAY); + return new ShuJiu(LunarUtil.NUMBER[days / 9 + 1] + "九", days % 9 + 1); } /** * 获取三伏 + * * @return 三伏,如果不是伏天,返回null */ - public Fu getFu(){ + @SuppressWarnings("MagicConstant") + public Fu getFu() { Calendar currentCalendar = Calendar.getInstance(); - currentCalendar.set(solar.getYear(),solar.getMonth()-1,solar.getDay(),0,0,0); - currentCalendar.set(Calendar.MILLISECOND,0); + currentCalendar.set(solar.getYear(), solar.getMonth() - 1, solar.getDay(), 0, 0, 0); + currentCalendar.set(Calendar.MILLISECOND, 0); Solar xiaZhi = jieQi.get("夏至"); Solar liQiu = jieQi.get("立秋"); Calendar startCalendar = Calendar.getInstance(); - startCalendar.set(xiaZhi.getYear(),xiaZhi.getMonth()-1,xiaZhi.getDay(),0,0,0); - startCalendar.set(Calendar.MILLISECOND,0); - + startCalendar.set(xiaZhi.getYear(), xiaZhi.getMonth() - 1, xiaZhi.getDay(), 0, 0, 0); + startCalendar.set(Calendar.MILLISECOND, 0); // 第1个庚日 - int add = 6-xiaZhi.getLunar().getDayGanIndex(); - if(add<0){ + int add = 6 - xiaZhi.getLunar().getDayGanIndex(); + if (add < 0) { add += 10; } // 第3个庚日,即初伏第1天 add += 20; - startCalendar.add(Calendar.DATE,add); + startCalendar.add(Calendar.DATE, add); // 初伏以前 - if(currentCalendar.compareTo(startCalendar)<0){ + if (currentCalendar.compareTo(startCalendar) < 0) { return null; } - int days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/MS_PER_DAY); - if(days<10){ - return new Fu("初伏",days+1); + int days = (int) ((currentCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / MS_PER_DAY); + if (days < 10) { + return new Fu("初伏", days + 1); } // 第4个庚日,中伏第1天 - startCalendar.add(Calendar.DATE,10); + startCalendar.add(Calendar.DATE, 10); - days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/MS_PER_DAY); - if(days<10){ - return new Fu("中伏",days+1); + days = (int) ((currentCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / MS_PER_DAY); + if (days < 10) { + return new Fu("中伏", days + 1); } // 第5个庚日,中伏第11天或末伏第1天 - startCalendar.add(Calendar.DATE,10); + startCalendar.add(Calendar.DATE, 10); Calendar liQiuCalendar = Calendar.getInstance(); - liQiuCalendar.set(liQiu.getYear(),liQiu.getMonth()-1,liQiu.getDay(),0,0,0); - liQiuCalendar.set(Calendar.MILLISECOND,0); + liQiuCalendar.set(liQiu.getYear(), liQiu.getMonth() - 1, liQiu.getDay(), 0, 0, 0); + liQiuCalendar.set(Calendar.MILLISECOND, 0); - days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/MS_PER_DAY); + days = (int) ((currentCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / MS_PER_DAY); // 末伏 - if(liQiuCalendar.compareTo(startCalendar)<=0){ - if(days<10){ - return new Fu("末伏",days+1); + if (liQiuCalendar.compareTo(startCalendar) <= 0) { + if (days < 10) { + return new Fu("末伏", days + 1); } - }else{ + } else { // 中伏 - if(days<10){ - return new Fu("中伏",days+11); + if (days < 10) { + return new Fu("中伏", days + 11); } // 末伏第1天 - startCalendar.add(Calendar.DATE,10); - days = (int)((currentCalendar.getTimeInMillis()-startCalendar.getTimeInMillis())/MS_PER_DAY); - if(days<10){ - return new Fu("末伏",days+1); + startCalendar.add(Calendar.DATE, 10); + days = (int) ((currentCalendar.getTimeInMillis() - startCalendar.getTimeInMillis()) / MS_PER_DAY); + if (days < 10) { + return new Fu("末伏", days + 1); } } return null; @@ -2713,36 +2627,39 @@ public class Lunar{ /** * 获取六曜 + * * @return 六曜 */ - public String getLiuYao(){ - return LunarUtil.LIU_YAO[(Math.abs(month)-1+day-1)%6]; + public String getLiuYao() { + return LunarUtil.LIU_YAO[(Math.abs(month) - 1 + day - 1) % 6]; } /** * 获取物候 + * * @return 物候 */ - public String getWuHou(){ + @SuppressWarnings("MagicConstant") + public String getWuHou() { JieQi jieQi = getPrevJieQi(); String name = jieQi.getName(); int offset = 0; - for(int i=0,j=JIE_QI.length;i months = new ArrayList(); + + /** + * 节气儒略日们 + */ + private List jieQiJulianDays = new ArrayList(); + + /** + * 初始化 + * + * @param lunarYear 农历年 + */ + public LunarYear(int lunarYear) { + this.year = lunarYear; + compute(); + } + + /** + * 通过农历年初始化 + * + * @param lunarYear 农历年 + * @return 农历年 + */ + public static LunarYear fromYear(int lunarYear) { + return new LunarYear(lunarYear); + } + + private void compute() { + // 节气(中午12点) + double[] jq = new double[25]; + // 合朔,即每月初一(中午12点) + double[] hs = new double[15]; + // 每月天数 + int[] dayCounts = new int[hs.length - 1]; + + int year = this.year - 2000; + // 从上年的大雪到下年的大寒 + for (int i = 0, j = Lunar.JIE_QI_IN_USE.length; i < j; i++) { + // 精确的节气 + double t = 36525 * ShouXingUtil.saLonT((year + (17 + i) * 15d / 360) * ShouXingUtil.PI_2); + t += ShouXingUtil.ONE_THIRD - ShouXingUtil.dtT(t); + jieQiJulianDays.add(t + Solar.J2000); + // 按中午12点算的节气 + if (i > 0 && i < 26) { + jq[i - 1] = Math.round(t); + } + } + + // 冬至前的初一 + double w = ShouXingUtil.calcShuo(jq[0]); + if (w > jq[0]) { + w -= 29.5306; + } + // 递推每月初一 + for (int i = 0, j = hs.length; i < j; i++) { + hs[i] = ShouXingUtil.calcShuo(w + 29.5306 * i); + } + // 每月天数 + for (int i = 0, j = dayCounts.length; i < j; i++) { + dayCounts[i] = (int) (hs[i + 1] - hs[i]); + } + + int leap = -1; + if (hs[13] <= jq[24]) { + int i = 1; + while (hs[i + 1] > jq[2 * i] && i < 13) { + i++; + } + leap = i; + } + + int y = this.year - 1; + int m = 11; + for (int i = 0, j = dayCounts.length; i < j; i++) { + boolean isLeap = false; + if (i == leap) { + isLeap = true; + m--; + } + this.months.add(new LunarMonth(y, isLeap ? -m : m, dayCounts[i], hs[i] + Solar.J2000)); + m++; + if (m == 13) { + m = 1; + y++; + } + } + } + + /** + * 获取农历年 + * + * @return 农历年 + */ + public int getYear() { + return year; + } + + /** + * 获取农历月们 + * + * @return 农历月们 + */ + public List getMonths() { + return months; + } + + /** + * 获取节气儒略日们 + * + * @return 节气儒略日们 + */ + public List getJieQiJulianDays() { + return jieQiJulianDays; + } + + /** + * 获取农历月 + * + * @param lunarMonth 月,1-12,闰月为负数,如闰2月为-2 + * @return 农历月 + */ + public LunarMonth getMonth(int lunarMonth) { + for (LunarMonth m : months) { + if (m.getYear() == year && m.getMonth() == lunarMonth) { + return m; + } + } + return null; + } + + /** + * 获取闰月 + * + * @return 闰月数字,1代表闰1月,0代表无闰月 + */ + public int getLeapMonth() { + for (LunarMonth m : months) { + if (m.getYear() == year && m.isLeap()) { + return Math.abs(m.getMonth()); + } + } + return 0; + } + + @Override + public String toString() { + return year + ""; + } + + public String toFullString() { + return year + "年"; + } +} diff --git a/src/main/java/com/nlf/calendar/Solar.java b/src/main/java/com/nlf/calendar/Solar.java index 68405c6..6eef229 100644 --- a/src/main/java/com/nlf/calendar/Solar.java +++ b/src/main/java/com/nlf/calendar/Solar.java @@ -61,9 +61,11 @@ public class Solar{ * @param minute 分钟,0到59 * @param second 秒钟,0到59 */ - public Solar(int year,int month,int day,int hour,int minute,int second){ + @SuppressWarnings("MagicConstant") + public Solar(int year, int month, int day, int hour, int minute, int second){ calendar = Calendar.getInstance(); calendar.set(year,month-1,day,hour,minute,second); + calendar.set(Calendar.MILLISECOND,0); this.year = year; this.month = month; this.day = day; @@ -80,6 +82,7 @@ public class Solar{ public Solar(Date date){ calendar = Calendar.getInstance(); calendar.setTime(date); + calendar.set(Calendar.MILLISECOND,0); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH)+1; day = calendar.get(Calendar.DATE); @@ -94,6 +97,7 @@ public class Solar{ * @param calendar 日历 */ public Solar(Calendar calendar){ + calendar.set(Calendar.MILLISECOND,0); this.calendar = calendar; year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH)+1; @@ -107,6 +111,7 @@ public class Solar{ * 通过儒略日初始化 * @param julianDay 儒略日 */ + @SuppressWarnings("MagicConstant") public Solar(double julianDay){ int d = (int)(julianDay + 0.5); double f = julianDay + 0.5 - d; @@ -142,6 +147,7 @@ public class Solar{ calendar = Calendar.getInstance(); calendar.set(year,month-1,day,hour,minute,second); + calendar.set(Calendar.MILLISECOND,0); this.year = year; this.month = month; this.day = day; @@ -208,7 +214,7 @@ public class Solar{ } /** - * 通过八字获取阳历列表(晚子时日柱按当天) + * 通过八字获取阳历列表(晚子时日柱按当天,起始年为1900) * @param yearGanZhi 年柱 * @param monthGanZhi 月柱 * @param dayGanZhi 日柱 @@ -220,7 +226,7 @@ public class Solar{ } /** - * 通过八字获取阳历列表 + * 通过八字获取阳历列表(起始年为1900) * @param yearGanZhi 年柱 * @param monthGanZhi 月柱 * @param dayGanZhi 日柱 @@ -229,6 +235,20 @@ public class Solar{ * @return 符合的阳历列表 */ public static List fromBaZi(String yearGanZhi,String monthGanZhi,String dayGanZhi,String timeGanZhi,int sect){ + return fromBaZi(yearGanZhi,monthGanZhi,dayGanZhi,timeGanZhi,sect,1900); + } + + /** + * 通过八字获取阳历列表 + * @param yearGanZhi 年柱 + * @param monthGanZhi 月柱 + * @param dayGanZhi 日柱 + * @param timeGanZhi 时柱 + * @param sect 流派,2晚子时日柱按当天,1晚子时日柱按明天 + * @param baseYear 起始年 + * @return 符合的阳历列表 + */ + public static List fromBaZi(String yearGanZhi,String monthGanZhi,String dayGanZhi,String timeGanZhi,int sect,int baseYear){ sect = (1==sect)?1:2; List l = new ArrayList(); Solar today = new Solar(); @@ -245,18 +265,15 @@ public class Solar{ hour = (i-1)*2; } } - while(startYear>=SolarUtil.BASE_YEAR-1){ + while(startYear>=baseYear){ int year = startYear-1; int counter = 0; int month = 12; int day; boolean found = false; while (counter < 15) { - if(year>=SolarUtil.BASE_YEAR){ + if(year>=baseYear){ day = 1; - if(year==SolarUtil.BASE_YEAR&&month==SolarUtil.BASE_MONTH){ - day = SolarUtil.BASE_DAY; - } Solar solar = new Solar(year, month, day, hour, 0, 0); lunar = solar.getLunar(); if(lunar.getYearInGanZhiExact().equals(yearGanZhi) && lunar.getMonthInGanZhiExact().equals(monthGanZhi)){ @@ -279,9 +296,6 @@ public class Solar{ year--; } day = 1; - if(year==SolarUtil.BASE_YEAR&&month==SolarUtil.BASE_MONTH){ - day = SolarUtil.BASE_DAY; - } Solar solar = new Solar(year, month, day, hour, 0, 0); while (counter < 61) { lunar = solar.getLunar(); @@ -508,11 +522,11 @@ public class Solar{ } public String toYmd(){ - return year+"-"+(month<10?"0":"")+month+"-"+(day<10?"0":"")+day; + return String.format("%04d-%02d-%02d", year, month, day); } public String toYmdHms(){ - return toYmd()+" "+(hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute+":"+(second<10?"0":"")+second; + return toYmd()+" "+String.format("%02d:%02d:%02d", hour, minute, second); } public String toFullString(){ @@ -550,9 +564,17 @@ public class Solar{ return next(days,false); } + /** + * 取往后推几天的阳历日期,如果要往前推,则天数用负数 + * @param days 天数 + * @param onlyWorkday 是否仅限工作日 + * @return 阳历日期 + */ + @SuppressWarnings("MagicConstant") public Solar next(int days, boolean onlyWorkday){ Calendar c = Calendar.getInstance(); c.set(year,month-1,day,hour,minute,second); + c.set(Calendar.MILLISECOND,0); if(0!=days) { if(!onlyWorkday){ c.add(Calendar.DATE,days); diff --git a/src/main/java/com/nlf/calendar/SolarHalfYear.java b/src/main/java/com/nlf/calendar/SolarHalfYear.java index 6b095ff..4017253 100644 --- a/src/main/java/com/nlf/calendar/SolarHalfYear.java +++ b/src/main/java/com/nlf/calendar/SolarHalfYear.java @@ -117,6 +117,7 @@ public class SolarHalfYear { * @param halfYears 推移的半年数,负数为倒推 * @return 推移后的半年 */ + @SuppressWarnings("MagicConstant") public SolarHalfYear next(int halfYears){ if(0==halfYears){ return new SolarHalfYear(year,month); diff --git a/src/main/java/com/nlf/calendar/SolarMonth.java b/src/main/java/com/nlf/calendar/SolarMonth.java index a1bd7eb..8367e79 100644 --- a/src/main/java/com/nlf/calendar/SolarMonth.java +++ b/src/main/java/com/nlf/calendar/SolarMonth.java @@ -124,6 +124,7 @@ public class SolarMonth{ * @param months 月数 * @return 阳历月 */ + @SuppressWarnings("MagicConstant") public SolarMonth next(int months){ Calendar c = Calendar.getInstance(); c.set(year,month-1,1); diff --git a/src/main/java/com/nlf/calendar/SolarSeason.java b/src/main/java/com/nlf/calendar/SolarSeason.java index 578d2f8..ce532ad 100644 --- a/src/main/java/com/nlf/calendar/SolarSeason.java +++ b/src/main/java/com/nlf/calendar/SolarSeason.java @@ -116,6 +116,7 @@ public class SolarSeason { * @param seasons 推移的季度数,负数为倒推 * @return 推移后的季度 */ + @SuppressWarnings("MagicConstant") public SolarSeason next(int seasons){ if(0==seasons){ return new SolarSeason(year,month); diff --git a/src/main/java/com/nlf/calendar/SolarWeek.java b/src/main/java/com/nlf/calendar/SolarWeek.java index b1445c8..7074bae 100644 --- a/src/main/java/com/nlf/calendar/SolarWeek.java +++ b/src/main/java/com/nlf/calendar/SolarWeek.java @@ -144,6 +144,7 @@ public class SolarWeek { * 获取当前日期是在当月第几周 * @return 周序号,从1开始 */ + @SuppressWarnings("MagicConstant") public int getIndex(){ Calendar c = Calendar.getInstance(); c.set(year,month-1,1); @@ -160,6 +161,7 @@ public class SolarWeek { * @param separateMonth 是否按月单独计算 * @return 推移后的阳历周 */ + @SuppressWarnings("MagicConstant") public SolarWeek next(int weeks,boolean separateMonth){ if(0==weeks){ return new SolarWeek(year,month,day,start); @@ -215,6 +217,7 @@ public class SolarWeek { * 获取本周第一天的阳历日期(可能跨月) * @return 本周第一天的阳历日期 */ + @SuppressWarnings("MagicConstant") public Solar getFirstDay(){ Calendar c = Calendar.getInstance(); c.set(year,month-1,day); diff --git a/src/main/java/com/nlf/calendar/eightchar/Yun.java b/src/main/java/com/nlf/calendar/eightchar/Yun.java index 946aef6..bbbe559 100644 --- a/src/main/java/com/nlf/calendar/eightchar/Yun.java +++ b/src/main/java/com/nlf/calendar/eightchar/Yun.java @@ -50,6 +50,7 @@ public class Yun { /** * 起运计算 */ + @SuppressWarnings("MagicConstant") private void computeStart() { // 上节 JieQi prev = lunar.getPrevJie(); @@ -60,8 +61,10 @@ public class Yun { // 阳男阴女顺推,阴男阳女逆推 Solar start = forward ? current : prev.getSolar(); Solar end = forward ? next.getSolar() : current; + int endTimeZhiIndex = (end.getHour() == 23) ? 11 : LunarUtil.getTimeZhiIndex(end.toYmdHms().substring(11, 16)); + int startTimeZhiIndex = (start.getHour() == 23) ? 11 : LunarUtil.getTimeZhiIndex(start.toYmdHms().substring(11, 16)); // 时辰差 - int hourDiff = LunarUtil.getTimeZhiIndex(end.toYmdHms().substring(11, 16)) - LunarUtil.getTimeZhiIndex(start.toYmdHms().substring(11, 16)); + int hourDiff = endTimeZhiIndex - startTimeZhiIndex; Calendar endCalendar = Calendar.getInstance(); endCalendar.set(end.getYear(), end.getMonth() - 1, end.getDay(), 0, 0, 0); endCalendar.set(Calendar.MILLISECOND, 0); @@ -138,10 +141,12 @@ public class Yun { * * @return 阳历日期 */ + @SuppressWarnings("MagicConstant") public Solar getStartSolar() { Solar birth = lunar.getSolar(); Calendar c = Calendar.getInstance(); c.set(birth.getYear() + startYear, birth.getMonth() - 1 + startMonth, birth.getDay() + startDay, 0, 0, 0); + c.set(Calendar.MILLISECOND,0); return Solar.fromCalendar(c); } diff --git a/src/main/java/com/nlf/calendar/util/LunarUtil.java b/src/main/java/com/nlf/calendar/util/LunarUtil.java index 52308c1..bcf25d8 100644 --- a/src/main/java/com/nlf/calendar/util/LunarUtil.java +++ b/src/main/java/com/nlf/calendar/util/LunarUtil.java @@ -3,34 +3,14 @@ package com.nlf.calendar.util; import java.util.*; /** - * 农历工具,基准日期为1900年十一月十一,对应阳历1901年1月1日,最远仅支持到2099年 + * 农历工具 * * @author 6tail * */ public class LunarUtil{ - /** 农历基准年 */ - public static final int BASE_YEAR = 1900; - /** 农历基准月 */ - public static final int BASE_MONTH = 11; - /** 农历基准日 */ - public static final int BASE_DAY = 11; - /** 农历与阳历年偏移量 */ - public static final int BASE_INDEX = 0; - /** 基准对应的值年九星偏移量 */ - public static final int BASE_YEAR_JIU_XING_INDEX = 0; - /** 基准对应的年干支偏移量 */ - public static final int BASE_YEAR_GANZHI_INDEX = -4; - /** 基准对应的日干支偏移量 */ - public static final int BASE_DAY_GANZHI_INDEX = 15; /** 月份地支偏移量,因正月起寅 */ public static final int BASE_MONTH_ZHI_INDEX = 2; - /** 星期偏移量 */ - public static final int BASE_WEEK_INDEX = 2; - /** 闰年表(存在闰月的年份偏移值) */ - public static final int[] LEAP_MONTH_YEAR = {6,14,19,25,33,36,38,41,44,52,55,79,117,136,147,150,155,158,185,193}; - /** 月份表(2个字节表示1年,共16个二进制位,前4位表示闰月月份,后12位表示每月大小) */ - public static final int[] LUNAR_MONTH = {0x00,0x04,0xad,0x08,0x5a,0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45,0x95,0x0a,0xa6,0x04,0x55,0x24,0xad,0x08,0x5a,0x62,0xda,0x04,0xb4,0x05,0xb4,0x55,0x52,0x0d,0x94,0x0a,0x4a,0x2a,0x56,0x02,0x6d,0x71,0x6d,0x01,0xda,0x02,0xd2,0x52,0xa9,0x05,0x49,0x0d,0x2a,0x45,0x2b,0x09,0x56,0x01,0xb5,0x20,0x6d,0x01,0x59,0x69,0xd4,0x0a,0xa8,0x05,0xa9,0x56,0xa5,0x04,0x2b,0x09,0x9e,0x38,0xb6,0x08,0xec,0x74,0x6c,0x05,0xd4,0x0a,0xe4,0x6a,0x52,0x05,0x95,0x0a,0x5a,0x42,0x5b,0x04,0xb6,0x04,0xb4,0x22,0x6a,0x05,0x52,0x75,0xc9,0x0a,0x52,0x05,0x35,0x55,0x4d,0x0a,0x5a,0x02,0x5d,0x31,0xb5,0x02,0x6a,0x8a,0x68,0x05,0xa9,0x0a,0x8a,0x6a,0x2a,0x05,0x2d,0x09,0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25,0x75,0x95,0x0a,0x96,0x04,0x4d,0x54,0xad,0x04,0xda,0x04,0xd4,0x44,0xb4,0x05,0x54,0x85,0x52,0x0d,0x92,0x0a,0x56,0x6a,0x56,0x02,0x6d,0x02,0x6a,0x41,0xda,0x02,0xb2,0xa1,0xa9,0x05,0x49,0x0d,0x0a,0x6d,0x2a,0x09,0x56,0x01,0xad,0x50,0x6d,0x01,0xd9,0x02,0xd1,0x3a,0xa8,0x05,0x29,0x85,0xa5,0x0c,0x2a,0x09,0x96,0x54,0xb6,0x08,0x6c,0x09,0x64,0x45,0xd4,0x0a,0xa4,0x05,0x51,0x25,0x95,0x0a,0x2a,0x72,0x5b,0x04,0xb6,0x04,0xac,0x52,0x6a,0x05,0xd2,0x0a,0xa2,0x4a,0x4a,0x05,0x55,0x94,0x2d,0x0a,0x5a,0x02,0x75,0x61,0xb5,0x02,0x6a,0x03,0x61,0x45,0xa9,0x0a,0x4a,0x05,0x25,0x25,0x2d,0x09,0x9a,0x68,0xda,0x08,0xb4,0x09,0xa8,0x59,0x54,0x03,0xa5,0x0a,0x91,0x3a,0x96,0x04,0xad,0xb0,0xad,0x04,0xda,0x04,0xf4,0x62,0xb4,0x05,0x54,0x0b,0x44,0x5d,0x52,0x0a,0x95,0x04,0x55,0x22,0x6d,0x02,0x5a,0x71,0xda,0x02,0xaa,0x05,0xb2,0x55,0x49,0x0b,0x4a,0x0a,0x2d,0x39,0x36,0x01,0x6d,0x80,0x6d,0x01,0xd9,0x02,0xe9,0x6a,0xa8,0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08,0xb4,0x38,0x6c,0x09,0x54,0x75,0xd4,0x0a,0xa4,0x05,0x45,0x55,0x95,0x0a,0x9a,0x04,0x55,0x44,0xb5,0x04,0x6a,0x82,0x6a,0x05,0xd2,0x0a,0x92,0x6a,0x4a,0x05,0x55,0x0a,0x2a,0x4a,0x5a,0x02,0xb5,0x02,0xb2,0x31,0x69,0x03,0x31,0x73,0xa9,0x0a,0x4a,0x05,0x2d,0x55,0x2d,0x09,0x5a,0x01,0xd5,0x48,0xb4,0x09,0x68,0x89,0x54,0x0b,0xa4,0x0a,0xa5,0x6a,0x95,0x04,0xad,0x08,0x6a,0x44,0xda,0x04,0x74,0x05,0xb0,0x25,0x54,0x03}; /** 旬 */ public static final String[] XUN = {"甲子","甲戌","甲申","甲午","甲辰","甲寅"}; /** 旬空 */ @@ -1124,102 +1104,6 @@ public class LunarUtil{ protected LunarUtil(){} - /** - * 计算指定日期距离基准日期的天数 - * @param year 农历年 - * @param month 农历月 - * @param day 农历日 - * @return 距离天数 - */ - public static int computeAddDays(int year,int month,int day){ - if(BASE_YEAR==year&&BASE_MONTH==month){ - return day-BASE_DAY; - } - int y = BASE_YEAR; - int m = BASE_MONTH; - int diff = getDaysOfMonth(y,m)-BASE_DAY; - while(y!=year||m!=month){ - m = nextMonth(y,m); - if(m==1){ - y++; - } - if(y==year&&m==month){ - diff += day; - }else { - diff += getDaysOfMonth(y, m); - } - } - return diff; - } - - /** - * 获取指定年份的闰月 - * @param year 年份 - * @return 闰月数字,1代表闰1月,0代表无闰月 - */ - public static int getLeapMonth(int year){ - int index = year-BASE_YEAR+BASE_INDEX; - int v = LUNAR_MONTH[2*index+1]; - v = (v>>4)&0x0F; - return v; - } - - /** - * 获取指定年月的下一个月是第几月 - * @param y 农历年 - * @param m 农历月,闰月为负数 - * @return 1到12,闰月为负数 - */ - public static int nextMonth(int y,int m){ - int n = Math.abs(m)+1; - if(m>0){ - if(m==getLeapMonth(y)){ - n = -m; - } - } - return 13!=n?n:1; - } - - /** - * 获取某年某月有多少天 - * - * @param year 农历年 - * @param month 农历月,闰月为负数 - * @return 天数 - */ - public static int getDaysOfMonth(int year,int month){ - int index = year-BASE_YEAR+BASE_INDEX; - int v,l,d=30; - if(1<=month&&month<=8){ - v = LUNAR_MONTH[2*index]; - l = month-1; - if(((v>>l)&0x01)==1){ - d = 29; - } - }else if(9<=month&&month<=12){ - v = LUNAR_MONTH[2*index+1]; - l = month-9; - if(((v>>l)&0x01)==1){ - d = 29; - } - }else{ - v = LUNAR_MONTH[2*index+1]; - v = (v>>4)&0x0F; - if(v!=Math.abs(month)){ - d = 0; - }else{ - d = 29; - for(int i:LEAP_MONTH_YEAR){ - if(i==index){ - d = 30; - break; - } - } - } - } - return d; - } - /** * 获取HH:mm时刻的地支序号,非法的时刻返回0 * @param hm HH:mm时刻 diff --git a/src/main/java/com/nlf/calendar/util/ShouXingUtil.java b/src/main/java/com/nlf/calendar/util/ShouXingUtil.java new file mode 100644 index 0000000..71ff821 --- /dev/null +++ b/src/main/java/com/nlf/calendar/util/ShouXingUtil.java @@ -0,0 +1,265 @@ +package com.nlf.calendar.util; + +import com.nlf.calendar.Solar; + +/** + * 寿星天文历工具 + * + * @author 6tail + * @link http://www.nongli.net/sxwnl/ + */ +public class ShouXingUtil { + /** + * 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.4, 0, 0, 2015, 69}; + 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[] 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 SB = "00000000000000000000000020000002000000000000200000001000000000000000000000000000000000000010002000000000000000200000000200000000000000000000002000000000020000000000000000000000000000000000100000000000010000001000001000000000000000100000000020000000000000002000000000000001000000000000001000000000000100000000010010000020000202001101002020200101000002020010100002000000010100202000001010000202020001010000202020001010000202000001010020202001010000020200101000022000010101002020001010100002020201010100002020200010100002020000010100202000010100000202001010000220200101010020200010101001000000000001001000200000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000020010000000000000000000000000000000000000001000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000010001000000100001001010010101000000000000100001000001000100000000001000000000000100100000000010010100010000000000000000000100011000000000000000000002000000001020000000001001000001000001001000000001000100010010000100001000000100000100100010000000000000010000200000000000000000000000000000000001000000000100100000000000000000000000000000000000000000000000000010000000000101000000000000000000000000000001001010010010100100010000010010000001001001001001000000100100000100010000000100000000000000100000000010100000000001000100010100100000010000000010010000000001000001000000101002000000000100000000000000100001000000010100000101001000000100100100100100000010010010000001001010000000100101001000000000101001000000010101000000000010000001000001000001000000100000000000010010000000000000000010000000100010010000000100000010000010100010010000000000000000001001000000000100101000000010000100110100000000100000000000010000000010000010000100010000000000000000000000010000000000000000100000001000000000001000000000000000100000000000100000010000000100001010000000000101000010100000001001000000010100000000000000000000001000000000001000000000000000000000000000000000000000100000001000000000000100000000000000000000000010000000010010000000001000001010100000001000000000000001000010000101001001010000001000101000000000100100000100110000010010010010001001010010010000001000000000000101000010000000101000000000010000001001001001001000000100101000000010000100010101001010010010000101010010000000101010010000000100010010000010010010000001001010000000100101000100010000000100100001000100100000101010000000000101010100100000100000000000010010000010001001010001000100000001001010000000000000001000100100000100010100001010100000100000000100100100100010010100010001000000010010100000010001010000000001000000000001001010100000001000010100000001001010000101000000010010000100101001000100010100000000010000010000010010001000001000010100000001000000100001000000010000101001001010000001000101000001000100100000100100000010010010010101000000010000000000000010000000001010010010000100010000010010000001001000001001000000100100000100010010100100100001010000100000001010000100000001010100000000100000010000010010010000001001010001000100101000101000010100100000001010100100000001010100000000001000000100000000100100000010010100000000000010001000100000001001000010001001000001010101001000001000101001000100000001000000100100000100010000100010001000000010010100000010000000010001000010001000001000010101000000000010100001000001000100101000100010000000100101000000100010000000000010000010000010010101000000010000101000000010010100001010000010100000001001010000001000101000000000100000000100100101000000000000101000000000100001000010000000100001010010010100000010001010000010001000000001001000000000100000101000010100100000000010100100000001010100100100001000100002000000100002200001010010000000001010001010000101001001000010100001000000010101001000001010001000000000000000100000000100100000001000100010000000010000010000001000000000010101001010000010101000000001000000001000000001001000000000101000100000000100010100000000010000000100010010000010101010010101010100010010001000010010000000001010001000100001000100010000000100100000000100000000000010000101010000010000101010000000000101000010000010100000010001010100000001001000000001000000000000000100000000000100101010000000100001010000100100101000010100000100000000010010000010010001000001010001000000001001001010000100101001000000100001000000010101000001000000000100100000000100010000010100010000001010010000100001001000010000101001000000000101000000000010101001001000000001000000000101000100000010100110000001010110010100001010010000000101010010000000101010010000010000010000000000010001000000101001000000010001000101001000100100100000010000000000101010000100010100010000100010000000010000001010010000000100010001000010001000101001000000100000000000100100000101000100101010100000100100010000100100201001000100010000100000000010010000001001001000001001000100000000001010100000101001010100000001001010010000000101001000100010100100000010010010010010000001000000001000100000001000010100000000000010100101001001010010001000001001000000100100000100000000000010100010001001010010010100001000010000000001000010000100101010010010010000001001001001001000000000101000100000010100100101001010100000000001010010000000001010000000000101000010010010000010000000001010001000000101001000010010001000101001000100100000001010100100000101010100100000100000100000010010100010000001000010000000100010001010010001001000001000001001000001010100001000101000101001000100000000100010010100100000001000100010100100000000010010000001000001000001001010101000001000010101000001001010100101001001010010001000101001000000000100100000010010010000010010001000000010010100000000010010100001000010010100101010001010010000000001001001001100100100100100000010010100010101000010010000100000000010000000001010000010100100010010010010000011001001001000000000100101000100010010100100101000010000100000000010100100000001010100100100100000000010010010000000001001010001000100101001001010010101000000000010100001000001010100001000001000000000000100100100000010010100010001001000010000100100010001010010001001000000010101001000001010001001000001000001001000100101000100010010000100001001000100010100100000010010010000010010001010001000010101010000010010001001000001000100101001000010010001000101001000000100100100000100000010000010010101000000010000101000000000000101001010010010100100010001010010000001001001001001100000100100100100010000000100101000000000100001000010100100101001000100010100100000010010010010011001001001001001000100101000001010000100100000000000100000000000010100000001001000000100100100100110010010010200000001001010001000100101001001010000101001000000010101001000000010001001001001000001000000100100000000010010100010001001010010010100101010000000010101000010000010101000010000010000000000001001000000000100101000100010010000100101001000100010100100010010000010101010010100010100010010000010000010010001001010001000100100001000010010001000101001000100100000100000100100010000010100101010000000100101010010100010001001000010010100100010001010010000001000001000001000000100000100101010100000100001010000100000001010010100100101001000100010100100000010010010010011000001001001001010100000001001010000000001000010000101001001010010001000101001000000100100100100110010010010010010001001010010010100101000000000000101000010000000101000000010010000001001001001001100100100100000000010010100010101001010010010000101010010000000101010010000000100010010000010010010000001001010000000100101000100010010000100101001000100100000101010000100000101010100100000100000000000010010000010001001010001000100100001001010010001000100001000100100100100010100001010100000100101010100100100100010010100010001001000010010100100010001010010001001000001000001001010100000001001010100000001001010000101002001010010000100101001000100010100100000010000010010010000001000001001010100000001000010000001000000010100101001001010010001000101001001000100100100100110000010010010010101001010010000100001000010000100001010010010020000000000000000020001000000000000000000000002000000000000000000000000000000100000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000020000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000200000000000000000000000002000000000000000000000000000000000020000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000010000200000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000100000000000000000200000000000000000000000002000000000000000000000000000000000020000000200000000000000000000000000002000000000000200000000000020000000000000000000000000000000000000000000000000000000000000000000000000000020000000002000000000200000000000000000000000000000000000000000000000000000000001000000000000000000200000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000000000000200000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000100000200000000000000000000000002000000000200000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000001000000000000000000000000002000000000000002000000000002000000000000000000000000200200000000000000000000000000000000000001000000000000000000000000000000000000000000000002000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000200000000000000000000000100000010100000000000000000000000100000000200000000000000000000020000000000000000000000200000000000000000000000000000000000000000200000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000002000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000200000000000000000000000000010000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000020000000000000000000000000000000000000000100000000001000000000000000000000000000000000200000000000200000000000000000000000000000000000000000000000000000000002000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000100000020000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000010000000000000010000002000000000002000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000001000000002000000000000002000000000000000000000000000000000000000000000000000000220000000010000020000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201000020000000200000000000000000000000001000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000200010000000000000000000000000000000000100000000000000100000000000000000000000000000000000000000002000100000000000000000000000000010000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000002000000000000000100000000000000000000000000000000000000000200000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000000020000020000000000000020000000000000000000000000000200000000000020000000000000000000000000000000000000000000001000000000000000000000000000000020000000000000000000200000000000000000000000000000000000000000000010000000000000000000000000000000200000020000000000000000000000000200000000000000000000000000000000000000000000000002000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000100000000000000000020000000000002000000000000002000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000002000000000002000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000100000000000000000000000000000000000000000000000"; + + 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; + double 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) { + double[][] ob = XL1; + int obl = ob[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 = ob.length; i < x; i++, tn *= t) { + double[] f = ob[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 t, v = 628.3319653318; + 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 t, v = 7771.37714500204; + 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 msaLonT2(double w) { + double t, v = 7771.37714500204; + t = (w + 1.08472) / v; + double l, 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; + 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 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 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 += Solar.J2000; + 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) * Math.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 -= Solar.J2000; + } else if (jd >= f2 && jd < f3) { + d = Math.floor(shuoLow(Math.floor((jd + pc - 2451551) / 29.5306) * Math.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; + } +} diff --git a/src/main/java/com/nlf/calendar/util/SolarUtil.java b/src/main/java/com/nlf/calendar/util/SolarUtil.java index dc9ab24..5150aac 100644 --- a/src/main/java/com/nlf/calendar/util/SolarUtil.java +++ b/src/main/java/com/nlf/calendar/util/SolarUtil.java @@ -3,17 +3,11 @@ package com.nlf.calendar.util; import java.util.*; /** - * 阳历工具,基准日期为1901年1月1日,对应农历1900年十一月十一 + * 阳历工具 * * @author 6tail */ public class SolarUtil{ - /** 阳历基准年 */ - public static final int BASE_YEAR = 1901; - /** 阳历基准月 */ - public static final int BASE_MONTH = 1; - /** 阳历基准日 */ - public static final int BASE_DAY = 1; /** 星期*/ public static final String[] WEEK = {"日","一","二","三","四","五","六"}; /** 每月天数 */ @@ -132,17 +126,7 @@ public class SolarUtil{ * @return true/false 闰年/非闰年 */ public static boolean isLeapYear(int year){ - boolean leap = false; - if(year%4==0){ - leap = true; - } - if(year%100==0){ - leap = false; - } - if(year%400==0){ - leap = true; - } - return leap; + return (year%4 == 0 && year%100 != 0) || (year%400 == 0); } /** @@ -170,6 +154,7 @@ public class SolarUtil{ * @param start 星期几作为一周的开始,1234560分别代表星期一至星期天 * @return 周数 */ + @SuppressWarnings("MagicConstant") public static int getWeeksOfMonth(int year,int month,int start){ int days = getDaysOfMonth(year,month); Calendar c = Calendar.getInstance(); diff --git a/src/test/java/sample/YearTest.java b/src/test/java/sample/YearTest.java index 38615c2..cd2ab1a 100644 --- a/src/test/java/sample/YearTest.java +++ b/src/test/java/sample/YearTest.java @@ -23,22 +23,21 @@ public class YearTest { for(Solar d:m.getDays()){ //获取阴历 Lunar lunar = d.getLunar(); - StringBuilder s = new StringBuilder(); - s.append(d.getDay()<10?"0":""); - s.append(d.getDay()); - s.append(" "); - s.append(lunar.getMonthInChinese()); - s.append("月"); - s.append(lunar.getDayInChinese()); - s.append(" "); - s.append("星期"); - s.append(d.getWeekInChinese()); - s.append(" "); - s.append(d.getFestivals()); - s.append(lunar.getFestivals()); - s.append(lunar.getJie()); - s.append(lunar.getQi()); - System.out.println(s.toString()); + String s = (d.getDay() < 10 ? "0" : "") + + d.getDay() + + " " + + lunar.getMonthInChinese() + + "月" + + lunar.getDayInChinese() + + " " + + "星期" + + d.getWeekInChinese() + + " " + + d.getFestivals() + + lunar.getFestivals() + + lunar.getJie() + + lunar.getQi(); + System.out.println(s); } } } diff --git a/src/test/java/test/BaZiTest.java b/src/test/java/test/BaZiTest.java index 0c98412..31570f4 100644 --- a/src/test/java/test/BaZiTest.java +++ b/src/test/java/test/BaZiTest.java @@ -6,6 +6,8 @@ import com.nlf.calendar.Solar; import org.junit.Assert; import org.junit.Test; +import java.util.List; + /** * 八字测试 */ @@ -218,4 +220,14 @@ public class BaZiTest { Assert.assertEquals("身宫", "壬午", lunar.getEightChar().getShenGong()); } + @Test + public void testBaZi2Solar() { + Solar solar = Solar.fromYmdHms(2027,1,27,12,0,0); + System.out.println(solar.getLunar().getEightChar().toString()); + List l = Solar.fromBaZi("丙午","辛丑","丙午","甲午"); + for(Solar s:l){ + System.out.println(s.toFullString()); + } + } + } diff --git a/src/test/java/test/GanZhiTest.java b/src/test/java/test/GanZhiTest.java index cd43a0d..482519d 100644 --- a/src/test/java/test/GanZhiTest.java +++ b/src/test/java/test/GanZhiTest.java @@ -196,4 +196,128 @@ public class GanZhiTest { Assert.assertEquals("癸巳",lunar.getMonthInGanZhiExact()); } + @Test + public void test1() { + Solar solar = new Solar(1996, 1, 16); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬子",lunar.getDayInGanZhi()); + } + + @Test + public void test2() { + Solar solar = new Solar(1997, 2, 16); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("己丑",lunar.getDayInGanZhi()); + } + + @Test + public void test3() { + Solar solar = new Solar(1998, 3, 16); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬戌",lunar.getDayInGanZhi()); + } + + @Test + public void test4() { + Solar solar = new Solar(1999, 4, 16); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("戊戌",lunar.getDayInGanZhi()); + } + + @Test + public void test5() { + Solar solar = new Solar(2000, 7, 16); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("乙亥",lunar.getDayInGanZhi()); + } + + @Test + public void test6() { + Solar solar = new Solar(2000, 1, 6); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("癸亥",lunar.getDayInGanZhi()); + } + + @Test + public void test7() { + Solar solar = new Solar(2000, 1, 9); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("丙寅",lunar.getDayInGanZhi()); + } + + @Test + public void test8() { + Solar solar = new Solar(2000, 2, 2); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("庚寅",lunar.getDayInGanZhi()); + } + + @Test + public void test9() { + Solar solar = new Solar(2012, 8, 5); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("戊戌",lunar.getDayInGanZhi()); + } + + @Test + public void test10() { + Solar solar = new Solar(2012, 9, 20); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬辰",lunar.getYearInGanZhi()); + Assert.assertEquals("己酉",lunar.getMonthInGanZhi()); + Assert.assertEquals("甲申",lunar.getDayInGanZhi()); + } + + @Test + public void test11() { + Solar solar = new Solar(2012, 10, 20); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬辰",lunar.getYearInGanZhi()); + Assert.assertEquals("庚戌",lunar.getMonthInGanZhi()); + Assert.assertEquals("甲寅",lunar.getDayInGanZhi()); + } + + @Test + public void test12() { + Solar solar = new Solar(2012, 11, 20); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬辰",lunar.getYearInGanZhi()); + Assert.assertEquals("辛亥",lunar.getMonthInGanZhi()); + Assert.assertEquals("乙酉",lunar.getDayInGanZhi()); + } + + @Test + public void test13() { + Solar solar = new Solar(2012, 12, 20); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬辰",lunar.getYearInGanZhi()); + Assert.assertEquals("壬子",lunar.getMonthInGanZhi()); + Assert.assertEquals("乙卯",lunar.getDayInGanZhi()); + } + + @Test + public void test14() { + Solar solar = new Solar(2012, 12, 27); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("壬辰",lunar.getYearInGanZhi()); + Assert.assertEquals("壬子",lunar.getMonthInGanZhi()); + Assert.assertEquals("壬戌",lunar.getDayInGanZhi()); + } + + @Test + public void test15() { + Solar solar = new Solar(1988, 2, 15); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("丁卯",lunar.getYearInGanZhi()); + } + + @Test + public void test16() { + Solar solar = new Solar(1988, 2, 15, 23, 30,0); + Lunar lunar = solar.getLunar(); + Assert.assertEquals("丁卯",lunar.getYearInGanZhi()); + Assert.assertEquals("戊辰",lunar.getYearInGanZhiByLiChun()); + Assert.assertEquals("戊辰",lunar.getYearInGanZhiExact()); + } + } diff --git a/src/test/java/test/LunarTest.java b/src/test/java/test/LunarTest.java index 7bc8048..475e4a0 100644 --- a/src/test/java/test/LunarTest.java +++ b/src/test/java/test/LunarTest.java @@ -21,11 +21,54 @@ public class LunarTest { Assert.assertEquals("2019-05-01 00:00:00 星期三 (劳动节) 金牛座",date.getSolar().toFullString()); } + @Test + public void test1(){ + Solar solar = new Solar(1,1,1,12,0,0); + Assert.assertEquals("〇年冬月十八",solar.getLunar().toString()); + } + + @Test + public void test2(){ + Solar solar = new Solar(9999,12,31,12,0,0); + Assert.assertEquals("九九九九年腊月初二",solar.getLunar().toString()); + } + + @Test + public void test3(){ + Lunar lunar = new Lunar(0,11,18,12,0,0); + Assert.assertEquals("0001-01-01",lunar.getSolar().toString()); + } + + @Test + public void test4(){ + Lunar lunar = new Lunar(9999,12,2,12,0,0); + Assert.assertEquals("9999-12-31",lunar.getSolar().toString()); + } + + @Test + public void test5(){ + Lunar lunar = new Lunar(1905,1,1,12,0,0); + Assert.assertEquals("1905-02-04",lunar.getSolar().toString()); + } + + @Test + public void test6(){ + Lunar lunar = new Lunar(2038,12,29,12,0,0); + Assert.assertEquals("2039-01-23",lunar.getSolar().toString()); + } + + @Test + public void test7(){ + Lunar lunar = new Lunar(2020,-4,2,13,0,0); + Assert.assertEquals("二〇二〇年闰四月初二",lunar.toString()); + Assert.assertEquals("2020-05-24",lunar.getSolar().toString()); + } + @Test public void testNext(){ Solar solar = new Solar(2020,1,10,12,0,0); Lunar lunar = solar.getLunar(); - for(int i=-500;i<500;i++){ + for(int i=-50;i<50;i++){ Assert.assertEquals("推移天数:"+i,solar.next(i).getLunar().toFullString(),lunar.next(i).toFullString()); } } diff --git a/src/test/java/test/SolarTest.java b/src/test/java/test/SolarTest.java index 3bd6b59..7ee4e2c 100644 --- a/src/test/java/test/SolarTest.java +++ b/src/test/java/test/SolarTest.java @@ -20,6 +20,12 @@ public class SolarTest { Assert.assertEquals("二〇一九年三月廿七 己亥(猪)年 戊辰(龙)月 戊戌(狗)日 子(鼠)时 纳音[平地木 大林木 平地木 桑柘木] 星期三 (七殿泰山王诞) 西方白虎 星宿[参水猿](吉) 彭祖百忌[戊不受田田主不祥 戌不吃犬作怪上床] 喜神方位[巽](东南) 阳贵神方位[艮](东北) 阴贵神方位[坤](西南) 福神方位[坎](正北) 财神方位[坎](正北) 冲[(壬辰)龙] 煞[北]",date.getLunar().toFullString()); } + @Test + public void test1(){ + Solar solar = new Solar(2020,5,24,13,0,0); + Assert.assertEquals("二〇二〇年闰四月初二",solar.getLunar().toString()); + } + @Test public void testNext(){ Solar date = new Solar(2020,1,23); diff --git a/src/test/java/test/XingZuoTest.java b/src/test/java/test/XingZuoTest.java index 9d616b8..938fb13 100644 --- a/src/test/java/test/XingZuoTest.java +++ b/src/test/java/test/XingZuoTest.java @@ -5,7 +5,7 @@ import org.junit.Assert; import org.junit.Test; /** - * 阳历测试 + * 星座测试 * * @author 6tail */ diff --git a/src/test/java/test/YunTest.java b/src/test/java/test/YunTest.java new file mode 100644 index 0000000..9142ef2 --- /dev/null +++ b/src/test/java/test/YunTest.java @@ -0,0 +1,27 @@ +package test; + +import com.nlf.calendar.EightChar; +import com.nlf.calendar.Lunar; +import com.nlf.calendar.Solar; +import com.nlf.calendar.eightchar.Yun; +import org.junit.Assert; +import org.junit.Test; + +/** + * 起运测试 + */ +public class YunTest { + + @Test + public void test1() { + Solar solar = new Solar(1981, 1, 29, 23, 37, 0); + Lunar lunar = solar.getLunar(); + EightChar eightChar = lunar.getEightChar(); + Yun yun = eightChar.getYun(0); + Assert.assertEquals("起运年数", 8, yun.getStartYear()); + Assert.assertEquals("起运月数", 0, yun.getStartMonth()); + Assert.assertEquals("起运天数", 20, yun.getStartDay()); + Assert.assertEquals("起运阳历", "1989-02-18", yun.getStartSolar().toYmd()); + } + +}