公历闰年和农历闰月的计算方法

世界上的历法共有三类

1、阳历,就是以地球绕太阳运转一圈的时间为一年,年的月数和月的日数可人为规定;又称为公历。

阳历是根据太阳的运转制定的,太阳的运转周期是固定的,因此阳历的每个月的天数也是固定的。

2、阴历,就是以月球绕地球运转一圈的时间为一个月,只有年的月数可以人为规定;(已改进为阴阳历)

阴历是中国传统历法之一,也被称为旧历、汉历、古历等,辛亥革命后改用西方太阳历(公历),而现代叫法的农历属于阴阳合历。

3、阴阳历,就是以月球平均绕地球转一圈的时间为一月,但通过设置闰月,使一年的平均天数又与地球平均绕太阳转一圈的时间相等,又称农历(农历是以阴历为基础,融合阳历成分而形成的一种历法。)

农历是按照月亮的运转制定的,月亮的运转周期是29.5天左右,因此农历的一个月可能是29天或者30天。
此外,农历有大月和小月之分,大月有30天,小月有29天。这是为了调整历法和实际季节之间的差距,使得农历的年与年之间更加准确对应。

农历是我国传统历法,又有阴历、华历、夏历、汉历、中历等名称,但农历并不是阴历而是一种阴阳合历,取月相的变化周期即朔望月为月的长度,参考太阳回归年为年的长度,通过设置二十四节气以及闰月以使平均历年与回归年相适应。

闰月和闰年有什么区别?

1、闰年是公历的名词。由于地球绕日运行周期为365天5小时48分46秒,即一回归年。
公历的平年只有365日,比回归年短约0.2422日,每四年累积约一天,把这一天加于2月末,使当年时间长度变为366日,这一年就为闰年。闰年是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。

闰年是固定的,公历规定每400年97闰,也就是能被4整除的年就是闰年,每四年一次,闰年比平年多一天,也就是366天。
这一年的2月是29天;其余年份的2月是28天。除了2月以外,其它月份的天数没有平年和闰年的区别。

2、闰月是中国的农历的名词。由于月亮的周期比太阳的周期略短,所以农历的一年比阳历的一年要短约11天左右。
为了解决这个问题,农历引入了闰月的概念。闰月是在某些年份的某个月份中插入的一个额外月份,使得该年的总月数变成13个。

每隔3年左右就有一个闰月,有闰月的每年大概是384天。

列举近年的闰年闰月时间

年份 生肖 公历闰年 总天数 农历闰月 闰月天数 总天数
1990 365 闰五月 29 384
1991 365 354
1992 闰年 366 354
1993 365 闰三月 29 383
1994 365 355
1995 365 闰八月 29 384
1996 闰年 366 354
1997 365 355
1998 365 闰五月 29 384
1999 365 354
2000 闰年 366 354
2001 365 闰四月 29 384
2002 365 354
2003 365 355
2004 闰年 366 闰二月 29 384
2005 365 354
2006 365 闰七月 29 385
2007 365 354
2008 闰年 366 354
2009 365 闰五月 29 384
2010 365 354
2011 365 354
2012 闰年 366 闰四月 29 384
2013 365 355
2014 365 闰九月 29 384
2015 365 354
2016 闰年 366 355
2017 365 闰六月 30 384
2018 365 354
2019 365 354
2020 闰年 366 闰四月 29 384
2021 365 354
2022 365 355
2023 365 闰二月 29 384
2024 闰年 366 354
2025 365 闰六月 29 384
2026 365 354
2027 365 354
2028 闰年 366 闰五月 29 384

Java闰年闰月的计算方法

引入依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.5</version>
</dependency>

Java代码:

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.chinese.LunarInfo;

public class ChineseMonth {
    private static final String[] MONTH_NAME = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};

    public static void main(String[] args) {
        for (int year = 1990; year < 2029; year++) {
            // 生肖
            String zodiac = DateUtil.getChineseZodiac(year);
            // 公历闰年
            String leapYear = DateUtil.isLeapYear(year) ? "闰年" : "";
            String yearDays = DateUtil.lengthOfYear(year) + "";
            // 农历闰月
            int month = LunarInfo.leapMonth(year);
            String chineseMonthName = month > 0 ? "闰" + MONTH_NAME[month - 1] + "月" : "";
            String chineseMonthDays = month > 0 ? LunarInfo.leapDays(year) + "" : "";
            String chineseyearDays = LunarInfo.yearDays(year) + "";
            System.out.println("|" + year + "|" + zodiac + "|" + leapYear + "|" + yearDays + "|" + chineseMonthName + "|" + chineseMonthDays + "|" + chineseyearDays);
        }
    }
}
posted @ 2023-01-04 15:36  空还是空  阅读(2195)  评论(2编辑  收藏  举报