冷面閻羅

          低調(diào)做人&&高調(diào)做事
          隨筆 - 208, 文章 - 3, 評(píng)論 - 593, 引用 - 0
          數(shù)據(jù)加載中……

          對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷

          ???? 前幾天在blog中,對(duì)網(wǎng)友的java萬年歷作修改,看到有的網(wǎng)友說能不能加上農(nóng)歷,后來在網(wǎng)上看到有人寫過幾個(gè)陽歷轉(zhuǎn)陰歷的算法,我比較了一個(gè)發(fā)現(xiàn),這個(gè)算法還算不錯(cuò),只要有的計(jì)算機(jī)編程基礎(chǔ)的人看明白應(yīng)該是沒有問題的,其實(shí)這個(gè)就和我們以前在c中,判斷一天是周幾的算法差不多,都是和某一個(gè)特定的時(shí)間作比較,算出差多少天,再根據(jù)月大月小瑞月這些規(guī)則,算出是農(nóng)歷的那年那月那日.
          package?clock;

          import?java.text.ParseException;
          import?java.text.SimpleDateFormat;
          import?java.util.Calendar;
          import?java.util.Date;

          public?class?Lunar?{
          ????
          private?int?year;
          ????
          private?int?month;
          ????
          private?int?day;
          ????
          private?boolean?leap;
          ????
          final?static?String?chineseNumber[]?=?{"",?"",?"",?"",?"",?"",?"",?"",?"",?"",?"十一",?"十二"};
          ????
          static?SimpleDateFormat?chineseDateFormat?=?new?SimpleDateFormat("yyyy年MM月dd日");
          ????
          final?static?long[]?lunarInfo?=?new?long[]
          ????
          {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}
          ;

          ????
          //======?傳回農(nóng)歷?y年的總天數(shù)
          ????final?private?static?int?yearDays(int?y)?{
          ????????
          int?i,?sum?=?348;
          ????????
          for?(i?=?0x8000;?i?>?0x8;?i?>>=?1)?{
          ????????????
          if?((lunarInfo[y?-?1900]?&?i)?!=?0)?sum?+=?1;
          ????????}

          ????????
          return?(sum?+?leapDays(y));
          ????}


          ????
          //======?傳回農(nóng)歷?y年閏月的天數(shù)
          ????final?private?static?int?leapDays(int?y)?{
          ????????
          if?(leapMonth(y)?!=?0)?{
          ????????????
          if?((lunarInfo[y?-?1900]?&?0x10000)?!=?0)
          ????????????????
          return?30;
          ????????????
          else
          ????????????????
          return?29;
          ????????}
          ?else
          ????????????
          return?0;
          ????}


          ????
          //======?傳回農(nóng)歷?y年閏哪個(gè)月?1-12?,?沒閏傳回?0
          ????final?private?static?int?leapMonth(int?y)?{
          ????????
          return?(int)?(lunarInfo[y?-?1900]?&?0xf);
          ????}


          ????
          //======?傳回農(nóng)歷?y年m月的總天數(shù)
          ????final?private?static?int?monthDays(int?y,?int?m)?{
          ????????
          if?((lunarInfo[y?-?1900]?&?(0x10000?>>?m))?==?0)
          ????????????
          return?29;
          ????????
          else
          ????????????
          return?30;
          ????}


          ????
          //======?傳回農(nóng)歷?y年的生肖
          ????final?public?String?animalsYear()?{
          ????????
          final?String[]?Animals?=?new?String[]{"",?"",?"",?"",?"",?"",?"",?"",?"",?"",?"",?""};
          ????????
          return?Animals[(year?-?4)?%?12];
          ????}


          ????
          //======?傳入?月日的offset?傳回干支,?0=甲子
          ????final?private?static?String?cyclicalm(int?num)?{
          ????????
          final?String[]?Gan?=?new?String[]{"",?"",?"",?"",?"",?"",?"",?"",?"",?""};
          ????????
          final?String[]?Zhi?=?new?String[]{"",?"",?"",?"",?"",?"",?"",?"",?"",?"",?"",?""};
          ????????
          return?(Gan[num?%?10]?+?Zhi[num?%?12]);
          ????}


          ????
          //======?傳入?offset?傳回干支,?0=甲子
          ????final?public?String?cyclical()?{
          ????????
          int?num?=?year?-?1900?+?36;
          ????????
          return?(cyclicalm(num));
          ????}


          ????
          /**
          ?????*?傳出y年m月d日對(duì)應(yīng)的農(nóng)歷.
          ?????*?yearCyl3:農(nóng)歷年與1864的相差數(shù)???????????????
          ?????*?monCyl4:從1900年1月31日以來,閏月數(shù)
          ?????*?dayCyl5:與1900年1月31日相差的天數(shù),再加40???????
          ?????*?
          @param?cal?
          ?????*?
          @return?
          ?????
          */

          ????
          public?Lunar(Calendar?cal)?{
          ????????@SuppressWarnings(
          "unused")?int?yearCyl,?monCyl,?dayCyl;
          ????????
          int?leapMonth?=?0;
          ????????Date?baseDate?
          =?null;
          ????????
          try?{
          ????????????baseDate?
          =?chineseDateFormat.parse("1900年1月31日");
          ????????}
          ?catch?(ParseException?e)?{
          ????????????e.printStackTrace();??
          //To?change?body?of?catch?statement?use?Options?|?File?Templates.
          ????????}


          ????????
          //求出和1900年1月31日相差的天數(shù)
          ????????int?offset?=?(int)?((cal.getTime().getTime()?-?baseDate.getTime())?/?86400000L);
          ????????dayCyl?
          =?offset?+?40;
          ????????monCyl?
          =?14;

          ????????
          //用offset減去每農(nóng)歷年的天數(shù)
          ????????
          //?計(jì)算當(dāng)天是農(nóng)歷第幾天
          ????????
          //i最終結(jié)果是農(nóng)歷的年份
          ????????
          //offset是當(dāng)年的第幾天
          ????????int?iYear,?daysOfYear?=?0;
          ????????
          for?(iYear?=?1900;?iYear?<?2050?&&?offset?>?0;?iYear++)?{
          ????????????daysOfYear?
          =?yearDays(iYear);
          ????????????offset?
          -=?daysOfYear;
          ????????????monCyl?
          +=?12;
          ????????}

          ????????
          if?(offset?<?0)?{
          ????????????offset?
          +=?daysOfYear;
          ????????????iYear
          --;
          ????????????monCyl?
          -=?12;
          ????????}

          ????????
          //農(nóng)歷年份
          ????????year?=?iYear;

          ????????yearCyl?
          =?iYear?-?1864;
          ????????leapMonth?
          =?leapMonth(iYear);?//閏哪個(gè)月,1-12
          ????????leap?=?false;

          ????????
          //用當(dāng)年的天數(shù)offset,逐個(gè)減去每月(農(nóng)歷)的天數(shù),求出當(dāng)天是本月的第幾天
          ????????int?iMonth,?daysOfMonth?=?0;
          ????????
          for?(iMonth?=?1;?iMonth?<?13?&&?offset?>?0;?iMonth++)?{
          ????????????
          //閏月
          ????????????if?(leapMonth?>?0?&&?iMonth?==?(leapMonth?+?1)?&&?!leap)?{
          ????????????????
          --iMonth;
          ????????????????leap?
          =?true;
          ????????????????daysOfMonth?
          =?leapDays(year);
          ????????????}
          ?else
          ????????????????daysOfMonth?
          =?monthDays(year,?iMonth);

          ????????????offset?
          -=?daysOfMonth;
          ????????????
          //解除閏月
          ????????????if?(leap?&&?iMonth?==?(leapMonth?+?1))?leap?=?false;
          ????????????
          if?(!leap)?monCyl++;
          ????????}

          ????????
          //offset為0時(shí),并且剛才計(jì)算的月份是閏月,要校正
          ????????if?(offset?==?0?&&?leapMonth?>?0?&&?iMonth?==?leapMonth?+?1)?{
          ????????????
          if?(leap)?{
          ????????????????leap?
          =?false;
          ????????????}
          ?else?{
          ????????????????leap?
          =?true;
          ????????????????
          --iMonth;
          ????????????????
          --monCyl;
          ????????????}

          ????????}

          ????????
          //offset小于0時(shí),也要校正
          ????????if?(offset?<?0)?{
          ????????????offset?
          +=?daysOfMonth;
          ????????????
          --iMonth;
          ????????????
          --monCyl;
          ????????}

          ????????month?
          =?iMonth;
          ????????day?
          =?offset?+?1;
          ????}


          ????
          public?static?String?getChinaDayString(int?day)?{
          ????????String?chineseTen[]?
          =?{"",?"",?"廿",?""};
          ????????
          int?n?=?day?%?10?==?0???9?:?day?%?10?-?1;
          ????????
          if?(day?>?30)
          ????????????
          return?"";
          ????????
          if?(day?==?10)
          ????????????
          return?"初十";
          ????????
          else
          ????????????
          return?chineseTen[day?/?10]?+?chineseNumber[n];
          ????}


          ????
          public?String?toString()?{
          ????????
          return?year?+?""?+?(leap???""?:?"")?+?chineseNumber[month?-?1]?+?""?+?getChinaDayString(day);
          ????}


          ????
          public?static?void?main(String[]?args)?throws?ParseException?{
          ????????Calendar?today?
          =?Calendar.getInstance();
          ????????today.setTime(chineseDateFormat.parse(
          "2003年1月1日"));
          ????????Lunar?lunar?
          =?new?Lunar(today);

          ????????System.out.println(
          "北京時(shí)間:"?+?chineseDateFormat.format(today.getTime())?+?" 農(nóng)歷"?+?lunar);
          ????}

          }
          ?
          ????? 在以前程序的label[i].setText(count +"");下設(shè)置label的浮動(dòng)提示
          ????????????try?{
          ????????????????now.setTime(chineseDateFormat.parse(year_log
          +""+(month_log+1)+""+count+""));
          ????????????}
          ?catch?(ParseException?e)?{
          ????????????????e.printStackTrace();
          ????????????}

          ????????????label[i].setToolTipText(
          "農(nóng)歷"+new?Lunar(now));
          就能出現(xiàn)這種效果:
          1.jpg

          posted on 2007-01-04 13:08 冷面閻羅 閱讀(8340) 評(píng)論(17)  編輯  收藏 所屬分類: java

          評(píng)論

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          農(nóng)歷仍然是“丙戌”年……
          2007-01-04 14:01 | weide

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          支持一下, 農(nóng)歷算法! 頂!
          2007-01-04 14:03 | BeanSoft

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          不錯(cuò)。。


          ps:
          現(xiàn)在怎么都對(duì)swt swing j2se界面編程感興趣??
          覺的有點(diǎn)奇怪~~~
          2007-01-04 16:31 | gm

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          回樓上,沒辦法,底層 的framework就是這個(gè)
          2007-01-04 16:51 | zeyuphoenix

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          是呀,沒有 SWT, SWING, 哪里來的 IDE 啊? 國內(nèi)的人大多寫寫網(wǎng)頁就夠了, 可是要做 IDE 你不學(xué)這些就沒辦法了. PS, 誰要是能用網(wǎng)頁做個(gè) IDE, 那就 NB 大了!
          2007-01-09 10:03 | BeanSoft

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          這些,都是java的基礎(chǔ)的基礎(chǔ),如果連基礎(chǔ)都一知辦解的,那又如何深入研究java呢?
          翻開任何一本java的書,在基礎(chǔ)部分都會(huì)有swing,swt這些.
          所以,希望想搞java的人,這方面最好要學(xué)一些,這僅是個(gè)人意見
          2007-01-09 14:00 | 冷面閻羅

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          int yearCyl, monCyl, dayCyl, hourCyl
          是為了傳入到 final private static String cyclicalm(int num)
          里面分別求出年,月,日,時(shí)辰的天干地支
          int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
          dayCyl = offset + 40;
          monCyl = 14;
          下面增加了這句算時(shí)辰的步長
          hourCyl = (int) ((cal.getTime().getTime() - baseDate.getTime() + 3300000L) / 7200000L) ;

          toString修改成下面這樣,呵呵,這可以輸出年月日時(shí)的天干地支,也就是所謂的八字了,大伙看看正確不?呵呵,
          public String toString() {
          return year + "年" + (leap ? "閏" : "") + chineseNumber[month - 1] + "月" + getChinaDayString(day)
          +" "+ cyclicalm(yearCyl)+"年"+ cyclicalm(monCyl)+"月"+ cyclicalm(dayCyl)+"日" + cyclicalm(hourCyl)+"時(shí)辰";
          }
          2007-10-12 10:41 | 御風(fēng)而行

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          如何添加類似備忘錄的功能呢
          2008-06-24 00:08 | 飛過海

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          天干地支的月份是按照節(jié)氣的
          2009-11-28 11:16 | CU

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          樓主能不能留下QQ
          我想要一個(gè)八字排版生成裝置~
          不知道樓主有沒有興趣

          syitryu@qq.com
          2009-11-28 11:19 | CU

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          這些代碼有錯(cuò)誤啊,實(shí)現(xiàn)不了
          2010-01-02 20:29 | 健健

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          樓主能不能發(fā)一份完整的代碼給我,運(yùn)行不了,急需,謝謝啊,郵箱zhiyun1128@163.com
          2010-01-02 20:34 | 小壞蛋

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          樓主~怎么運(yùn)行不了的?
          現(xiàn)在要做個(gè)類似的東西,那個(gè)急啊。。。
          能不能直接發(fā)個(gè)完整的萬年歷給我?chanthuang@qq.com
          2011-04-09 00:37 | chant

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷[未登錄]  回復(fù)  更多評(píng)論   

          很感謝樓主,麻煩問下能不能再加上二十四節(jié)氣?
          2011-06-07 15:03 |

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          急求完整程序,樓主也給我發(fā)一份吧,郵箱:760623648@qq.com。謝謝啊!
          2013-02-27 09:28 | 咫尺天涯

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          有沒有點(diǎn)擊那種下拉列表彈出時(shí)間選項(xiàng)卡的啊?求源碼
          2014-08-27 10:51 | zhangyi

          # re: 對(duì)前幾天作的java萬年歷,再弄修改,加上農(nóng)歷  回復(fù)  更多評(píng)論   

          建議用冬月、臘月而不是十一月、十二月等
          2015-02-23 15:24 | -
          主站蜘蛛池模板: 都昌县| 宁南县| 晋州市| 汽车| 健康| 北京市| 沂水县| 增城市| 织金县| 理塘县| 湟源县| 离岛区| 桐柏县| 克东县| 扬州市| 崇左市| 利辛县| 塔河县| 峨边| 息烽县| 阿拉善右旗| 南召县| 西宁市| 合江县| 颍上县| 广安市| 务川| 阿拉善左旗| 西安市| 丹凤县| 潞城市| 舒兰市| 无为县| 彝良县| 英德市| 当雄县| 曲阜市| 泰安市| 鹰潭市| 治多县| 普安县|