<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冷面閻羅

    低調做人&&高調做事
    隨筆 - 208, 文章 - 3, 評論 - 593, 引用 - 0
    數據加載中……

    對前幾天作的java萬年歷,再弄修改,加上農歷

    ???? 前幾天在blog中,對網友的java萬年歷作修改,看到有的網友說能不能加上農歷,后來在網上看到有人寫過幾個陽歷轉陰歷的算法,我比較了一個發現,這個算法還算不錯,只要有的計算機編程基礎的人看明白應該是沒有問題的,其實這個就和我們以前在c中,判斷一天是周幾的算法差不多,都是和某一個特定的時間作比較,算出差多少天,再根據月大月小瑞月這些規則,算出是農歷的那年那月那日.
    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}
    ;

    ????
    //======?傳回農歷?y年的總天數
    ????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));
    ????}


    ????
    //======?傳回農歷?y年閏月的天數
    ????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;
    ????}


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


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


    ????
    //======?傳回農歷?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日對應的農歷.
    ?????*?yearCyl3:農歷年與1864的相差數???????????????
    ?????*?monCyl4:從1900年1月31日以來,閏月數
    ?????*?dayCyl5:與1900年1月31日相差的天數,再加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日相差的天數
    ????????int?offset?=?(int)?((cal.getTime().getTime()?-?baseDate.getTime())?/?86400000L);
    ????????dayCyl?
    =?offset?+?40;
    ????????monCyl?
    =?14;

    ????????
    //用offset減去每農歷年的天數
    ????????
    //?計算當天是農歷第幾天
    ????????
    //i最終結果是農歷的年份
    ????????
    //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;
    ????????}

    ????????
    //農歷年份
    ????????year?=?iYear;

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

    ????????
    //用當年的天數offset,逐個減去每月(農歷)的天數,求出當天是本月的第幾天
    ????????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())?+?" 農歷"?+?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(
    "農歷"+new?Lunar(now));
    就能出現這種效果:
    1.jpg

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

    評論

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

    農歷仍然是“丙戌”年……
    2007-01-04 14:01 | weide

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

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

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

    不錯。。


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

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

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

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

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

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

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

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

    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萬年歷,再弄修改,加上農歷  回復  更多評論   

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    建議用冬月、臘月而不是十一月、十二月等
    2015-02-23 15:24 | -
    主站蜘蛛池模板: 亚洲成人黄色网址| 九九视频高清视频免费观看| 国产福利免费观看| 巨胸喷奶水www永久免费| 久久久久亚洲av无码专区喷水| 免费鲁丝片一级观看| 中文字幕无码免费久久9一区9 | 亚洲一区二区三区精品视频| 国产免费资源高清小视频在线观看| 一级有奶水毛片免费看| 亚洲午夜电影一区二区三区| 国产免费看插插插视频| 91av免费观看| 国产精品免费看久久久香蕉| 久久夜色精品国产噜噜亚洲a| 亚洲中文字幕在线乱码| 成人免费一区二区无码视频| 拍拍拍无挡视频免费观看1000| 中文字幕在线观看亚洲日韩| 亚洲AV中文无码字幕色三| 免费看大黄高清网站视频在线| 在线观看免费播放av片| 久久精品亚洲日本波多野结衣 | 亚洲乱码中文字幕综合234| 69视频在线是免费观看| 一本久久A久久免费精品不卡| 亚洲第一成年网站大全亚洲| 国产亚洲精品高清在线| 午夜视频免费成人| 性无码免费一区二区三区在线| 日韩免费在线中文字幕| 亚洲日韩AV一区二区三区四区| 亚洲尹人九九大色香蕉网站| 久久久久亚洲AV成人网人人软件 | 亚洲成?Ⅴ人在线观看无码| 69天堂人成无码麻豆免费视频| 中文字幕永久免费视频| 手机永久免费的AV在线电影网| 亚洲人成色4444在线观看| 亚洲国产精品成人综合久久久 | 亚洲第一区在线观看|