冷面閻羅

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

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

          ???? 前幾天在blog中,對網(wǎng)友的java萬年歷作修改,看到有的網(wǎng)友說能不能加上農(nóng)歷,后來在網(wǎng)上看到有人寫過幾個陽歷轉(zhuǎn)陰歷的算法,我比較了一個發(fā)現(xiàn),這個算法還算不錯,只要有的計算機編程基礎的人看明白應該是沒有問題的,其實這個就和我們以前在c中,判斷一天是周幾的算法差不多,都是和某一個特定的時間作比較,算出差多少天,再根據(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年閏哪個月?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日對應的農(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ù)
          ????????
          //?計算當天是農(nóng)歷第幾天
          ????????
          //i最終結(jié)果是農(nóng)歷的年份
          ????????
          //offset是當年的第幾天
          ????????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);?//閏哪個月,1-12
          ????????leap?=?false;

          ????????
          //用當年的天數(shù)offset,逐個減去每月(農(nóng)歷)的天數(shù),求出當天是本月的第幾天
          ????????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時,并且剛才計算的月份是閏月,要校正
          ????????if?(offset?==?0?&&?leapMonth?>?0?&&?iMonth?==?leapMonth?+?1)?{
          ????????????
          if?(leap)?{
          ????????????????leap?
          =?false;
          ????????????}
          ?else?{
          ????????????????leap?
          =?true;
          ????????????????
          --iMonth;
          ????????????????
          --monCyl;
          ????????????}

          ????????}

          ????????
          //offset小于0時,也要校正
          ????????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(
          "北京時間:"?+?chineseDateFormat.format(today.getTime())?+?" 農(nóng)歷"?+?lunar);
          ????}

          }
          ?
          ????? 在以前程序的label[i].setText(count +"");下設置label的浮動提示
          ????????????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 冷面閻羅 閱讀(8338) 評論(17)  編輯  收藏 所屬分類: java

          評論

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

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

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

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

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

          不錯。。


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          有沒有點擊那種下拉列表彈出時間選項卡的啊?求源碼
          2014-08-27 10:51 | zhangyi

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

          建議用冬月、臘月而不是十一月、十二月等
          2015-02-23 15:24 | -
          主站蜘蛛池模板: 遵义市| 宁德市| 宝清县| 湖北省| 宁武县| 双江| 荃湾区| 嵊州市| 资中县| 合山市| 屯昌县| 泰安市| 遂平县| 崇文区| 肇源县| 凉山| 永兴县| 扎鲁特旗| 佛坪县| 寻乌县| 徐汇区| 镇江市| 成都市| 吕梁市| 桐乡市| 美姑县| 柞水县| 公主岭市| 从江县| 天峻县| 鸡泽县| 通辽市| 万荣县| 萝北县| 法库县| 华亭县| 泸西县| 偃师市| 庆元县| 稷山县| 堆龙德庆县|