java 农历的编写保存数据批量插入到数据库中

java 农历的编写保存数据批量插入到数据库中

1.阴历转农历的工具类
public class Nongli {

   private static int monCyl, dayCyl, yearCyl;
   private static int year, month, day;
   private static boolean isLeap;
   private static String solarTerms = "";   //二十四节气
   private static Calendar offDate = Calendar.getInstance();
   private static int[] lunarInfo = { 0x04bd8, 0x04ae0, 0x0a570, 0x054d5,
           0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0,
           0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2,
           0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40,
           0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0,
           0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7,
           0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0,
           0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355,
           0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,
           0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263,
           0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0,
           0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6, 0x095b0,
           0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46,
           0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50,
           0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, 0x0d954,
           0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0,
           0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0,
           0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50,
           0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,
           0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6,
           0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2, 0x049b0,
           0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };
   private static int[] solarMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
           30, 31 };
   private static String[] Gan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛",
           "壬", "癸" };
   private static String[] Zhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未",
           "申", "酉", "戌", "亥" };
   private static String[] Animals = { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊",
           "猴", "鸡", "狗", "猪" };
   private static int[] sTermInfo = { 0, 21208, 42467, 63836, 85337, 107014,
           128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989,
           308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224,
           483532, 504758 };
   private static String[] nStr1 = { "日", "一", "二", "三", "四", "五", "六", "七",
           "八", "九", "十" };
   private static String[] nStr2 = { "初", "十", "廿", "卅", "" };
   private static String[] monthNong = { "正", "正", "二", "三", "四", "五", "六",
           "七", "八", "九", "十", "十一", "十二" };
   private static String[] yearName = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
           "柒", "捌", "玖" };
   private Object LogFactory;

   private static String[] SolarTerm =
           { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至",
                   "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪",
                   "冬至" };


   final static long[] STermInfo = new long[] { 0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551,
           218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532,
           504758 };

   // ===== 某年的第n个节气为几日(从0小寒起算)
   final private static int sTerm(int y, int n) {


       offDate.set(1900, 0, 6, 2, 5, 0);
       long temp = offDate.getTime().getTime();
       offDate.setTime(new Date((long) ((31556925974.7 * (y - 1900) + STermInfo[n] * 60000L) + temp)));


       return offDate.get(Calendar.DAY_OF_MONTH);
   }

   // ******************计算节气**********//
   public static String getSolarTerms(int y,int m,int d){
       if (d == sTerm(y, (m - 1) * 2))
           solarTerms = SolarTerm[(m - 1) * 2];
       else if (d == sTerm(y, (m - 1) * 2 + 1))
           solarTerms = SolarTerm[(m - 1) * 2 + 1];
       else
           solarTerms = "";
       return solarTerms;
   }



   // ====================================== 传回农历 y年的总天数
   private static int lYearDays(int y) {
       int i;
       int sum = 348; // 29*12
       for (i = 0x8000; i > 0x8; i >>= 1) {
           sum += (lunarInfo[y - 1900] & i) == 0 ? 0 : 1; // 大月+1天
       }
       return (sum + leapDays(y)); // +闰月的天数
   }

   // ======================================传回农历y年闰月的天数
   private static int leapDays(int y) {
       if (leapMonth(y) != 0) {
           return ((lunarInfo[y - 1900] & 0x10000) == 0 ? 29 : 30);
       } else {
           return (0);
       }
   }

   // ====================================== 传回农历 y 年闰哪个月 1-12 , 没 闰传回 0
   private static int leapMonth(int y) {
       return (lunarInfo[y - 1900] & 0xf);
   }

   // ====================================== 传回农历 y 年 m 月的总天数
   private static int monthDays(int y, int m) {
       return ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0 ? 29 : 30);
   }

   // ====================================== 算出农历,传入日期物件,传回农历日期物件
   // 该物件属性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
   private static void Lunar1(Date objDate) {
       int i, leap = 0, temp = 0;
       Calendar cl = Calendar.getInstance();
       cl.set(1900, 0, 31); // 1900-01-31是农历1900年正月初一
       Date baseDate = cl.getTime();
       // 1900-01-31是农历1900年正月初一
       int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000);
       // 天 数 (86400000=24*60*60*1000)
       dayCyl = offset + 40; // 1899-12-21 是农历 1899 年腊月甲子日
       monCyl = 14; // 1898-10-01 是农历甲子月
       // 得到年数
       for (i = 1900; i < 2050 && offset > 0; i++) {
           temp = lYearDays(i); // 农历每年天数
           offset -= temp;
           monCyl += 12;
       }
       if (offset < 0) {
           offset += temp;
           i--;
           monCyl -= 12;
       }
       year = i; // 农历年份
       yearCyl = i - 1864; // 1864 年是甲子年
       leap = leapMonth(i); // 闰哪个月
       isLeap = false;
       for (i = 1; i < 13 && offset > 0; i++) {
           // 闰月
           if (leap > 0 && i == (leap + 1) && isLeap == false) {
               --i;
               isLeap = true;
               temp = leapDays(year);
           } else {
               temp = monthDays(year, i);
           }
           // 解除闰月
           if (isLeap == true && i == (leap + 1)) {
               isLeap = false;
           }
           offset -= temp;
           if (isLeap == false) {
               monCyl++;
           }
       }
       if (offset == 0 && leap > 0 && i == leap + 1) {
           if (isLeap) {
               isLeap = false;
           } else {
               isLeap = true;
               --i;
               --monCyl;
           }
       }
       if (offset < 0) {
           offset += temp;
           --i;
           --monCyl;
       }
       month = i; // 农历月份
       day = offset + 1; // 农历天份
   }

   private static int getYear() {
       return (year);
   }

   private static int getMonth() {
       return (month);
   }

   private static int getDay() {
       return (day);
   }

   private static int getMonCyl() {
       return (monCyl);
   }

   private static int getYearCyl() {
       return (yearCyl);
   }

   private static int getDayCyl() {
       return (dayCyl);
   }

   private static boolean getIsLeap() {
       return (isLeap);
   }

   // ============================== 传入 offset 传回干支 , 0= 甲子
   private static String cyclical(int num) {
       return (Gan[num % 10] + Zhi[num % 12]);
   }

   // ====================== 中文日期
   private static String cDay(int d) {
       String s;
       switch (d) {
           case 10:
               s = "初十";
               break;
           case 20:
               s = "二十";
               break;
           case 30:
               s = "三十";
               break;
           default:
               s = nStr2[(int) (d / 10)];// 取商
               s += nStr1[d % 10];// 取余
       }
       return (s);
   }

   private static String cYear(int y) {
       String s = " ";
       int d;
       while (y > 0) {
           d = y % 10;
           y = (y - d) / 10;
           s = yearName[d] + s;
       }
       return (s);
   }

   public static Holiday getLunar(String year, String month, String day) {
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
       Date sDObj=null;
       try {
            sDObj=dateFormat.parse("2019-01-01");
       }catch (Exception e){
           e.printStackTrace();
       }


       String s;
       int SY, SM, SD;
       int sy;
       SY = Integer.parseInt(year);
       SM = Integer.parseInt(month);
       SD = Integer.parseInt(day);
       sy = (SY - 4) % 12;
       Calendar cl = Calendar.getInstance();
      cl.setTime(sDObj);
       cl.set(SY, SM - 1, SD+1);
       sDObj = cl.getTime();
       // 日期
       Lunar1(sDObj); // 农历
       s =cYear(getYear()) + "年" + " ";
       s += (getIsLeap() ? "闰" : "") + monthNong[getMonth()] + "月"
               + (monthDays(getYear(), getMonth()) == 29 ? "小" : "大");
       s += cDay(getDay()) + " ";
       String solarTerms = Nongli.getSolarTerms(cl.get(Calendar.YEAR), cl.get(Calendar.MONTH) + 1, cl.get(Calendar.DAY_OF_MONTH));

       s = cyclical(getYearCyl()) + "年" + cyclical(getMonCyl()) + "月"
               + cyclical(getDayCyl()) + "日"+cDay(getDay())+solarTerms;

      // System.out.println(solarTerms);
       Holiday holiday=new Holiday();
       holiday.setLunarYear(cyclical(getYearCyl())+"年");
       holiday.setLunarMonth(cyclical(getMonCyl())+"月");
       holiday.setLunarDay(cyclical(getDayCyl())+"日");
       holiday.setLunarDesc(cDay(getDay()));
       holiday.setSolarTerms(solarTerms);
       System.out.println(holiday.getLunarYear()+" "+holiday.getLunarMonth()+"  "+holiday.getLunarDay()+"   "+holiday.getLunarDesc()
       +holiday.getSolarTerms());
       return holiday;
   }



   public static void main(String[] args){
       System.out.println(getLunar("1990", "8", "26"));
       System.out.println(getLunar("2008", "6", "8"));
       System.out.println(getLunar("2009", "4", "3"));
       System.out.println(getLunar("2019", "01", "02"));
       System.out.println("-------------------------------------");


   }

Service层

   /**
     * 获取指定年份的星期六和星期日的日期的集合
     */
    @Transactional
    public List<Holiday> getDefaultHoliday(int year){

        Date date=new Date();
        // 该年的第一天
        Calendar firstDate = Calendar.getInstance();
        {
            firstDate.setTime(date);
            firstDate.set(Calendar.YEAR, year);
            firstDate.set(Calendar.MONTH, 0);
            firstDate.set(Calendar.DAY_OF_MONTH, 1);
        }

       List<Holiday> holidayList=new ArrayList<>();

        String showDate = null;
        boolean holiday_flag=false;  //是否休假
        // 得到所有的星期六和星期天
        for (int i = 1; i <= 12; i++) {
            while (firstDate.get(Calendar.MONTH) + 1 == i) {

                showDate = firstDate.get(Calendar.YEAR) + "-" + i + "-" + firstDate.get(Calendar.DAY_OF_MONTH);

                String[] dateArr = showDate.split("-");
                if (dateArr[1].length() == 1) {
                    dateArr[1] = "0" + dateArr[1];
                }
                if (dateArr[2].length() == 1) {
                    dateArr[2] = "0" + dateArr[2];
                }

                //每年的农历  月  日
                Holiday nongli=Nongli.getLunar(dateArr[0],dateArr[1],dateArr[2]);

                String newDate = dateArr[0] + "-" + dateArr[1] + "-" + dateArr[2];

                String dayName = "工作日";
                if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
                    dayName = "星期一";
                    holiday_flag = false;
                } else if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
                    dayName = "星期二";
                    holiday_flag = false;
                } else if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) {
                    dayName = "星期三";
                    holiday_flag = false;
                } else if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
                    dayName = "星期四";
                    holiday_flag = false;
                } else if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
                    dayName = "星期五";
                    holiday_flag = false;
                } else if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                    dayName = "星期六";
                    holiday_flag = true;
                } else if (firstDate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                    dayName = "星期日";
                    holiday_flag = true;
                }

                nongli.setCode(showDate);
                nongli.setWeek(dayName);
                nongli.setMonthDays(Integer.parseInt(dateArr[2]));
                nongli.setHolidayDay(holiday_flag);
             //   System.out.println("YYY   "+nongli.getCode()+"   "+nongli.getLunarYear()+"  "+nongli.getLunarMonth()+"  "+nongli.getLunarDay());

                holidayList.add(nongli);

                firstDate.set(Calendar.DAY_OF_MONTH, firstDate.get(Calendar.DAY_OF_MONTH) + 1);
            }
        }


        return holidayList;
    }

    public static void main(String[] args) {
        HolidayService service=new HolidayService();
        service.autoYearsInfo("2018");
    }

controller层

 @RequestMapping("/findbymonth")
    public List<HolidayVO> findByMonth(@RequestParam("month") String month) {

        month = Preconditions.checkNotBlank(month);

        List<Holiday> holidayList = this.service.findByMonth(month);

        List<HolidayVO> voList = this.converter.do2vo(holidayList);

        return voList;
    }

数据库展示

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值