`
walsece
  • 浏览: 138400 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

一个通过查表方式进行阳历和阴历转换的java实现

阅读更多

注:本文为原创文章,转载时请注明转载地址。


功能:通过查表方式实现阳历和阴历的日期转换
   


注:该实现是参照网络上的一个用c实现的方法转换成java的

package net.walsece.date;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Date;


public class DateParse {
    private final static int MONTH_DAYS[] = {29, 30};
    private final static int DAYS_MONTH[][] = {
            {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
            {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    private final static int DATAS[][] = {
            {23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0},
            {41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1},
            {30, 7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1},
            {49, 0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1},
            {38, 0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
            {26, 6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0},
            {45, 0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
            {35, 0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1},
            {24, 4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1},
            {43, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1},
            {32, 0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1},
            {21, 2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1},
            {40, 0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1},
            {28, 7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
            {47, 0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1},
            {36, 0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
            {26, 5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1},
            {44, 0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1},
            {33, 0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0},
            {23, 3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1},
            {42, 0, 6, 2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1},
            {30, 8, 1, 8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0},
            {48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0},
            {38, 0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
            {27, 6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0},
            {45, 0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0},
            {35, 0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
            {24, 4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0},
            {43, 0, 2, 44, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0},
            {32, 0, 4, 50, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1},
            {20, 3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0},
            {39, 0, 6, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0},
            {29, 7, 0, 5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1},
            {47, 0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1},
            {36, 0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0},
            {26, 5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1},
            {45, 0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1},
            {33, 0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1},
            {22, 4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1},
            {41, 0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1},
            {30, 8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1},
            {48, 0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1},
            {37, 0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1},
            {27, 6, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0},
            {46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0},
            {35, 0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1},
            {24, 4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1},
            {43, 0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1},
            {32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1},
            {50, 0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0},
            {39, 0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1},
            {28, 6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0},
            {47, 0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
            {36, 0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0},
            {26, 5, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1},
            {45, 0, 1, 6, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0},
            {34, 0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0},
            {22, 3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0},
            {40, 0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0},
            {30, 8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1},
            {49, 0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1},
            {37, 0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
            {27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1},
            {46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1},
            {35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1},
            {23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
            {42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
            {31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0},
            {21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1},
            {39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1},
            {28, 7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1},
            {48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1},
            {37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1},
            {25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1},
            {44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1},
            {33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
            {22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
            {40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
            {30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1},
            {49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1},
            {38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0},
            {27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1},
            {46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0},
            {35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0},
            {24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
            {42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
            {31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0},
            {21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1},
            {40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
            {28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0},
            {47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1},
            {36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1},
            {25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0},
            {43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1},
            {32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0},
            {22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0}
    };

    /**
     * 根据阴历取得对应的阳历日期(该日期必须在1936—2028年之间)
     *
     * @param date 阴历日期(字符串)
     * @return 返回对应的阳历日期
     * @throws Exception
     */
    public static Date getGregorianCalendar(String date) {
        Calendar c = getCalendar(date);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH) + 1;
        int day = c.get(Calendar.DAY_OF_MONTH);
        int index = year - 1936;
        int endIndex = month;

        if ((DATAS[index][1] != 0) && (month > DATAS[index][1])) {
            endIndex++;
        }

        int dayNum = 0;

        for (int i = 0; i < (endIndex - 1); i++) {
            dayNum += MONTH_DAYS[DATAS[index][4 + i]];
        }

        dayNum += day;
        dayNum += DATAS[index][0];

        int year_days = 365;

        if (isLeapYear(year)) {
            year_days = 366;
        }

        if (dayNum > year_days) {
            year++;
            dayNum -= year_days;
        }

        month = 1;

        int dayOfMonth[] = DAYS_MONTH[0];

        if (isLeapYear(year)) {
            dayOfMonth = DAYS_MONTH[1];
        }

        int i = 0;

        for (; i < 12; i++) {
            dayNum -= dayOfMonth[i];

            if (dayNum <= 0) {
                break;
            }

            month++;
        }

        day = dayOfMonth[i] + dayNum;

        return getDate(year + "-" + month + "-" + day);
    }

    /**
     * 根据阳历取得对应的阴历日期(该日期必须在1936—2028年之间)
     *
     * @param date 阳历日期(字符串)
     * @return 返回阴历日期
     * @throws Exception
     */
    public static Date getLunarCalendar(String date) {
        Calendar calendar = getCalendar(date);
        int year = calendar.get(Calendar.YEAR);
        int month = 1;
        int day;

        if ((year < 1936) || (year > 2028)) {
            return null;
        }

        int index = year - 1936;
        int l_days = DATAS[index][0];
        int day_year = calendar.get(Calendar.DAY_OF_YEAR);
        int days;

        if (day_year >= l_days) {
            days = day_year - l_days;
        } else {
            index--;
            year--;

            Calendar c = getCalendar(year + "-12-31");
            days = (c.get((Calendar.DAY_OF_YEAR)) + day_year) -
                    DATAS[index][0];
        }

        int i = 0;
        int day_num = 0;

        for (; i < 13; i++) {
            day_num += MONTH_DAYS[DATAS[index][i + 4]];

            if (day_num >= days) {
                break;
            }

            month++;
        }

        day = MONTH_DAYS[DATAS[index][i + 4]] - (day_num - days);

        if ((DATAS[index][1] != 0) && (month > DATAS[index][1])) {
            month--;
        }

        return getDate(year + "-" + month + "-" + day);
    }

    private static Calendar getCalendar(String date) {
        Date dd = getDate(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dd);

        return calendar;
    }

    private static Date getDate(String date) {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date dd = null;

        try {
            dd = format.parse(date);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return dd;
    }

    private static boolean isLeapYear(int year) {
        if ((year % 400) == 0) {
            return true;
        } else if ((year % 100) == 0) {
            return false;
        } else if ((year % 4) == 0) {
            return true;
        }

        return false;
    }
}


 

2
0
分享到:
评论

相关推荐

    java(阳历转换为农历).pdf

    Java是一种广泛使用的编程语言,通过使用Java语言,可以实现阳历日期到农历日期的转换。 知识点一:Java中的日期类 在Java中,日期类是java.util包下的一个类,提供了日期和时间相关的操作。Date类有多个构造函数...

    java阳历转农历

    Java阳历转农历类可以将公历日期转换为农历日期,提供了一个便捷的方式来获取农历日期。 在 Java 中,实现阳历转农历需要使用到 Calendar 和 Date 类。Calendar 类提供了一个抽象的日历模型,可以用来计算日期的年...

    java 万年历(农历和阳历的互换)

    在Java编程语言中,开发一个万年历系统,特别是涉及到农历和阳历的转换,是一项具有挑战性的任务。农历和阳历是两种不同的日期表示方式,理解和实现它们之间的转换需要深入理解日期计算的原理和算法。 阳历,也称为...

    用51单片机实现公历与农历转换C

    在本文中,我们将深入探讨如何使用51...总的来说,51单片机上的公历与农历转换是嵌入式系统中的一个典型应用,通过理解和实现这个项目,不仅可以提升对日期处理算法的理解,也能加深对51单片机及C语言编程的掌握。

    VC++ 阳历与农历转换程序,也就是公历与阴历的相互转换,部分代码是从网上找到的,重新修正了一大部分代码,大家也可以把它当作控件来使用,因为我不初就是想想这样一个程序,奉献给大家。

    本项目涉及的是一个使用VC++实现的阳历与农历转换程序,它能够进行公历(阳历)和阴历(农历)之间的相互转换。这种功能在处理中国传统节日或者需要考虑农历的日程管理软件中非常实用。 首先,我们要理解阳历和农历...

    阳历and阴历转换.rar_MATLAB 阴历_MATLAB 阴历阳历_阴历阳历

    在提供的“阳历and阴历转换.rar”压缩包中,包含了一个利用MATLAB实现的阴历与阳历转换工具。这个工具对于那些需要处理与日期相关的程序,特别是在中国或其他使用农历的国家和地区,是非常有用的。 首先,我们要...

    java 阳历转换农历

    下面将详细介绍如何通过一个Java类来实现阳历到农历的转换。 #### 类结构与属性 1. **类名**:`Lunar` - 这个类用于封装所有与农历相关的操作和数据。 2. **私有属性**: - `int year`: 表示农历的年份。 - `...

    一个比较综合的阴历和阳历转换的java源程序

    这份Java源代码为开发者提供了一个全面且功能强大的阴历与阳历转换工具,不仅涵盖了基础的日期转换,还集成了用户界面设计、事件处理机制以及历法算法的实现。通过深入学习和理解这份代码,不仅可以掌握Java中日期...

    MATLAB实现阳历、阴历与干支历的日期转换

    在MATLAB编程环境中,我们可以创建一个名为`clsdate.m`的函数来实现阳历、阴历和干支历之间的转换。这个功能强大的工具对于研究中国传统文化、天文历法或者进行相关数据分析都极其有用。以下是对这个`clsdate.m`函数...

    PHP实现公历和农历之间的转换

    PHP实现公历和农历之间的转换 一、开发环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。 二、主要技术 本实验主要使用JS类库和公历转农历的类库实现。

    Qt/C++实现阳历转农历功能

    在IT行业中,开发一款应用程序以实现阳历到农历的转换是一项常见的...通过合理的设计和编程,我们可以构建一个用户友好且功能强大的日期转换工具。同时,这也是一次深入学习C++编程、Qt库使用以及日期处理的好机会。

    QT实现农历转换(C++)

    要实现农历和公历之间的转换,我们需要一个转换算法。一个常用的算法是“陈永宁算法”,它可以准确地计算出1900年到2100年间的农历日期。这个算法涉及到天干地支、节气和农历节日的计算。天干地支是中国传统的纪年、...

    java 农历与公历互转(支持1981-2100)

    在Java编程中,农历与公历的转换是一个常见的需求,特别是在处理中国传统节日或者个人出生日期时。本项目提供了一个PHP工具类的Java实现,支持1981年至2100年的农历与公历互转功能,同时也包含了计算距离最近生日...

    纯JAVA计算日期的农历节日、公历节日代码!

    这个主题的核心在于如何利用Java API来实现农历和公历节日的转换与判断。以下是一些关键的知识点: 1. **Java日期时间API**: - Java 8之前,我们主要使用`java.util.Date`和`java.util.Calendar`类来处理日期和...

    51单片机公历与农历转换C语言实现,和vc编译器中实现

    C语言实现公历与农历转换意味着我们需要编写能够处理日期计算的函数,这涉及到数学和逻辑推理。 1. **日期和星期的判断**:在公历中,确定某一年的哪一天是星期几通常使用蔡勒公式或者Doyle-Trundy算法。这些算法...

    阳历阴历的转换

    一年通常有12个月,但为了使阴历年与阳历年保持大致同步,每隔几年会插入一个闰月。因此,阴历年一般比阳历年少11天左右。 转换阳历与阴历涉及到复杂的天文计算。阳历转阴历需要考虑以下几点: 1. 年份转换:阳历的...

    中国农历,阳历互换(Java 源代码)

    总之,处理农历和阳历的转换在Java编程中是一个挑战,但通过第三方库和自定义算法,可以有效地解决这个问题。在实际项目中,确保选择合适的库,并根据需求进行适当的测试,以确保转换的准确性和效率。

    带公历和农历相互转换的生日选择器

    这种情况下选择生日就有点牵强,本人最近在做的一个项目中需要用户输入自己的生日,既可选择公历,也可选择农历,经过研究做出了这种生日选择器,可以任意切换公历和农历,公历农历相互转换的算法90%是本人原创,...

    用51单片机实现公历与农历、星期的转换

    在现代社会中,公历(阳历)与农历(阴历)是我们常用的两种历法体系。公历基于地球绕太阳公转周期设定,而农历则依据月亮绕地球公转周期进行调整。两者间的转换不仅具有文化意义,还涉及到日常生活的诸多方面,特别...

    支持各种编程语言公历(阳历) 农历(阴历)转换

    公历(阳历) 农历(阴历)转换,支持时间段从 1900-2100 如果需要更长的时间段,利用 generate.htm 生成的数据即可。 支持各种编程语言 C#,java,Objective-C,php,Python,javascript(nodejs),C/C++,ruby,swift,golang 等...

Global site tag (gtag.js) - Google Analytics