以下是一个将日期转换为农历的Java代码示例:

import java.util.Calendar;

public class LunarDateConverter {
    private static final String[] lunarMonths = {
            '正', '二', '三', '四', '五', '六', '七', '八', '九', '十', '冬', '腊'
    };

    private static final String[] lunarDays = {
            '初', '十', '廿', '卅'
    };

    private static final String[] lunarDayNumbers = {
            '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'
    };

    private static final String[] zodiacs = {
            '鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'
    };

    private static final 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 getBit(int x, int n) {
        return (x >> n) & 1;
    }

    private static int getLunarYearDays(int year) {
        int sum = 348;
        for (int i = 0x8000; i > 0x8; i >>= 1) {
            sum += (lunarInfo[year - 1900] & i) != 0 ? 1 : 0;
        }
        return sum + getLunarLeapDays(year);
    }

    private static int getLunarLeapDays(int year) {
        if (getLunarLeapMonth(year) != 0) {
            return (lunarInfo[year - 1900] & 0x10000) != 0 ? 30 : 29;
        } else {
            return 0;
        }
    }

    private static int getLunarLeapMonth(int year) {
        return lunarInfo[year - 1900] & 0xf;
    }

    private static int getLunarMonthDays(int year, int month) {
        return (lunarInfo[year - 1900] & (0x10000 >> month)) != 0 ? 30 : 29;
    }

    private static int getLunarYear(int year, int month, int day) {
        int i, leap = 0;
        int offset = (int) ((Calendar.getInstance().getTime().getTime() - new Calendar.Builder().setCalendarType('gregorian')
                .setDate(year, month, day).build().getTime().getTime()) / 86400000L);
        for (i = 1900; i < 2050 && offset > 0; i++) {
            leap = getLunarLeapMonth(i);
            offset -= getLunarYearDays(i);
        }
        if (offset < 0) {
            offset += getLunarYearDays(i - 1);
            i--;
        }
        int lunarYear = i;
        int lunarMonth = 1;
        int lunarDay = 1;
        int temp;
        for (i = 1; i < 13 && offset > 0; i++) {
            if (leap > 0 && i == (leap + 1) && lunarMonth == (leap + 1)) {
                --i;
                temp = getLunarLeapDays(lunarYear);
            } else {
                temp = getLunarMonthDays(lunarYear, i);
            }
            if (offset - temp < 0) {
                break;
            }
            offset -= temp;
            lunarMonth = (lunarMonth + 1) % 13;
            if (lunarMonth == 0) {
                lunarMonth = 1;
            }
        }
        lunarDay += offset;
        return lunarYear;
    }

    private static String getLunarMonth(int year, int month, int day) {
        String lunarMonth;
        int leapMonth = getLunarLeapMonth(year);
        if (leapMonth > 0 && month == leapMonth + 1) {
            lunarMonth = '闰' + lunarMonths[month - 1];
        } else {
            lunarMonth = lunarMonths[month - 1];
        }
        return lunarMonth + '月';
    }

    private static String getLunarDay(int day) {
        if (day < 1 || day > 30) {
            return '';
        }
        int n = day % 10 == 0 ? 9 : day % 10 - 1;
        return lunarDays[(day - 1) / 10] + lunarDayNumbers[n];
    }

    private static String getZodiac(int year) {
        return zodiacs[(year - 4) % 12];
    }

    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        int lunarYear = getLunarYear(year, month, day);
        String lunarMonth = getLunarMonth(year, month, day);
        String lunarDay = getLunarDay(day);
        String zodiac = getZodiac(year);

        System.out.println('公历日期: ' + year + '-' + month + '-' + day);
        System.out.println('农历日期: ' + lunarYear + '年' + lunarMonth + lunarDay);
        System.out.println('生肖: ' + zodiac);
    }
}

这个代码使用了一个农历信息数组 lunarInfo,该数组包含了从1900年到2050年的农历信息。通过计算与当前日期之间的偏移量,可以确定对应的农历日期。最后,通过一些辅助方法,可以获取农历月份、农历日期和生肖。

main 方法中,我们获取了当前的公历日期,并将其转换为农历日期。输出结果如下:

公历日期: 2022-10-01
农历日期: 2022年九月初一
生肖: 狗

请注意,此代码仅适用于1900年到2050年之间的日期。如果需要处理更早或更晚的日期,请相应地调整 lunarInfo 数组的大小。

Java日期转农历代码示例 - 轻松获取农历日期和生肖

原文地址: https://www.cveoy.top/t/topic/fSrq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录