## 疑难解答 【问】为什么我的java代码日期转阴历,干支总是错的? 你使用了SimpleDateFormat来将字符串转换为Date类型? 用SimpleDateFormat来将北京时间转换为日期,你以为转出来的是东八区(GMT+8),实际上SimpleDateFormat是个坑货,默认情况下你会得到一个东九区(GMT+9)的日期,这就有1个小时的偏差。 举个栗子:当你使用2021-01-01来转换的时候,想得到2021-01-01 00:00:00的北京时间,实际上,你得到了2020-12-31 23:00:00的北京时间。 解决办法有二(任选其一均可): 1. 使用当地时区和当地时间。 2. 统一使用GMT+8的时区和时间,代码示例: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // 关键是下边这一行 format.setTimeZone(TimeZone.getTimeZone("GMT+8")); Date date = format.parse("1986-08-14"); 总之,你一定要明确你的日期对象使用的时区,这一点非常重要! 【问】是否支持真太阳时? 暂不支持。 建议你使用平太阳时和真太阳时的转换代码,转换之后再传入lunar。 【问】为什么我用Lunar.fromYmd(2022, 1, 1)不是二〇二一年冬月廿九,而是二〇二二年正月初一? 太多人犯这个错误,自认为Lunar.fromYmd就是阳历转阴历。 建议多看文档,少猜测。Lunar.fromYmd是通过传入阴历年月日来初始化。 正确的阳历转阴历方式为: Solar.fromYmd(2022, 1, 1).getLunar(); 【问】为什么1582年10月少了10天? 我们现在使用的公历是格里历,这个历法的前身是儒略历法。儒略历法是罗马共和国于公元前45年1月1日起执行的,目的是取代旧罗马历法。在儒略历法中,一年被划分为12个月,单数月份31天,双数月份除2月份外30天,2月份平年29天,闰年30天,因此全年天数平年365天,闰年366天,年平均长度为365.25天。 而在天文学中,地球环绕太阳转动一圈的时间才是真正意义上的一天,周期约是365.2422天。因此,使用儒略历法之后,每年多算了11分钟14秒。由于误差不太大,头几年没什么关系,但是,一年又一年,误差累积起来,儒略历法就与实际的太阳年不合拍了。 到了16世纪,这个偏差已经达到了10天。于是在1582年,当时的教皇于1582年2月24日以教皇训令颁布,将1582年10月5日至14日抹掉,于是这10天就消失了,一去不复返。1582年10月4日过完了,第二天已经是10月15日了,于是历法又回到与太阳年同步。这便是今天世界上通用的历法——格里高利历,简称格里历,也就是我们说的公历。