dabocaiqq 2020-06-09 09:50 采纳率: 63.2%
浏览 160
已采纳

高分悬赏:编写一个程序,将当前的年月日转换成农历的年月日,其中年份要用天干地支表示

高分悬赏:编写一个程序,将当前的年月日转换成农历的年月日,其中年份要用天干地支表示

  • 写回答

1条回答 默认 最新

  • qybao 2020-06-09 16:24
    关注

    如果只是年份天干地支表示,单纯从天干10年一轮回,地支12年后一轮回来考虑的话,还是比较容易的
    如果要考虑闰月,立春等等因素的话,还是挺复杂的
    这里只是简单按轮回做了例子

    public class Sample {
        public static String[] tiangan = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
        public static String[] dizhi = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
        public static String getChineseYear(int year) { //获取干支年,严格来说要考虑是否跨越立春(因为立春前还属于农历前一年,立春后才是农历新的一年)
            year = year - 4; //一般规律:以公元4年是甲子年为参照,天干10年一轮回,地支12年1轮回
            return String.format("%s%s年", tiangan[year%10], dizhi[year%12]); //todo计算立春
        }
        public static String getChineseMonth(int year, int month) { //获取干支月,算法比较复杂(要考虑是否立春,是否有闰月),期待别的答题者答复吧
            int lichun = 2; //立春在2月,一般来说立春在1月,否则要计算月偏差
            month -= (lichun-1); //一般规律:年干*2+月=月干,正月从寅算起
            return String.format("%s%s月", tiangan[(((year-3)%10)*2+month-1)%10], dizhi[((month+2)-1)%12]); //todo计算立春,闰月
        }
        public static String getChineseDay(int year, int month, int date) { //获取干支日
            Calendar c = Calendar.getInstance();
            c.set(year, month, date);
            int days = 0; //一般规律:网上有按百年基数来总结公式(谷歌百度)
            if (year < 2000) { //1900-1999年
                days = ((year%100)+3)*5+55+(year%100-1)/4;
            } else { //2000-2099年
                days = (year%100+7)*5+15+(year%100+19)/4;
            }
            days += c.get(Calendar.DAY_OF_YEAR);
            return String.format("%s%s日", tiangan[(days%60+9)%10], dizhi[(days%60+11)%12]);
        }
        public static void main(String[] args) {
            Calendar c = Calendar.getInstance();
            System.out.printf("今天是%s%s%s\n", getChineseYear(c.get(Calendar.YEAR)), getChineseMonth(c.get(Calendar.YEAR), c.get(Calendar.MONTH)+1),
                    getChineseDay(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE)));
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看