高分悬赏:编写一个程序,将当前的年月日转换成农历的年月日,其中年份要用天干地支表示
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))); } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥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 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看