JAVA_算法_中国公历算法&中国农历算法
公历和农历转换算法详解
公历和农历转换算法详解//C51写的公历转农历和星期#define uchar unsigned char#define uint unsigned int#include <intrins.h>/*公历年对应的农历数据,每年三字节,格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期*/code uchar year_code[597] = {0x04,0xAe,0x53, //1901 00x0A,0x57,0x48, //1902 30x55,0x26,0xBd, //1903 60x0d,0x26,0x50, //1904 90x0d,0x95,0x44, //1905 120x46,0xAA,0xB9, //1906 150x05,0x6A,0x4d, //1907 180x09,0xAd,0x42, //1908 210x24,0xAe,0xB6, //19090x04,0xAe,0x4A, //19100x6A,0x4d,0xBe, //19110x0A,0x4d,0x52, //19120x0d,0x25,0x46, //19130x5d,0x52,0xBA, //19140x0B,0x54,0x4e, //19150x0d,0x6A,0x43, //19160x29,0x6d,0x37, //19170x09,0x5B,0x4B, //19180x74,0x9B,0xC1, //19190x04,0x97,0x54, //19200x0A,0x4B,0x48, //19210x5B,0x25,0xBC, //19220x06,0xA5,0x50, //19230x06,0xd4,0x45, //19240x4A,0xdA,0xB8, //19250x02,0xB6,0x4d, //19260x09,0x57,0x42, //19270x24,0x97,0xB7, //19280x66,0x4B,0x3e, //1930 0x0d,0x4A,0x51, //1931 0x0e,0xA5,0x46, //1932 0x56,0xd4,0xBA, //1933 0x05,0xAd,0x4e, //1934 0x02,0xB6,0x44, //1935 0x39,0x37,0x38, //1936 0x09,0x2e,0x4B, //1937 0x7C,0x96,0xBf, //1938 0x0C,0x95,0x53, //1939 0x0d,0x4A,0x48, //1940 0x6d,0xA5,0x3B, //1941 0x0B,0x55,0x4f, //1942 0x05,0x6A,0x45, //1943 0x4A,0xAd,0xB9, //1944 0x02,0x5d,0x4d, //1945 0x09,0x2d,0x42, //1946 0x2C,0x95,0xB6, //1947 0x0A,0x95,0x4A, //1948 0x7B,0x4A,0xBd, //1949 0x06,0xCA,0x51, //1950 0x0B,0x55,0x46, //1951 0x55,0x5A,0xBB, //1952 0x04,0xdA,0x4e, //1953 0x0A,0x5B,0x43, //1954 0x35,0x2B,0xB8, //1955 0x05,0x2B,0x4C, //1956 0x8A,0x95,0x3f, //1957 0x0e,0x95,0x52, //1958 0x06,0xAA,0x48, //1959 0x7A,0xd5,0x3C, //1960 0x0A,0xB5,0x4f, //1961 0x04,0xB6,0x45, //1962 0x4A,0x57,0x39, //1963 0x0A,0x57,0x4d, //1964 0x05,0x26,0x42, //1965 0x3e,0x93,0x35, //1966 0x0d,0x95,0x49, //1967 0x75,0xAA,0xBe, //1968 0x05,0x6A,0x51, //1969 0x09,0x6d,0x46, //1970 0x54,0xAe,0xBB, //1971 0x04,0xAd,0x4f, //19720x4d,0x26,0xB7, //19740x0d,0x25,0x4B, //19750x8d,0x52,0xBf, //19760x0B,0x54,0x52, //19770x0B,0x6A,0x47, //19780x69,0x6d,0x3C, //19790x09,0x5B,0x50, //19800x04,0x9B,0x45, //19810x4A,0x4B,0xB9, //19820x0A,0x4B,0x4d, //19830xAB,0x25,0xC2, //19840x06,0xA5,0x54, //19850x06,0xd4,0x49, //19860x6A,0xdA,0x3d, //19870x0A,0xB6,0x51, //19880x09,0x37,0x46, //19890x54,0x97,0xBB, //19900x04,0x97,0x4f, //19910x06,0x4B,0x44, //19920x36,0xA5,0x37, //19930x0e,0xA5,0x4A, //19940x86,0xB2,0xBf, //19950x05,0xAC,0x53, //19960x0A,0xB6,0x47, //19970x59,0x36,0xBC, //19980x09,0x2e,0x50, //1999 294 0x0C,0x96,0x45, //2000 297 0x4d,0x4A,0xB8, //20010x0d,0x4A,0x4C, //20020x0d,0xA5,0x41, //20030x25,0xAA,0xB6, //20040x05,0x6A,0x49, //20050x7A,0xAd,0xBd, //20060x02,0x5d,0x52, //20070x09,0x2d,0x47, //20080x5C,0x95,0xBA, //20090x0A,0x95,0x4e, //20100x0B,0x4A,0x43, //20110x4B,0x55,0x37, //20120x0A,0xd5,0x4A, //20130x95,0x5A,0xBf, //20140x04,0xBA,0x53, //20150x0A,0x5B,0x48, //20160x05,0x2B,0x50, //2018 0x0A,0x93,0x45, //2019 0x47,0x4A,0xB9, //2020 0x06,0xAA,0x4C, //2021 0x0A,0xd5,0x41, //2022 0x24,0xdA,0xB6, //2023 0x04,0xB6,0x4A, //2024 0x69,0x57,0x3d, //2025 0x0A,0x4e,0x51, //2026 0x0d,0x26,0x46, //2027 0x5e,0x93,0x3A, //2028 0x0d,0x53,0x4d, //2029 0x05,0xAA,0x43, //2030 0x36,0xB5,0x37, //2031 0x09,0x6d,0x4B, //2032 0xB4,0xAe,0xBf, //2033 0x04,0xAd,0x53, //2034 0x0A,0x4d,0x48, //2035 0x6d,0x25,0xBC, //2036 0x0d,0x25,0x4f, //2037 0x0d,0x52,0x44, //2038 0x5d,0xAA,0x38, //2039 0x0B,0x5A,0x4C, //2040 0x05,0x6d,0x41, //2041 0x24,0xAd,0xB6, //2042 0x04,0x9B,0x4A, //2043 0x7A,0x4B,0xBe, //2044 0x0A,0x4B,0x51, //2045 0x0A,0xA5,0x46, //2046 0x5B,0x52,0xBA, //2047 0x06,0xd2,0x4e, //2048 0x0A,0xdA,0x42, //2049 0x35,0x5B,0x37, //2050 0x09,0x37,0x4B, //2051 0x84,0x97,0xC1, //2052 0x04,0x97,0x53, //2053 0x06,0x4B,0x48, //2054 0x66,0xA5,0x3C, //2055 0x0e,0xA5,0x4f, //2056 0x06,0xB2,0x44, //2057 0x4A,0xB6,0x38, //2058 0x0A,0xAe,0x4C, //2059 0x09,0x2e,0x42, //20600x0C,0x96,0x49, //20620x7d,0x4A,0xBd, //20630x0d,0x4A,0x51, //20640x0d,0xA5,0x45, //20650x55,0xAA,0xBA, //20660x05,0x6A,0x4e, //20670x0A,0x6d,0x43, //20680x45,0x2e,0xB7, //20690x05,0x2d,0x4B, //20700x8A,0x95,0xBf, //20710x0A,0x95,0x53, //20720x0B,0x4A,0x47, //20730x6B,0x55,0x3B, //20740x0A,0xd5,0x4f, //20750x05,0x5A,0x45, //20760x4A,0x5d,0x38, //20770x0A,0x5B,0x4C, //20780x05,0x2B,0x42, //20790x3A,0x93,0xB6, //20800x06,0x93,0x49, //20810x77,0x29,0xBd, //20820x06,0xAA,0x51, //20830x0A,0xd5,0x46, //20840x54,0xdA,0xBA, //20850x04,0xB6,0x4e, //20860x0A,0x57,0x43, //20870x45,0x27,0x38, //20880x0d,0x26,0x4A, //20890x8e,0x93,0x3e, //20900x0d,0x52,0x52, //20910x0d,0xAA,0x47, //20920x66,0xB5,0x3B, //20930x05,0x6d,0x4f, //20940x04,0xAe,0x45, //20950x4A,0x4e,0xB9, //20960x0A,0x4d,0x4C, //20970x0d,0x15,0x41, //20980x2d,0x92,0xB5, //2099};///月份数据表code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; code uint day_code2[3]={0x111,0x130,0x14e};/*调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据*/bit c_moon;data uchar year_moon,month_moon,day_moon,week;/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/bit get_moon_day(uchar month_p,uint table_addr){uchar temp;switch (month_p){case 1:{temp=year_code[table_addr]&0x08;if (temp==0)return(0);else return(1);}case 2:{temp=year_code[table_addr]&0x04;if (temp==0)return(0);else return(1);}case 3:{temp=year_code[table_addr]&0x02;if (temp==0)return(0);else return(1);}case 4:{temp=year_code[table_addr]&0x01;if (temp==0)return(0);else return(1);}case 5:{temp=year_code[table_addr+1]&0x80;if (temp==0) return(0);else return(1);}case 6:{temp=year_code[table_addr+1]&0x40;if (temp==0)return(0);else return(1);}case 7:{temp=year_code[table_addr+1]&0x20;if (temp==0)return(0);else return(1);}case 8:{temp=year_code[table_addr+1]&0x10;if (temp==0)return(0);else return(1);}case 9:{temp=year_code[table_addr+1]&0x08;if (temp==0)return(0);else return(1);}case 10:{temp=year_code[table_addr+1]&0x04;if (temp==0)return(0);else return(1);}case 11:{temp=year_code[table_addr+1]&0x02;if (temp==0)return(0);else return(1);}case 12:{temp=year_code[table_addr+1]&0x01;if (temp==0)return(0);else return(1);}case 13:{temp=year_code[table_addr+2]&0x80;if (temp==0)return(0);else return(1);}}}/*调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据*/void Conversion(bit c,uchar year,uchar month,uchar day){ //c=0 为21世纪,c=1 为19世纪输入输出数据均为BCD数据uchar temp1,temp2,temp3,month_p;uint temp4,table_addr;bit flag2,flag_y;temp1=year/16; //BCD->hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;temp1=day/16;temp2=day%16;day=temp1*10+temp2;//定位数据表地址if(c==0){table_addr=(year+0x64-1)*0x3;}else{table_addr=(year-1)*0x3;}//定位数据表地址完成//取当年春节所在的公历月份temp1=year_code[table_addr+2]&0x60;temp1=_cror_(temp1,5);//取当年春节所在的公历月份完成//取当年春节所在的公历日temp2=year_code[table_addr+2]&0x1f;//取当年春节所在的公历日完成// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月if(temp1==0x1){temp3=temp2-1;}else{temp3=temp2+0x1f-1;}// 计算当年春年离当年元旦的天数完成//计算公历日离当年元旦的天数,为了减少运算,用了两个表//day_code1[9],day_code2[3]//如果公历月在九月或前,天数会少于0xff,用表day_code1[9],//在九月后,天数大于0xff,用表day_code2[3]//如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1//如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1if (month<10){temp4=day_code1[month-1]+day-1;}else{temp4=day_code2[month-10]+day-1;}if ((month>0x2)&&(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1temp4+=1;}//计算公历日离当年元旦的天数完成//判断公历日在春节前还是春节后if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算temp4-=temp3;month=0x1;month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月flag2=get_moon_day(month_p,table_addr);//检查该农历月为大小还是小月,大月返回1,小月返回0flag_y=0;if(flag2==0)temp1=0x1d; //小月29天else temp1=0x1e; //大小30天temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月while(temp4>=temp1){temp4-=temp1;month_p+=1;if(month==temp2){flag_y=~flag_y;if(flag_y==0)month+=1;}else month+=1;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp4+1;}else{ //公历日在春节前使用下面代码进行运算temp3-=temp4;if (year==0x0){year=0x63;c=1;}else year-=1;table_addr-=0x3;month=0xc;temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4);if (temp2==0)month_p=0xc;elsemonth_p=0xd; ///*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/ flag_y=0;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;while(temp3>temp1){temp3-=temp1;month_p-=1;if(flag_y==0)month-=1;if(month==temp2)flag_y=~flag_y;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp1-temp3+1;}c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;year_moon=temp1|temp2;temp1=month/10;temp1=_crol_(temp1,4);temp2=month%10;month_moon=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;day_moon=temp1|temp2;}/*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)调用函数示例:Conver_week(c_sun,year_sun,month_sun,day_sun)如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪调用函数后,原有数据不变,读week得出阴历BCD数据*/code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表/*算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在闰年又不到3 月份上述之和要减一天再除7星期数为0*/void Conver_week(bit c,uchar year,uchar month,uchar day){//c=0 为21世纪,c=1 为19世纪输入输出数据均为BCD数据uchar temp1,temp2;temp1=year/16; //BCD->hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;temp1=day/16;temp2=day%16;day=temp1*10+temp2;if (c==0){year+=0x64;} //如果为21世纪,年份数加100temp1=year/0x4; //所过闰年数只算1900年之后的temp2=year+temp1;temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据temp2=temp2+day+table_week[month-1];if (year%0x4==0&&month<3)temp2-=1;week=temp2%0x7;}//testuchar c_sun,year_sun,month_sun,day_sun;void main(){c_sun=1;year_sun=0x2;month_sun=0x11;day_sun=0x3;Conver_week(c_sun,year_sun,month_sun,day_sun);Conversion(c_sun,year_sun,month_sun,day_sun);while(1);}算法一:公历转农历============================================================================ /*------------农历转换函数-----------*/char *GetDayOf(PSYSTEMTIME pSt){/*天干名称*/const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};/*地支名称*/const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};/*属相名称*/const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};/*农历日期名*/const char *cDayName[] = {"*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"};/*农历月份名*/const char *cMonName[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};/*公历每月前面的天数*/const int wMonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};/*农历数据*/const int wNongliData[100] = {2635,333387,1701,1748,267701,694,2391,133423,1175,396438 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402,400202,2901,1386,267611,605,2349,137515,2709,464533,1738,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,268949,3402,3493,133973,1386,464219,605,2349,334123,2709,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};static int wCurYear,wCurMonth,wCurDay;static int nTheDate,nIsEnd,m,k,n,i,nBit;TCHAR szNongli[30], szNongliDay[10],szShuXiang[10];/*---取当前公历年、月、日---*/wCurYear = pSt->wYear;wCurMonth = pSt->wMonth;wCurDay = pSt->wDay;/*---计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)---*/nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38;if((!(wCurYear % 4)) && (wCurMonth > 2))nTheDate = nTheDate + 1;/*--计算农历天干、地支、月、日---*/nIsEnd = 0;m = 0;while(nIsEnd != 1){if(wNongliData[m] < 4095)k = 11;elsek = 12;n = k;while(n>=0){//获取wNongliData(m)的第n个二进制位的值nBit = wNongliData[m];for(i=1;i<n+1;i++)nBit = nBit/2;nBit = nBit % 2;if (nTheDate <= (29 + nBit)){nIsEnd = 1;break;}nTheDate = nTheDate - 29 - nBit;n = n - 1;}if(nIsEnd)break;m = m + 1;}wCurYear = 1921 + m;wCurMonth = k - n + 1;wCurDay = nTheDate;if (k == 12){if (wCurMonth == wNongliData[m] / 65536 + 1)wCurMonth = 1 - wCurMonth;else if (wCurMonth > wNongliData[m] / 65536 + 1)wCurMonth = wCurMonth - 1;}/*--生成农历天干、地支、属相==> wNongli--*/wsprintf(szShuXiang,"%s",cShuXiang[((wCurYear - 4) % 60) % 12]);wsprintf(szNongli,"%s(%s%s)年",szShuXiang,cTianGan[((wCurYear - 4) % 60) % 10],cDiZhi[((wCurYear - 4) % 60) % 12]);/*--生成农历月、日==> wNongliDay--*/if (wCurMonth < 1)wsprintf(szNongliDay,"闰%s",cMonName[-1 * wCurMonth]);elsestrcpy(szNongliDay,cMonName[wCurMonth]);strcat(szNongliDay,"月");strcat(szNongliDay,cDayName[wCurDay]);return strcat(szNongli,szNongliDay);}============================================================================首先,我们要确定一个时刻,作为一天的起点(包括这个时刻)。
SpringBoot中_JAVA利用国密算法_实现内容的加密_解密
首先来看一下什么是国密算法:国密即国家密码局认定的国产密码算法,即商用密码。
国密主要有SM1,SM2,SM3,SM4。
密钥长度和分组长度均为128位。
1、SM1 为对称加密。
其加密强度与AES(高级加密标准,Advanced Encryption Standard)相当。
该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
2、SM2为非对称加密,基于ECC。
该算法已公开。
由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。
ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
3、SM3为消息摘要。
可以用MD5作为对比理解。
该算法已公开。
校验结果为256位。
4、SM4为无线局域网标准的分组数据算法。
对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
在很多地方还是会用到的,这里说一下这个:SM21.在pom.xml中引入依赖jar包:<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.58</version></dependency>2.然后来写一个工具类,用来生成国密的,公钥和私钥这个密码对.import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.security.*;import java.security.spec.ECGenParameterSpec;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Base64;/*** @author hulala* @Description 国密公私钥对工具类public class KeyUtils {/*** 生成国密公私钥对** @return* @throws Exception*/public static String[] generateSmKey() throws Exception {KeyPairGenerator keyPairGenerator = null;SecureRandom secureRandom = new SecureRandom();ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");keyPairGenerator = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());keyPairGenerator.initialize(sm2Spec);keyPairGenerator.initialize(sm2Spec, secureRandom);KeyPair keyPair = keyPairGenerator.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();//String[0] 公钥//String[1] 私钥String[] result = {new String(Base64.getEncoder().encode(publicKey.getEncoded())), new String(Base64.getEncoder().encode(privateKey.getEncoded())) };return result;}/*** 将Base64转码的公钥串,转化为公钥对象** @param publicKey* @return*/public static PublicKey createPublicKey(String publicKey) {PublicKey publickey = null;try {X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());publickey = keyFactory.generatePublic(publicKeySpec);} catch (Exception e) {e.printStackTrace();}return publickey;}/*** 将Base64转码的私钥串,转化为私钥对象** @param privateKey* @return*/public static PrivateKey createPrivateKey(String privateKey) {PrivateKey publickey = null;try {PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());publickey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);} catch (Exception e) {e.printStackTrace();}return publickey;}}3.根据公钥和私钥工具类,生成的密钥对,对数据,进行加密和解密操作import org.bouncycastle.asn1.gm.GMObjectIdentifiers;import org.bouncycastle.crypto.InvalidCipherTextException;import org.bouncycastle.crypto.engines.SM2Engine;import org.bouncycastle.crypto.params.ECDomainParameters;import org.bouncycastle.crypto.params.ECPrivateKeyParameters;import org.bouncycastle.crypto.params.ECPublicKeyParameters;import org.bouncycastle.crypto.params.ParametersWithRandom;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.jce.spec.ECParameterSpec;import java.security.*;/*** @author hulala* @Description SM2实现工具类*/public class Sm2Util {static {Security.addProvider(new BouncyCastleProvider());}/*** 根据publicKey对原始数据data,使用SM2加密** @param data* @param publicKey* @return*/public static byte[] encrypt(byte[] data, PublicKey publicKey) {ECPublicKeyParameters localECPublicKeyParameters = null;if (publicKey instanceof BCECPublicKey) {BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey;ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),localECParameterSpec.getG(), localECParameterSpec.getN());localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), localECDomainParameters);}SM2Engine localSM2Engine = new SM2Engine();localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom()));byte[] arrayOfByte2;try {arrayOfByte2 = localSM2Engine.processBlock(data, 0, data.length);return arrayOfByte2;} catch (InvalidCipherTextException e) {e.printStackTrace();return null;}}/*** 根据privateKey对加密数据encodedata,使用SM2解密** @param encodedata* @param privateKey* @return*/public static byte[] decrypt(byte[] encodedata, PrivateKey privateKey) {SM2Engine localSM2Engine = new SM2Engine();BCECPrivateKey sm2PriK = (BCECPrivateKey) privateKey;ECParameterSpec localECParameterSpec = sm2PriK.getParameters();ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),localECParameterSpec.getG(), localECParameterSpec.getN());ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(sm2PriK.getD(),localECDomainParameters);localSM2Engine.init(false, localECPrivateKeyParameters);try {byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedata, 0, encodedata.length);return arrayOfByte3;} catch (InvalidCipherTextException e) {e.printStackTrace();return null;}}/*** 私钥签名** @param data* @param privateKey* @return* @throws Exception*/public static byte[] signByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception { Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initSign(privateKey);sig.update(data);byte[] ret = sig.sign();return ret;}/*** 公钥验签** @param data* @param publicKey* @param signature* @return* @throws Exception*/public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception {Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initVerify(publicKey);sig.update(data);boolean ret = sig.verify(signature);return ret;}}4.来测试一下,对数据进行加密解密import org.junit.Test;import java.util.Base64;/*** @author hulala* @Description Sm2Util 的测试类*/public class Sm2UtilTest {private String testStr = "wangjing";java.security.PublicKey publicKey = null;java.security.PrivateKey privateKey = null;@Testpublic void test() throws Exception {//生成公私钥对String[] keys = KeyUtils.generateSmKey();System.out.println("原始字符串:" + testStr);System.out.println("公钥:" + keys[0]);publicKey = KeyUtils.createPublicKey(keys[0]);System.out.println("私钥:" + keys[1]);privateKey = KeyUtils.createPrivateKey(keys[1]);System.out.println("");byte[] encrypt = Sm2Util.encrypt(testStr.getBytes(), publicKey);String encryptBase64Str = Base64.getEncoder().encodeToString(encrypt);System.out.println("加密数据:" + encryptBase64Str);byte[] decode = Base64.getDecoder().decode(encryptBase64Str);byte[] decrypt = Sm2Util.decrypt(decode, privateKey);System.out.println("解密数据:" + new String(decrypt));byte[] sign = Sm2Util.signByPrivateKey(testStr.getBytes(), privateKey);System.out.println("数据签名:" + Base64.getEncoder().encodeToString(sign));boolean b = Sm2Util.verifyByPublicKey(testStr.getBytes(), publicKey, sign);System.out.println("数据验签:" + b);}}5.这样就实现了利用国密,SM2进行加密解密了.。
java控制台输出万年历
import java.util.Scanner;//蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形):w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1//公式中的符号含义如下: c:世纪(年的高两位数); y:年(年的低两位数);//m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,//比如2005年1月1日要看作2004年的13月1日来计算); d:日; []代表取整,即只要整数部分。
//w:星期;w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四, 5-星期五,6-星期六//以2005年2月14日为例:c=20,y=4,m=14,d=14//w = 4 + [4/4] + [20/4] - 2*20 + [26*(14+1)/10] + 14 - 1 = 4 + 1 + 5 - 40 + 39 + 14 - 1 = 22//(除以7余1) 所以2005年2月14日是星期一。
public class PerpetualCalendarII {public static void main(String[] args) {// declare variable month,yearint month, monthDays = 0, year;int firstDayOfMonth, a, b, w;int count = 0;// declare flagboolean flag;Scanner sc = new Scanner(System.in);System.out.println("请输入年份:");year = sc.nextInt();System.out.println("请输入月份:");month = sc.nextInt();// judge year is leap year or notif ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { flag = true;} else {flag = false;}// get days of the monthswitch (month) {case 4:case 6:case 9:case 11:monthDays = 30;break;case 1:case 3:case 5:case 7:case 8:case 10:case 12:monthDays = 31;break;case 2:if (flag == true) {monthDays = 29;} else {monthDays = 28;}}// get the true yearif (month == 1) {month = 13;year -= 1;}if (month == 2) {month = 14;year -= 1;}// judge the firstDayOfMontha = year / 100;b = year % 100;// get the value of ww = b + (b / 4) + (a / 4) - 2 * a + 26 * (month + 1) / 10;if (w % 7 == 0) {firstDayOfMonth = 1;} else {firstDayOfMonth = w % 7;}System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");// output \tfor (int i = 0; i < firstDayOfMonth; i++) {System.out.print("\t");count++;}//loop daysfor (int i = 1; i <= monthDays; i++) {System.out.print(i + "\t");count++;if (count % 7 == 0) {System.out.println();}}}}。
java判断国家法定节假日的方法
java判断国家法定节假日的方法全文共四篇示例,供读者参考第一篇示例:Java是一种流行的编程语言,用于开发各种应用程序和系统。
在许多情况下,我们需要判断一个日期是否是国家法定的节假日。
这在许多应用程序中都是必须要考虑的一个问题,比如日历应用程序、假期提醒应用程序等等。
在本文中,我们将讨论如何使用Java编程语言来判断国家法定的节假日的方法。
一般来说,判断一个日期是否是节假日,需要先明确该国家的法定节假日的具体规定。
不同的国家有不同的法定节假日,可以是固定日期的,也可以是依据农历等进行计算的。
在此,我们以中国的法定节假日为例来说明如何判断一个日期是否是法定节假日。
我们需要定义中国的法定节假日的规定:1. 元旦:1月1日2. 春节:农历正月初一至正月十五3. 清明节:农历四月四日4. 劳动节:5月1日至5月3日5. 端午节:农历五月五日6. 中秋节:农历八月十五日7. 国庆节:10月1日至10月7日接下来,我们可以通过编写一个Java程序来判断一个日期是否是中国的法定节假日。
我们可以定义一个方法来判断一个日期是否是一个法定节假日,如下所示:```javapublic static boolean isHoliday(int year, int month, int day) {// 判断元旦if (month == 1 && day == 1) {return true;}// 判断春节// 农历春节的日期需要特殊计算,略...// 判断清明节if (month == 4 && day == 4) {return true;}// 判断劳动节if (month == 5 && day >= 1 && day <= 3) { return true;}// 判断端午节// 农历端午节的日期需要特殊计算,略...// 判断中秋节// 农历中秋节的日期需要特殊计算,略...// 判断国庆节if (month == 10 && day >= 1 && day <= 7) { return true;}return false;}```在上述代码中,我们定义了一个`isHoliday`方法,接收年、月、日三个参数,然后根据中国的法定节假日规定,判断该日期是否是法定节假日。
中国日历(公历+农历)算法
中国公历算法中国公历算法不是太难,关键是星期值的确定。
这里给出了简单算法:public static int dayOfWeek(int y, int m, int d) {int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次int ly = (y-1)/4; // 闰年次数ly = ly - (y-1)/100;ly = ly + (y-1)/400;int ry = y - 1 - ly; // 常年次数w = w + ry; // 常年星期值增一w = w + 2*ly; // 闰年星期值增二w = w + dayOfYear(y,m,d);w = (w-1)%7 + 1;return w;}中国农历算法根公历相比,中国农历的算法相当复杂。
我在网上找的算法之中, 的算法是最好的一个。
这个算法使用了大量的数据来确定农历月份和节气的分部,它仅实用于公历 1901 年到 2100 年之间的 200 年。
中国农历计算程式跟据 提供的算法,我写了下面这个程式:[HTML]/*** ChineseCalendarGB.java* Copyright (c) 1997-2002 by Dr. Herong Yang./* 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年*/import java.text.*;import java.util.*;class ChineseCalendarGB {private int gregorianYear;private int gregorianMonth;private int gregorianDate;private boolean isGregorianLeap;private int dayOfYear;private int dayOfWeek; // 周日一星期的第一天private int chineseYear;private int chineseMonth; // 负数表示闰月private int chineseDate;private int sectionalTerm;private int principleTerm;private static char[] daysInGregorianMonth ={31,28,31,30,31,30,31,31,30,31,30,31};private static String[] stemNames ={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};private static String[] branchNames ={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};private static String[] animalNames ={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};public static void main(String[] arg) {ChineseCalendarGB c = new ChineseCalendarGB();String cmd = "day";int y = 1901;int m = 1;int d = 1;if (arg.length>0) cmd = arg[0];if (arg.length>1) y = Integer.parseInt(arg[1]);if (arg.length>2) m = Integer.parseInt(arg);if (arg.length>3) d = Integer.parseInt(arg);c.setGregorian(y,m,d);puteChineseFields();puteSolarTerms();if (cmd.equalsIgnoreCase("year")) {String[] t = c.getYearTable();for (int i=0; i< FONT>} else if (cmd.equalsIgnoreCase("month")) {String[] t = c.getMonthTable();for (int i=0; i< FONT>} else {System.out.println(c.toString());}}public ChineseCalendarGB() {setGregorian(1901,1,1);}public void setGregorian(int y, int m, int d) {gregorianYear = y;gregorianMonth = m;gregorianDate = d;isGregorianLeap = isGregorianLeapYear(y);dayOfYear = dayOfYear(y,m,d);dayOfWeek = dayOfWeek(y,m,d);chineseYear = 0;chineseMonth = 0;chineseDate = 0;sectionalTerm = 0;principleTerm = 0;}public static boolean isGregorianLeapYear(int year) { boolean isLeap = false;if (year%4==0) isLeap = true;if (year%100==0) isLeap = false;if (year%400==0) isLeap = true;return isLeap;}public static int daysInGregorianMonth(int y, int m) {int d = daysInGregorianMonth[m-1];if (m==2 && isGregorianLeapYear(y)) d++; // 公历闰年二月多一天return d;}public static int dayOfYear(int y, int m, int d) {int c = 0;for (int i=1; i<>c = c + daysInGregorianMonth(y,i);}c = c + d;return c;}public static int dayOfWeek(int y, int m, int d) {int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次int ly = (y-1)/4; // 闰年次数ly = ly - (y-1)/100;ly = ly + (y-1)/400;int ry = y - 1 - ly; // 常年次数w = w + ry; // 常年星期值增一w = w + 2*ly; // 闰年星期值增二w = w + dayOfYear(y,m,d);w = (w-1)%7 + 1;return w;}private static char[] chineseMonths = {// 农历月份大小压缩表,两个字节表示一年。
js中国标准时间转换
js中国标准时间转换JavaScript中的时间操作是我们在日常开发中经常会遇到的需求,其中一个常见的需求就是将时间转换为中国标准时间。
在JavaScript中,我们可以通过一些简单的方法来实现这个功能。
接下来,我将向大家介绍一些常用的方法和技巧,帮助大家更好地理解和使用JavaScript中的时间转换功能。
首先,我们需要知道JavaScript中的Date对象是如何表示时间的。
Date对象表示的是从1970年1月1日00:00:00 UTC(协调世界时)开始经过的毫秒数。
这意味着,JavaScript中的时间是以UTC时间为基准的,而中国位于东八区,与UTC 时间相差8个小时。
因此,在将时间转换为中国标准时间时,我们需要考虑这个时差。
接下来,让我们来看一下如何将UTC时间转换为中国标准时间。
在JavaScript 中,我们可以使用Date对象的getTime()方法来获取从1970年1月1日以来经过的毫秒数,然后加上8个小时的时差,就可以得到中国标准时间的毫秒数。
接着,我们可以使用Date对象的setTime()方法来将这个毫秒数转换为中国标准时间的Date 对象。
除了手动计算时差外,JavaScript中还有一些内置的方法可以帮助我们进行时间转换。
例如,我们可以使用Date对象的toLocaleString()方法来将时间转换为本地时间格式,然后再将本地时间格式转换为中国标准时间。
另外,我们还可以使用第三方库如moment.js来简化时间操作,它提供了丰富的时间格式化和转换功能,可以大大简化我们的开发工作。
除了将UTC时间转换为中国标准时间外,我们还经常会遇到将字符串格式的时间转换为Date对象的需求。
在JavaScript中,我们可以使用Date对象的构造函数来将字符串格式的时间转换为Date对象。
例如,我们可以使用new Date('2022-01-01T00:00:00+08:00')来将字符串'2022-01-01T00:00:00+08:00'转换为中国标准时间的Date对象。
Java中的日期和时间类以及Calendar类用法详解
Java中的⽇期和时间类以及Calendar类⽤法详解Java⽇期和时间类简介Java 的⽇期和时间类位于 java.util 包中。
利⽤⽇期时间类提供的⽅法,可以获取当前的⽇期和时间,创建⽇期和时间参数,计算和⽐较时间。
Date 类Date 类是 Java 中的⽇期时间类,其构造⽅法⽐较多,下⾯是常⽤的两个:Date():使⽤当前的⽇期和时间初始化⼀个对象。
Date(long millisec):从1970年01⽉01⽇00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒。
如果运⾏ Java 程序的本地时区是北京时区(与格林威治时间相差 8 ⼩时),Date dt1=new Date(1000);,那么对象 dt1 就是1970年01⽉01⽇08时00分01秒。
请看⼀个显⽰⽇期时间的例⼦:import java.util.Date;public class Demo{public static void main(String args[]){Date da=new Date(); //创建时间对象System.out.println(da); //显⽰时间和⽇期long msec=da.getTime();System.out.println("从1970年1⽉1⽇0时到现在共有:" + msec + "毫秒");}}运⾏结果:Mon Feb 05 22:50:05 CST 2007从1970年1⽉1⽇0时到现在共有:1170687005390 毫秒⼀些⽐较常⽤的 Date 类⽅法:Date 对象表⽰时间的默认顺序是星期、⽉、⽇、⼩时、分、秒、年。
若需要修改时间显⽰的格式可以使⽤“SimpleDateFormat(String pattern)”⽅法。
例如,⽤不同的格式输出时间:import java.util.Date;import java.text.SimpleDateFormat;public class Demo{public static void main(String args[]){Date da=new Date();System.out.println(da);SimpleDateFormat ma1=new SimpleDateFormat("yyyy 年 MM ⽉ dd ⽇ E 北京时间");System.out.println(ma1.format(da));SimpleDateFormat ma2=new SimpleDateFormat("北京时间:yyyy 年 MM ⽉ dd ⽇ HH 时 mm 分 ss 秒");System.out.println(ma2.format(-1000));}}运⾏结果:Sun Jan 04 17:31:36 CST 20152015 年 01 ⽉ 04 ⽇星期⽇北京时间北京时间:1970 年 01 ⽉ 01 ⽇ 07 时 59 分 59 秒Calendar 类抽象类 Calendar 提供了⼀组⽅法,允许把以毫秒为单位的时间转换成⼀些有⽤的时间组成部分。
JAVA处理日期时间常用方法
JA V A处理日期时间常用方法:java.util.CalendarCalendar 类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期提供了一些方法。
瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间1970 年 1 月1 日的00:00:00。
000,格里高利历的偏移量.例:Calendar cal = Calendar。
getInstance(;//使用默认时区和语言环境获得一个日历。
cal。
add(Calendar.DAY_OF_MONTH, -1;//取当前日期的前一天。
cal。
add(Calendar。
DAY_OF_MONTH, +1;//取当前日期的后一天。
//通过格式化输出日期java.text.SimpleDateFormat format = new java.text。
SimpleDateFormat(”yyyy-MM—dd";System。
out.println("Today is:”+format。
format(Calendar.getInstance(.getTime (;System。
out.println("yesterday is:"+format.format(cal.getTime(;得到2007—12-25日期: Calendar calendar = new GregorianCalendar(2007,11, 25,0,0,0;Date date = calendar.getTime(;System。
out.println("2007 Christmasis:”+format.format(date;//java月份是从0—11,月份设置时要减1。
//GregorianCalendar构造方法参数依次为:年,月—1,日,时,分,秒。
js 农历算法原理
JavaScript中的农历算法主要依据中国农历的计算方法,包括以下几个关键部分:
1. 公历转农历:将公历日期(格里高利历)转换成农历日期。
这个过程涉及到格里高利历与农历的转换公式,包括农历年份、农历月份、农历日期等。
2. 农历日期计算:农历日期计算主要包括农历日期的天干地支、农历节气、农历干支纪年等。
通过这些信息,可以确定农历日期的一些特性,如是否是闰年、农历月份的天数等。
3. 农历月份计算:农历月份的计算涉及到农历月份的天数、农历闰月的规则等。
通过这些规则,可以计算出农历月份的天数和农历闰月的位置。
4. 农历年份计算:农历年份的计算主要涉及到农历年份的天干地支、农历年份与农历月份的关系等。
通过这些信息,可以确定农历年份的一些特性,如是否是闰年、农历年份的天数等。
5. 农历节气计算:农历节气是中国传统历法中的重要概念,用于指导农业生产、生活等。
通过农历节气的计算,可以确定农历日期对应的节气信息。
在JavaScript中,农历算法的实现主要通过编写相应的函数,将公历日期转换成农历日期,并根据农历日期进行相关的计算。
这些函数通常会使用一些变量存储农历年份、农历月份等信息,并根据这些信息进行相应的计算和处理。
公历转换农历及节气算法
公历转换农历及节气算法
一、公历转换农历算法
公历转换农历是一个计算机程序常用的算法,在一些时间场合中需要
用到这种转换。
它的实现方法是通过观察公历时间轴来计算对应的农历时间。
农历与公历时间是不一致的,公历按照国际上的标准,每年的第一天
是1月1日,但是农历每年的第一天是春节,春节一般是在公历1月或者
2月,并且每年的月份及每月的天数完全不一样。
首先根据公历定义时间年月日,根据公历ini文件获取这一年每个月
的天数,计算此天为公历的第几天,设置春节为第一天,然后根据农历每
月的天数,除以每月的天数,取余数,余数为本月的第几天,除以每月的
天数为本月的月份,即可求出农历的月份与日期,从而实现公历转换农历。
二、公历转换节气算法
节气交替转换是指根据公历历法转换成节气历法,其中最关键的是根
据公历计算出节气的日期,为了实现这一转换,需要根据节气历法的计算
规则,设计一套算法实现节气的计算。
其中需要用到的主要参数有:
1、公历年份和月份;
2、节气历法的计算规则,这一规则是以春分点为计算基准点,向前
或者向后计算,每次计算90天或者120天,然后取月中规定的日期来确
定节气的日期。
根据上述要素。
JAVA万年历系统课程设计报告附源码
2013-2014学年第二学期《面向对象程序设计》课程设计报告题目:万年历系统专业:计算机科学与技术班级:姓名:学号:指导教师:成绩:计算机与信息工程系2014年6月6日目录1设计内容及要求设计内容万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。
在我设计的万年历中主要有:(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用规范。
(2)按月份查询,实现了显示查询1901~2100年某月所有日期的阴阳历对照。
(3)并且添加了重大节日与星座等信息,界面采用日常的星期与月份结合的格式,方便查看与使用。
(4)编写万年历的课程设计,是为了使同学们更加了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。
为后续各门计算机课程的学习和毕业设计打下坚实基础。
设计任务及具体要求利用JAVA语言编写的万年历系统采用了多种JAVA语句来实现多种功能。
用户可以通过本程序的applet运行界面来查找一整年某月的农历和阳历,可以查找用户所想了解的某一天具体为星期几,并且可以看到一些重大节日的具体时间。
要求:满足设计万年历系统的目的,即当用户查询年份与月份时,系统就要将这一年的某一月份的阴历与阳历全部显示出来,并且附带这一月份的重大节日。
当用户随意改动年份或月份时系统自动显示与星期对应的日期。
用户点击日期时系统会显示具体星座信息。
2概要设计程序设计思路(1)总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
把公历转四柱的编程算法
把公历转四柱的编程算法如何将公历转换为四柱的编程算法公历转四柱是一种常见的算法,用于将公历日期转换为四柱(即之年、月、日、时)的八字,并用于命理学、卜筮等领域。
本文将详细介绍如何编写这个算法,以及如何一步一步实现公历转四柱的功能。
1. 理解公历和四柱的概念在开始编写代码之前,我们首先需要了解一下公历和四柱的概念。
公历是以阳历为基础的时间计算系统,常见于日常生活中的年、月、日、时的表示。
而四柱则是以阴阳五行为基础的时间计算系统,由年、月、日、时组成,每个部分都对应着一个地支和天干。
2. 实现公历到农历的转换在编写公历转四柱的算法之前,我们首先需要实现公历到农历的转换。
这一步可以借助已有的公历转农历算法库或者API来实现,以减少开发工作量。
大部分编程语言都提供了相关的库或者API,可以通过调用相应的函数来实现日期的转换。
3. 计算年的天干,根据年份计算对应的天干一般而言,农历的年份是以60为一个循环进行计算,其中天干为甲、乙、丙、丁、戊、己、庚、辛、壬、癸;地支为子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
我们可以通过计算年份与1900年的差值来得到对应的天干。
比如对于阳历2023年来说,年份差值为2023 - 1900 = 123,则通过取余运算(123 10 = 3),可以得到天干为丁。
4. 计算年的地支,根据年份计算对应的地支根据天干的循环周期,我们可以与地支的循环周期(12年)相结合,计算年份对应的地支。
比如对于阳历2023年来说,地支的循环周期为子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
与year的取余运算相结合,(123 12 = 3),可以得到地支为卯。
5. 计算月的天干和地支对于四柱中的月份,天干的计算方法与年份相似,通过计算月份与1900年1月的差值来得到对应的天干。
比如对于阳历2023年5月来说,月份的差值为(2023 - 1900) * 12 + 5 = 14013,则通过取余运算(14013 10 = 3),可以得到天干为丁。
java天干地支计算方法
java天干地支计算方法天干地支是中国古代用来纪年、记月、记日和记时的一种系统,具有悠久的历史。
在现代社会,许多程序员也对这一古老的文化产生了兴趣,并尝试用编程语言来实现天干地支的计算。
本文将为您介绍如何使用Java语言来实现天干地支的计算方法。
一、天干地支基础知识天干包括:甲、乙、丙、丁、戊、己、庚、辛、壬、癸,共10个。
地支包括:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥,共12个。
天干地支的组合形成了60个不同的组合,称为六十甲子。
二、Java实现天干地支计算方法1.定义天干和地支数组```java// 天干String[] tianGan = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};// 地支String[] diZhi = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};```2.计算天干地支组合我们可以通过一个方法来计算给定年份(或月份、日期)对应的天干地支组合。
```javapublic static String getTianGanDiZhi(int year) {// 计算天干int tianGanIndex = (year - 4) % 10;if (tianGanIndex < 0) {tianGanIndex += 10;}// 计算地支int diZhiIndex = (year - 4) % 12;if (diZhiIndex < 0) {diZhiIndex += 12;}return tianGan[tianGanIndex] + diZhi[diZhiIndex];}```这里的计算公式(year - 4)是基于1900年为甲子年(天干地支的第一个组合)进行推导的。
java获取法定节假日信息的方法
一、介绍法定节假日信息获取的重要性在进行日常工作、生活安排时,了解法定假日的具体情况是非常重要的。
这不仅有助于合理安排个人时间,还能更好地预防因节假日放假时间不清楚而导致的工作错乱或计划冲突。
二、Java获取法定节假日信息的方法1. 使用开源API目前市面上有很多开源的API可以获取法定节假日信息,其中比较知名的有“我国节假日查询API”、“节假日及工作日查询API”等。
这些API通常都提供了相应的接口和文档,可以通过调用其接口来获取法定节假日的信息。
2. 自定义数据源如果没有现成的API可供调用,也可以自行维护一个法定节假日的数据源。
可以将法定节假日的相关信息存储在数据库或者配置文件中,在需要的时候进行查询即可。
这种方法适用于对数据安全有较高要求或者没有网络连接的情况下。
3. 使用第三方工具库除了开源API之外,还可以使用一些第三方的Java工具库来获取法定节假日的信息。
可以使用“JollyHoliday”、“JollyDay”等工具库来获取节假日信息,并且这些工具库通常也提供了各种配置和定制的选项,可以根据实际需要进行调整。
4. 调用政府公开接口一些政府部门或者冠方机构也会提供相应的接口来获取法定节假日的信息。
可以通过调用这些公开接口来获取最权威、最及时的节假日信息,确保获取到的信息是最准确可靠的。
三、应用场景及注意事项1. 应用场景Java获取法定节假日信息的方法可以应用于各种项目中,包括但不限于日程安排管理软件、考勤系统、团队协作工具等。
在这些场景中,了解法定节假日的信息有助于更好地进行排班、调休等工作。
2. 注意事项在使用Java获取法定节假日信息的方法时,需要注意以下几点: a. 数据更新及时性:法定节假日的信息是动态变化的,需要保证获取信息的及时性,避免因信息过期而导致的错误。
b. 数据准确性:所获取的节假日信息需要保证准确性,避免因信息错误而造成不必要的麻烦。
c. 数据安全性:对于涉及用户隐私或敏感数据的项目,需要更加重视数据的安全性,保证所获取的信息不会被恶意篡改或者泄露。
java国家节假日判断代码 -回复
java国家节假日判断代码-回复如何使用Java编写一个国家节假日判断代码。
编写一个可以判断中国国家节假日的Java代码非常有用。
这样的代码可以帮助我们自动判断当前日期是否是一个节假日,从而能够准确地安排工作或者休息时间。
以下是一步一步编写这样的代码的详细过程。
首先,我们需要导入Java中的相关类库和模块,以便能够使用日期和时间的功能。
在Java中,日期和时间相关的类主要在`java.util`和`java.time`包中。
因此,我们需要在代码开头添加以下`import`语句:javaimport java.util.Calendar;import java.util.Date;import java.time.LocalDate;接下来,我们可以创建一个名为`HolidayChecker`的Java类,其中包含一个名为`isHoliday`的方法,用于判断给定日期是否是一个中国国家节假日。
代码片段如下:javapublic class HolidayChecker {public boolean isHoliday(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1; 注意月份需要加1,因为Calendar类的月份是从0开始计数的int day = calendar.get(Calendar.DAY_OF_MONTH);在这里编写具体的判断节假日的逻辑return false;}}在`isHoliday`方法中,我们首先通过`Calendar.getInstance()`方法获取一个`Calendar`对象,并将其设置为给定日期。
java toepochday方法
java toepochday方法### Java中的toEpochDay方法解析在Java编程语言中,`toEpochDay`方法属于`java.time`包下,这个包是Java 8引入的新日期和时间API的一部分。
该方法通常用于将日期对象转换为自公元1970-01-01(UTC)以来的天数,这在处理日期和时间时非常有用,尤其是在需要比较日期或者进行日期计算时。
#### 1.toEpochDay方法简介`toEpochDay`方法定义在`LocalDate`类中,它表示一个不包含具体时间的日期。
该方法的作用是将`LocalDate`对象转换为相应的纪元日(Epoch Day),也就是从公元前1970年1月1日(ISO日历系统)开始算起的天数。
#### 2.使用toEpochDay方法以下是`toEpochDay`方法的基本用法:```javaimport java.time.LocalDate;public class EpochDayExample {public static void main(String[] args) {// 获取当前日期LocalDate today = LocalDate.now();// 将当前日期转换为纪元日long epochDay = today.toEpochDay();System.out.println("Today"s epoch day: " + epochDay);}}```上面的代码示例首先获取当前日期,然后调用`toEpochDay`方法,得到自公元1970年1月1日以来的天数,并将结果打印到控制台。
#### 3.纪元日与时间戳的区别需要注意的是,`toEpochDay`返回的是天数,而不是以毫秒为单位的时间戳。
如果你想获得自Unix纪元以来的毫秒数,你需要使用其他方法,比如`Instant`类中的`toEpochMilli`方法。
java节假日算法_基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法...
java节假⽇算法_基于Java代码实现判断春节、端午节、中秋节等法定节假⽇的⽅法...⼀、前⾔最近⼯作上遇到⼀个问题,后端有⼀个定时任务,需要⽤JAVA每天判断法定节假⽇、周末放假,上班等情况,其实想单独通过逻辑什么的去判断中国法定节假⽇的放假情况,基本不可能,因为国家每⼀年的假期可能不⼀样,是⼈为设定的;所以只能依靠其它⼿段,能想到的⽐较靠谱的如下:1.⽹络接⼝:有些数据服务商会提供,要么是收钱的,要么是次数限制,等等各种问题,效果不理想,可控性差,我也没试过,如:或者2.在线解析⽹页信息,获取节假⽇情况:严重依赖被解析的⽹站⽹页,所以在选取⽹站的时候,要找稍微靠谱点的;3.根据国家规定的法定节假⽇放假情况,每年录⼊系统,这种如果客户不怕⿇烦的话。
还是⽐较靠谱的;本Demo将选择第⼆种来实现;⼆、使⽤htmlunit在线解析⽹页信息,获取节假⽇情况⼀开始是使⽤jsoup去解析⽹页的,效果不理想,如果⽹页是动态⽣成的时候,⽤jsoup遇到了各种问题,所以改成了htmlunit,总得来说htmlunit还是很强⼤的,能够模拟浏览器运⾏,被誉为java浏览器的开源实现;⾸先去官⽹下载相关jar包,以及阅读相关⽂档:我这⾥解析的⽹页是360的万年历:⽇历界⾯如下:被解析的 HTML格式如下:实现步骤:1、加载页⾯;2、循环等待页⾯加载完成(可能会有⼀些动态页⾯,是⽤javascript⽣成);3、根据⽹页格式解析html内容,并提取关键信息存⼊封装好的对象;注意点:1、难点在于判断是否休假及假期类型,由于原页⾯并没有标明每⼀天的假期类型,所以这⾥的逻辑要⾃⼰去实现,详情参考代码;2、之所以有个静态latestVocationName变量,是防⽌出现以下情况(出现该情况的概率极低;PS:⽅法要每天调⽤⼀次,该变量才⽣效):代码实现:定义⼀个中国⽇期类:package com.pichen.tools.getDate;import java.util.Date;public class ChinaDate {/*** 公历时间private Date solarDate;/*** 农历⽇*/private String lunar;/*** 公历⽇*/private String solar;/*** 是否是 休*/private boolean isVacation = false;/*** 如果是 休情况下的假期名字*/private String VacationName = "⾮假期";/*** 是否是 班*/private boolean isWorkFlag = false; private boolean isSaturday = false;private boolean isSunday = false;/*** @return the solarDate*/public Date getSolarDate() {return solarDate;}/*** @param solarDate the solarDate to set */public void setSolarDate(Date solarDate) {}/*** @return the lunar*/public String getLunar() {return lunar;}/*** @param lunar the lunar to set*/public void setLunar(String lunar) {this.lunar = lunar;}/*** @return the solar*/public String getSolar() {return solar;}/*** @param solar the solar to set*/public void setSolar(String solar) {this.solar = solar;}/*** @return the isVacation*/public boolean isVacation() {return isVacation;}/*** @param isVacation the isVacation to setpublic void setVacation(boolean isVacation) {this.isVacation = isVacation;}/*** @return the vacationName*/public String getVacationName() {return VacationName;}/*** @param vacationName the vacationName to set*/public void setVacationName(String vacationName) { VacationName = vacationName;}/*** @return the isWorkFlag*/public boolean isWorkFlag() {return isWorkFlag;}/*** @param isWorkFlag the isWorkFlag to set*/public void setWorkFlag(boolean isWorkFlag) {this.isWorkFlag = isWorkFlag;}/*** @return the isSaturday*/public boolean isSaturday() {return isSaturday;}* @param isSaturday the isSaturday to set*/public void setSaturday(boolean isSaturday) {this.isSaturday = isSaturday;}/*** @return the isSunday*/public boolean isSunday() {return isSunday;}/*** @param isSunday the isSunday to set*/public void setSunday(boolean isSunday) {this.isSunday = isSunday;}}解析⽹页,并调⽤demo,打印本⽉详情,和当天详情:package com.pichen.tools.getDate;import java.io.IOException;import .MalformedURLException;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlElement;import com.gargoylesoftware.htmlunit.html.HtmlPage;private static String latestVocationName="";public String getVocationName(DomNodeList htmlElements, String date) throws ParseException{ String rst = "";boolean pastTimeFlag = false;DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");Date paramDate = dateFormat.parse(date);if(new Date().getTime() >= paramDate.getTime()){pastTimeFlag = true;}//first step //jugde if can get vocation name from html pagefor(int i = 0; i < htmlElements.size(); i++){HtmlElement element = htmlElements.get(i);if(element.getAttribute("class").indexOf("vacation")!=-1){boolean hitFlag = false;String voationName = "";for(; i < htmlElements.size(); i++){HtmlElement elementTmp = htmlElements.get(i);String liDate = elementTmp.getAttribute("date");List lunar = elementTmp.getElementsByAttribute("span", "class", "lunar");String lanarText = lunar.get(0).asText();if(lanarText.equals("元旦")){voationName = "元旦";}else if(lanarText.equals("除⼣")||lanarText.equals("春节")){voationName = "春节";}else if(lanarText.equals("清明")){voationName = "清明";}else if(lanarText.equals("国际劳动节")){voationName = "国际劳动节";}else if(lanarText.equals("端午节")){voationName = "端午节";}else if(lanarText.equals("中秋节")){voationName = "中秋节";}else if(lanarText.equals("国庆节")){}if(liDate.equals(date)){hitFlag = true;}if(elementTmp.getAttribute("class").indexOf("vacation")==-1){break;}}if(hitFlag == true && !voationName.equals("")){rst = voationName;break;}}else{continue;}}//if first step fail(rarely), get from the latest Vocation nameif(rst.equals("")){System.out.println("warning: fail to get vocation name from html page."); //you can judge by some simple rule//from the latest Vocation namerst = testVocationName;}else if(pastTimeFlag == true){//更新《当前时间,且最近⼀次的可见的假期名testVocationName = rst;}return rst;}public List getCurrentDateInfo(){WebClient webClient = null;List dateList = null;try{DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");webClient = new WebClient();HtmlPage page = webClient.getPage("/rili/");//最⼤等待60秒for(int k = 0; k < 60; k++){if(!page.getElementById("M-dates").asText().equals("")) break;Thread.sleep(1000);}//睡了8秒,等待页⾯加载完成...,有时候,页⾯可能获取不到,不稳定()//Thread.sleep(8000);DomNodeList htmlElements = page.getElementById("M-dates").getElementsByTagName("li");//System.out.println(htmlElements.size());for(HtmlElement element : htmlElements){ChinaDate chinaDate = new ChinaDate();List lunar = element.getElementsByAttribute("span", "class", "lunar");List solar = element.getElementsByAttribute("div", "class", "solar");chinaDate.setLunar(lunar.get(0).asText());chinaDate.setSolar(solar.get(0).asText());chinaDate.setSolarDate(dateFormat.parse(element.getAttribute("date")));if(element.getAttribute("class").indexOf("vacation")!=-1){chinaDate.setVacation(true);chinaDate.setVacationName(this.getVocationName(htmlElements, element.getAttribute("date"))); }if(element.getAttribute("class").indexOf("weekend")!=-1 &&element.getAttribute("class").indexOf("last")==-1){chinaDate.setSaturday(true);}if(element.getAttribute("class").indexOf("last weekend")!=-1){chinaDate.setSunday(true);}if(element.getAttribute("class").indexOf("work")!=-1){chinaDate.setWorkFlag(true);}else if(chinaDate.isSaturday() == false &&chinaDate.isSunday() == false &&chinaDate.setWorkFlag(true);}else{chinaDate.setWorkFlag(false);}dateList.add(chinaDate);}}catch(Exception e){e.printStackTrace();}finally{webClient.close();}return dateList;}public ChinaDate getTodayInfo(){List dateList = this.getCurrentDateInfo();DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");for(ChinaDate date: dateList){if(dateFormat.format(date.getSolarDate()).equals(dateFormat.format(new Date()))){return date;}}return new ChinaDate();}public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException {List dateList = new Main().getCurrentDateInfo();ChinaDate today = new Main().getTodayInfo();DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");System.out.println("本⽉详情:");for(ChinaDate date: dateList){System.out.println(dateFormat.format(date.getSolarDate()) + " " + date.getVacationName());}System.out.println("------------------------------------------------------------------------");System.out.println("⽇期:" + today.getSolarDate());System.out.println("农历:"+today.getLunar());System.out.println("公历:"+today.getSolar());System.out.println("假期名:"+today.getVacationName());System.out.println("是否周六:"+today.isSaturday());System.out.println("是否周⽇:"+today.isSunday());System.out.println("是否休假:"+today.isVacation());System.out.println("是否⼯作⽇:"+today.isWorkFlag());System.out.println("已发⽣的最近⼀次假期:" + testVocationName); }}运⾏程序,结果正确:。
java 中国标准时间
java 中国标准时间Java 中国标准时间。
Java是一种广泛使用的编程语言,它具有跨平台、面向对象、高性能等特点,在各种应用领域都有着重要的地位。
而中国标准时间(CST)作为中国的标准时间,对于Java开发者来说也是一个重要的概念。
本文将介绍Java中中国标准时间的相关知识,包括时区、时间格式化、时间计算等内容。
在Java中,时区是一个重要的概念。
时区代表了地球上的一个区域内使用的标准时间。
中国标准时间属于东八区,也就是UTC+8时区。
在Java中,可以使用TimeZone类来表示时区,通过TimeZone.getTimeZone("GMT+8")来获取表示中国标准时间的TimeZone对象。
对于需要处理不同时区时间的应用程序来说,正确地处理时区是非常重要的。
另外,Java中关于中国标准时间的处理还涉及到时间的格式化和解析。
在Java 8之前,我们通常使用SimpleDateFormat类来进行时间的格式化和解析。
例如,要将一个Date对象格式化为中国标准时间的字符串,可以使用SimpleDateFormat类的实例进行格式化操作。
而要将一个表示中国标准时间的字符串解析为Date对象,同样也可以使用SimpleDateFormat类来实现。
随着Java 8的引入,新的日期时间API提供了更加强大和易用的日期时间处理功能。
在新的API中,DateTimeFormatter类取代了SimpleDateFormat类,提供了丰富的日期时间格式化和解析功能。
通过DateTimeFormatter类,我们可以更加方便地进行中国标准时间的格式化和解析操作。
除了时区和时间格式化解析外,Java中还提供了丰富的时间计算功能。
对于中国标准时间的计算,我们可以使用Instant类、LocalDateTime类、ZonedDateTime类等来进行时间的加减运算、时区转换等操作。
这些类提供了丰富的方法来处理中国标准时间,开发者可以根据具体的需求选择合适的类来进行时间计算。
JAVA日期加减计算
JAVA日期加减计算Java中的日期加减计算可以使用Java标准库中的java.util.Calendar 类或者使用第三方库,如 Joda-Time 和 Java 8 的新时间日期 API。
1. 使用java.util.Calendar 类进行日期加减计算:```javaimport java.util.Calendar;public class DateCalculatorpublic static void main(String[] args)Calendar calendar = Calendar.getInstance(;//获取当前日期System.out.println("当前日期:" + calendar.getTime();//日期加上10天calendar.add(Calendar.DAY_OF_MONTH, 10);System.out.println("加上10天后的日期:" +calendar.getTime();//日期减去5个月calendar.add(Calendar.MONTH, -5);System.out.println("减去5个月后的日期:" +calendar.getTime();//日期加上2年calendar.add(Calendar.YEAR, 2);System.out.println("加上2年后的日期:" + calendar.getTime();}}```运行结果:```当前日期:Tue Nov 10 22:54:53 CST 2024加上10天后的日期:Fri Nov 20 22:54:53 CST 2024减去5个月后的日期:Mon Jun 20 22:54:53 CST 2024加上2年后的日期:Wed Jun 20 22:54:53 CST 2024```通过调用 `add(field, amount)` 方法来实现日期的加减计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
private static char[] chineseMonths = {
// 农历月份大小压缩[ya suo]表,两个字节表示一年。两个字节共十六个二进制[er jin zhi]位数,
// 前四个位数表示闰月月份,后十二个位数表示十二个农历月份的大小。
0x00,0x04,0xad,0x08,0x5a,0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45,
String[] t = c.getYearTable();
for (int i=0; i } else if (cmd.equalsIgnoreCase("month")) {
String[] t = c.getMonthTable();
for (int i=0; i } else {
System.out.println(c.toString());
中国农历计算程式
跟据 提供的算法[suan fa],我写了下面这个程式:
/**
* ChineseCalendarGB.java
* Copyright (c) 1997-2002 by Dr. Herong Yang
* 中国农历算法[suan fa] - 实用于[yo 年
public static int dayOfWeek(int y, int m, int d) {
int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日
y = (y-1)%400 + 1; // 公历星期值分部 400 年循环[xun huan]一次
int ly = (y-1)/4; // 闰年次数
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,
private static String[] animalNames =
{"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
public static void main(String[] arg) {
ChineseCalendarGB c = new ChineseCalendarGB();
JAVA_算法_中国公历算法&中国农历算法
public static int dayOfWeek(int y, int m, int d) {
int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日
y = (y-1)%400 + 1; // 公历星期值分部 400 年循环[xun huan]一次
0xd9,0x02,0xe9,0x6a,0xa8,0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08,
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,
}
}
public ChineseCalendarGB() {
setGregorian(1901,1,1);
}
public void setGregorian(int y, int m, int d) {
gregorianYear = y;
gregorianMonth = m;
gregorianDate = d;
private boolean isGregorianLeap;
private int dayOfYear;
private int dayOfWeek; // 周日一星期的第一天
private int chineseYear;
private int chineseMonth; // 负数表示闰月
*/
import java.text.*;
import java.util.*;
class ChineseCalendarGB {
private int gregorianYear;
private int gregorianMonth;
private int gregorianDate;
isGregorianLeap = isGregorianLeapYear(y);
dayOfYear = dayOfYear(y,m,d);
dayOfWeek = dayOfWeek(y,m,d);
chineseYear = 0;
chineseMonth = 0;
chineseDate = 0;
private int chineseDate;
private int sectionalTerm;
private int principleTerm;
private static char[] daysInGregorianMonth =
{31,28,31,30,31,30,31,31,30,31,30,31};
String cmd = "day";
int y = 1901;
int m = 1;
int d = 1;
if (arg.length>0) cmd = arg[0];
if (arg.length>1) y = Integer.parseInt(arg[1]);
if (arg.length>2) m = Integer.parseInt(arg[2]);
sectionalTerm = 0;
principleTerm = 0;
}
public static boolean isGregorianLeapYear(int year) {
boolean isLeap = false;
if (year%4==0) isLeap = true;
if (year%100==0) isLeap = false;
ly = ly - (y-1)/100;
ly = ly + (y-1)/400;
int ry = y - 1 - ly; // 常年次数
w = w + ry; // 常年星期值增一
w = w + 2*ly; // 闰年星期值增二
w = w + dayOfYear(y,m,d);
w = (w-1)%7 + 1;
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,
int ly = (y-1)/4; // 闰年次数
ly = ly - (y-1)/100;
ly = ly + (y-1)/400;
int ry = y - 1 - ly; // 常年次数
w = w + ry; // 常年星期值增一
w = w + 2*ly; // 闰年星期值增二
w = w + dayOfYear(y,m,d);
if (arg.length>3) d = Integer.parseInt(arg[3]);
c.setGregorian(y,m,d);
puteChineseFields();
puteSolarTerms();
if (cmd.equalsIgnoreCase("year")) {
w = (w-1)%7 + 1;
return w;
}
中国农历算法[suan fa]
根公历相比,中国农历的算法[suan fa]相当复杂。我在网上找的算法[suan fa]之中, 的算法[suan fa]是最好的一个。这个算法[suan fa]使用了大量的数据[shu ju]来确定农历月份和节气的分部,它仅实用于[yong yu]公历 1901 年到 2100 年之间的 200 年。
private static String[] stemNames =
{"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
private static String[] branchNames =