`
hwpok
  • 浏览: 251913 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

阳历转农历(转)

阅读更多
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package org.common.website.util;

/**  

 * 
@author wangmj   

 *         编写时间:2005-8-2 <br />  

 *         所在的project名称:00newframe <br />  

 *         类的名称为:Lunar.java <br />  

 
*/

import java.util.Calendar;

import java.util.Date;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

// import com.veriweb.util.OurLog;

public final class Lauar
{
    
    
private static Log      log        = LogFactory.getLog(Lauar.class);
    
    
private static int      monCyl, dayCyl, yearCyl;
    
    
private static int      year, month, day;
    
    
private static boolean  isLeap;
    
    
private static int[]    lunarInfo  = { 0x04bd80x04ae00x0a5700x054d5,

                                       
0x0d2600x0d9500x165540x056a0,
            
0x09ad00x055d20x04ae0,

            
0x0a5b60x0a4d00x0d2500x1d2550x0b5400x0d6a00x0ada2,

            
0x095b00x149770x049700x0a4b00x0b4b50x06a500x06d40,

            
0x1ab540x02b600x095700x052f20x049700x065660x0d4a0,

            
0x0ea500x06e950x05ad00x02b600x186e30x092e00x1c8d7,

            
0x0c9500x0d4a00x1d8a60x0b5500x056a00x1a5b40x025d0,

            
0x092d00x0d2b20x0a9500x0b5570x06ca00x0b5500x15355,

            
0x04da00x0a5d00x145730x052d00x0a9a80x0e9500x06aa0,

            
0x0aea60x0ab500x04b600x0aae40x0a5700x052600x0f263,

            
0x0d9500x05b570x056a00x096d00x04dd50x04ad00x0a4d0,

            
0x0d4d40x0d2500x0d5580x0b5400x0b5a00x195a60x095b0,

            
0x049b00x0a9740x0a4b00x0b27a0x06a500x06d400x0af46,

            
0x0ab600x095700x04af50x049700x064b00x074a30x0ea50,

            
0x06b580x055c00x0ab600x096d50x092e00x0c9600x0d954,

            
0x0d4a00x0da500x075520x056a00x0abb70x025d00x092d0,

            
0x0cab50x0a9500x0b4a00x0baa40x0ad500x055d90x04ba0,

            
0x0a5b00x151760x052b00x0a9300x079540x06aa00x0ad50,

            
0x05b520x04b600x0a6e60x0a4e00x0d2600x0ea650x0d530,

            
0x05aa00x076a30x096d00x04bd70x04ad00x0a4d00x1d0b6,

            
0x0d2500x0d5200x0dd450x0b5a00x056d00x055b20x049b0,

            
0x0a5770x0a4b00x0aa500x1b2550x06d200x0ada0 };
    
    
private static int[]    solarMonth = { 312831303130313130,
            
31,

            
3031                    };
    
    
private static String[] Gan        = { """""""""""""",
            
"",

            
""""                  };
    
    
private static String[] Zhi        = { """""""""""""",
            
"",

            
""""""""        };
    
    
private static String[] Animals    = { """""""""""""",
            
"",

            
""""""""        };
    
    
private static int[]    sTermInfo  = { 021208424676383685337,
            
107014,

            
128867150921173149195551218072240693263343285989,

            
308563331033353350375494397447419210440795462224,

            
483532504758            };
    
    
private static String[] nStr1      = { """""""""""""",
            
"",

            
""""""             };
    
    
private static String[] nStr2      = { """""廿"""" " };
    
    
private static String[] monthNong  = { """""""""""""",

                                       
"""""""""十一""十二" };
    
    
private static String[] yearName   = { """""""""""""",

                                       
"""""" };
    
    
public Lauar()
    {

    }
    
    
// ====================================== 传回农历 y年的总天数
    
    
private static int lYearDays(int y)
    {
        
        
int i;
        
        
int sum = 348// 29*12
        
        
for (i = 0x8000; i > 0x8; i >>= 1)
        {
            
            
// OurLog.debug("i="+i);
            
            sum 
+= (lunarInfo[y - 1900& i) == 0 ? 0 : 1// 大月+1天
            
        }
        
        
return (sum + leapDays(y)); // +闰月的天数
        
    }
    
    
// ====================================== 传回农历 y年闰月的天数
    
    
private static int leapDays(int y)
    {
        
        
if (leapMonth(y) != 0)
            
            
return ((lunarInfo[y - 1900& 0x10000== 0 ? 29 : 30);
        
        
else
            
            
return (0);
        
    }
    
    
// ====================================== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
    
    
private static int leapMonth(int y)
    {
        
        
return (lunarInfo[y - 1900& 0xf);
        
    }
    
    
// ====================================== 传回农历 y年m月的总天数
    
    
private static int monthDays(int y, int m)
    {
        
        
return ((lunarInfo[y - 1900& (0x10000 >> m)) == 0 ? 29 : 30);
        
    }
    
    
// ====================================== 算出农历, 传入日期物件, 传回农历日期物件
    
    
// 该物件属性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
    
    
private static void Lunar1(Date objDate)
    {
        
        
int i, leap = 0, temp = 0;
        
        
// int monCyl,dayCyl,yearCyl;
        
        
// int year,month,day;
        
        
// boolean isLeap;
        
        Calendar cl 
= Calendar.getInstance();
        
        cl.set(
1900031); // 1900-01-31是农历1900年正月初一
        
        Date baseDate 
= cl.getTime();
        
        
// 1900-01-31是农历1900年正月初一
        
        
int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000); // 天数(86400000=24*60*60*1000)
        
        
// System.out.println(offset);
        
        dayCyl 
= offset + 40// 1899-12-21是农历1899年腊月甲子日
        
        monCyl 
= 14// 1898-10-01是农历甲子月
        
        
// 得到年数
        
        
for (i = 1900; i < 2050 && offset > 0; i++)
        {
            
            temp 
= lYearDays(i); // 农历每年天数
            
            offset 
-= temp;
            
            monCyl 
+= 12;
            
        }
        
        
if (offset < 0)
        {
            
            offset 
+= temp;
            
            i
--;
            
            monCyl 
-= 12;
            
        }
        
        year 
= i; // 农历年份
        
        yearCyl 
= i - 1864// 1864年是甲子年
        
        leap 
= leapMonth(i); // 闰哪个月
        
        isLeap 
= false;
        
        
for (i = 1; i < 13 && offset > 0; i++)
        {
            
            
// 闰月
            
            
if (leap > 0 && i == (leap + 1&& isLeap == false)
            {
                
                
--i;
                
                isLeap 
= true;
                
                temp 
= leapDays(year);
                
            }
            
else
            {
                
                temp 
= monthDays(year, i);
                
            }
            
            
// 解除闰月
            
            
if (isLeap == true && i == (leap + 1))
                
                isLeap 
= false;
            
            offset 
-= temp;
            
            
if (isLeap == false)
                
                monCyl
++;
            
        }
        
        
if (offset == 0 && leap > 0 && i == leap + 1)
            
            
if (isLeap)
            {
                
                isLeap 
= false;
                
            }
            
else
            {
                
                isLeap 
= true;
                
                
--i;
                
                
--monCyl;
                
            }
        
        
if (offset < 0)
        {
            
            offset 
+= temp;
            
            
--i;
            
            
--monCyl;
            
        }
        
        month 
= i; // 农历月份
        
        day 
= offset + 1// 农历天份
        
        
// System.out.println(day);
        
    }
    
    
private static int getYear()
    {
        
        
return (year);
        
    }
    
    
private static int getMonth()
    {
        
        
return (month);
        
    }
    
    
private static int getDay()
    {
        
        
return (day);
        
    }
    
    
private static int getMonCyl()
    {
        
        
return (monCyl);
        
    }
    
    
private static int getYearCyl()
    {
        
        
return (yearCyl);
        
    }
    
    
private static int getDayCyl()
    {
        
        
return (dayCyl);
        
    }
    
    
private static boolean getIsLeap()
    {
        
        
return (isLeap);
        
    }
    
    
// ============================== 传入 offset 传回干支, 0=甲子
    
    
private static String cyclical(int num)
    {
        
        
return (Gan[num % 10+ Zhi[num % 12]);
        
    }
    
    
// ====================== 中文日期
    
    
private static String cDay(int d)
    {
        
        String s;
        
        
switch (d)
        {
            
            
case 10:

                s 
= "col
分享到:
评论

相关推荐

    java阳历转农历

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

    MySQL阳历转农历SQL实现

    MySQL阳历转农历SQL实现 在mysql上通过SQL语言实现的阳历转农历, 年份跨越从1900到2049年.

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

    总结,实现阳历转农历功能的关键在于找到或编写准确的农历转换算法,并将其集成到Qt的C++环境中。通过合理的设计和编程,我们可以构建一个用户友好且功能强大的日期转换工具。同时,这也是一次深入学习C++编程、Qt库...

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

    java阳历转换为农历是指将公历日期转换为农历日期的过程。Java是一种广泛使用的编程语言,通过使用Java语言,可以实现阳历日期到农历日期的转换。 知识点一:Java中的日期类 在Java中,日期类是java.util包下的一...

    c#农历转公历以及公历转农历

    农历,也称为阴历,是中国和其他东亚国家传统使用的历法,而公历则是国际上广泛采用的格里高利历。本文将详细介绍如何在C#中实现农历与公历之间的转换,特别关注1902年至2100年这段时期。 首先,我们需要理解农历和...

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

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

    SQLSERVER 公历转农历

    SQLSERVER 实现公历转农历,可用于农历生日提醒!

    公历转农历delphi源码

    而农历,又称阴历,是中国传统的一种历法,它的月份和日期与月亮的盈亏周期相对应。公历和农历之间的转换涉及到天文计算,包括月亮的月相、闰年规则以及农历的月首定义(即节气)。 在Delphi中,我们可以构建一个...

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

    农历,又称为阴历,是中国传统的历法,根据月亮的盈亏周期来确定月份,同时也考虑太阳回归年的周期来调整年份,使得农事活动与季节相符。 在51单片机上实现公历与农历的转换,主要涉及以下几个步骤: 1. **公历到...

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

    3. **农历算法**:阴历转换涉及到复杂的农历算法,包括计算节气、确定闰月、农历日期到阳历的转换等。这通常需要理解中国古代天文历法,例如二十四节气、置闰规则等。 4. **自定义函数**:在MATLAB中编写自定义函数...

    公历农历(阳历阴历)对照表(1900年-2100年)

    公历农历(阳历阴历)对照表(1900年-2100年),客户生日提醒,各种根据身份证转换阴历生日之类的业务场景必备神器。公历农历(阳历阴历)对照表(1900年-2100年),客户生日提醒,各种根据身份证转换阴历生日之类的业务场景...

    阳历转阴历农历mysql

    直接执行语句就可以建立表,函数,存储过程,运行存储过程`iniialcalendar`,在`calendar` 表中生成阳历对应阴历。 已分好年月日了。

    mysql阳历转农历实现逻辑代码

    mysql阳历转农历的mysql 函数mysql阳历转农历的mysql 函数mysql阳历转农历的mysql 函数

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

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

    公历转农历的控件带例子

    本压缩包提供的“公历转农历的控件带例子”是一个专门用于进行这种转换的组件,方便开发者快速集成到自己的项目中。 这个控件可能是用VB(Visual Basic)语言编写的,VB是一种广泛使用的编程语言,尤其适合开发...

    (2001-2049)阳历转阴历程序

    2001-2049阳历转阴历程序调用函数void conversion(uchar year,uchar month,uchar day),不在乎硬件。 经过实践检验,公历日(即当年春节)离当年元旦的天数在元旦之后,那么农历实际11月26至11月30/31,而显示为12月...

    公历转换农历的算法(JavaScript)

    公历转换农历的算法(JavaScript) 公历转换农历的算法是指将公历日期转换为农历日期的过程。公历是国际通用的日期系统,而农历则是中国传统的日期系统。农历的日期系统与公历不同,它的日期是根据月亮的周期变化而...

    阳历转阴历程序

    【标题】:“阳历转阴历程序”是一个用于将公历日期转换为农历日期的应用程序。这个程序可能包含了源码和必要的控件资源,帮助开发者或用户了解如何进行日期转换。 【描述】:阳历,又称公历,是国际通用的日历系统...

    公历农历黄历转换DLL(含使用说明)

    "公历农历黄历转换DLL(含使用说明)"是一个专为处理公历、农历以及黄历转换的软件组件,它提供了1900年至2049年之间日期的精确转换,覆盖了近150年的范围。这个组件包含了一个动态链接库(DLL),这是一种可重用的...

    阳历转阴历C代码

    阳历转阴历C代码,做万年历用,到2099年。 阳历转阴历C代码,做万年历用,到2099年。 阳历转阴历C代码,做万年历用,到2099年。

Global site tag (gtag.js) - Google Analytics