搜档网
当前位置:搜档网 › 关于阳历转换为阴历和星期的单片机函数

关于阳历转换为阴历和星期的单片机函数

关于阳历转换为阴历和星期的单片机函数
关于阳历转换为阴历和星期的单片机函数

关于阳历转换为阴历和星期的单片机函数

From:hells

参加比赛培训的时候老师让做基于DS1302的日历,但是大家都知道DS1302只能显示阳历的日期而不能显示阴历,还有一个致命的弱点就是星期和日期不同步,还需要自己写算法计算,下面是我在网上找的一些资源,在改动一些代码之后用在单片机上的,用的时候直接拿过来用就可以。以后会整理一下其他的算法上传(本次是基于查表法的)

#include"nongli.h" //包含的头文件,主要包含一些声明定义

int code monthTotal[13] = {0,31,59,90,120,151,181,212,243,273,304,334,365};

int NM=0,ND=0;

//数据

unsigned char code week_code[12]={0,3,3,6,1,4,6,2,5,0,3,5};

unsigned long code lunar200y[199] = {

0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D,0x09AD42,

0x24AEB6,0x04AE4A,/*1901-1910*/

0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37,0x095B4B,

0x749BC1,0x049754,/*1911-1920*/

0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742,0x2497B7,

0x04974A,0x664B3E,/*1921-1930*/

0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B,0x7C96BF,

0x0C9553,0x0D4A48,/*1931-1940*/

0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6,0x0A954A,

0x7B4ABD,0x06CA51,/*1941-1950*/

0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F,0x0E9552,

0x06AA48,0x6AD53C,/*1951-1960*/

0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549,0x75AABE,

0x056A51,0x096D46,/*1961-1970*/

0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452,0x0B6A47,

0x696D3C,0x095B50,/*1971-1980*/

0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D,0x0AB651,

0x093746,0x5497BB,/*1981-1990*/

0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647,0x5936BC,

0x092E50,0x0C9645,/*1991-2000*/

0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,

0x5C95BA,0x0A954E,/*2001-2010*/

0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,

0x0A9345,0x474AB9,/*2011-2020*/

0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,

0x0D534D,0x05AA43,/*2021-2030*/

0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,

0x5DAA38,0x0B5A4C,/*2031-2040*/

0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E, 0x0ADA42,0x355B37,/*2041-2050*/

0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638, 0x0AAE4C,0x092E42,/*2051-2060*/

0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43, 0x452EB7,0x052D4B,/*2061-2070*/

0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C, 0x052B42,0x3A93B6,/*2071-2080*/

0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738, 0x0D264A,0x8E933E,/*2081-2090*/

0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541, 0x2D92B5 /*2091-2099*/

};

//转换成农历的函数,再用的时候直接在main函数里面调用本函数即可

void toLunar(int year,int month,int day)

{

long bySpring,bySolar,daysPerMonth;

int index,flag;

//bySpring 记录春节离当年元旦的天数。

//bySolar 记录阳历日离当年元旦的天数。

if( ((lunar200y[year-1901] & 0x0060) >> 5) == 1)

bySpring = (lunar200y[year-1901] & 0x001F) - 1;

else

bySpring = (lunar200y[year-1901] & 0x001F) - 1 + 31;

bySolar = monthTotal[month-1] + day - 1;

if( (!(year % 4)) && (month > 2))

bySolar++;

//daysPerMonth记录大小月的天数29 或30

//index 记录从哪个月开始来计算。

//flag 是用来对闰月的特殊处理。

//判断阳历日在春节前还是春节后

if (bySolar >= bySpring) {//阳历日在春节后(含春节那天)

bySolar -= bySpring;

month = 1;

index = 1;

flag = 0;

if( ( lunar200y[year - 1901] & (0x80000 >> (index-1)) ) ==0)

daysPerMonth = 29;

else

daysPerMonth = 30;

while(bySolar >= daysPerMonth) {

bySolar -= daysPerMonth;

index++;

if(month == ((lunar200y[year - 1901] & 0xF00000) >> 20) ) {

flag=!flag;

if(flag == 0)

month++;

}

else

month++;

if( ( lunar200y[year - 1901] & (0x80000 >> (index-1)) ) ==0)

daysPerMonth=29;

else

daysPerMonth=30;

}

day = bySolar + 1;

}

else

{ //阳历日在春节前bySpring -= bySolar;

year--;

month = 12;

if ( ((lunar200y[year - 1901] & 0xF00000) >> 20) == 0)

index = 12;

else

index = 13;

flag = 0;

if( ( lunar200y[year - 1901] & (0x80000 >> (index-1)) ) ==0)

daysPerMonth = 29;

else

daysPerMonth = 30;

while(bySpring > daysPerMonth) {

bySpring -= daysPerMonth;

index--;

if(flag == 0)

month--;

if(month == ((lunar200y[year - 1901] & 0xF00000) >> 20))

flag =!flag;

if( ( lunar200y[year - 1901] & (0x80000 >> (index-1)) ) ==0)

daysPerMonth = 29;

else

daysPerMonth = 30;

}

day = daysPerMonth - bySpring + 1;

}

ND = day; //返回的农历的日

NM = month; //返回的农历的月

// NY = year; //返回的农历的年,

}

void displayweek(void) //通过日期计算周,达到同步

{

unsigned char temp1,temp2,year1,month,day;

year1 =time_buf1[1]&0x7f; //加载年月日数据1-199(即1900+),如为BCD则需转为十进制month=time_buf1[2];

day =time_buf1[3];

//if(time_buf1[1]>>7==0)

if(year==20) //判断是否为21世纪如果是21世纪则,如果不想显示年的前两位可以把这一句注释掉,

//用上一句

year1+=100; //如果为21世纪,年份数加100

temp1=year1/4;//所过闰年数只算1900年之后的

temp2=(year1+temp1)%7;

temp2=temp2+day+week_code[month-1];

if(year1%4==0&&month<3)

temp2-=1; //如果是闰年但不到3月则减一天

week=temp2%7; //将星期数据写到指定星期变量week,注意星期日数值为0

}

/**********************头文件*********************************/

#ifndef __NONGLI_H__

#define __NONGLI_H__

extern int code monthTotal[13];

//extern unsigned int code lunar200y[199];

extern int NY,NM,ND;

void toLunar(int year,int month,int day);//阳历换算成阴历的函数

void displayweek(void)

#endif

阳历转化成农历法

阳历转化成农历法

————————————————————————————————作者:————————————————————————————————日期:

c++中怎样将阳历转化成农历 已关闭20[ 标签:c++, 阳历, 农历 ] 小^鱼、2011-05-03 11:06 推荐答案 一、原理篇 1.公历转换农历的算法 公历(Gregorian Calendar)与农历(Chinese Lunar Calendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。 比较常用并且比较简单的公历转换农历算法就是查表方法。首先要保存公历农历的转换信息:以任何一年作为起点,把从这一年起若干年的农历信息保存起来(在我的C++类中,是从1900年作为起点的。选择一个起始点的思想十分重要,在下面的干支纪法和二十四节气中也体现到了)。回想一下,我们平时是怎样来转换公历农历的呢?是查阅历书,历书中有每一天的公历农历,直接一查就可以了。那么我们可不可以也这样做呢?当然可以,但是这样做要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。如何简化呢? 要保存一年的信息,其实只要两个信息就可以了:(1)农历每个月的大小;(2)今年是否有闰月,闰几月以及闰月的大小。用一个整数来保存这些信息就足够了。具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉了12位,再用低四位来表示闰月的月份,没有闰月记为0。比如说,2000年的信息数据是0x0c960,转化成二进制就是1100100101100000,表示的含义是1、2、5、8、10、11月大,其余月小,低四位为0说明没有闰月。2001年的农历信息数据是0x0d954,其中的4表示该年闰4月,月份大小信息就是0x0d95,具体的就是1、2、4、5、8、10、12月大,其余月小。这样就可以用一个数组来保存这些信息。在我的C++类中是用m_lunarInfo这个数组来保存这些信息的。 下面就是公历转换成农历的具体算法: (1)计算所求时间到起始年正月初一的天数。 (2)从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止。此时,m_lunarInfo的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月。如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月。剩余的天数就是农历日。(具体实现时有所改进。) 2.利于泰勒公式巧算星期 在应用数学中有一个计算某一天是星期几的公式,这就是泰勒公式。公式如下: w = [c÷4] - 2c + y + [y÷4] + [26(m+1)÷10] + d - 1,其中w就是所求日期的星期数。如果求得的数大于(小于)7,就减去(加上)7的倍数,直到余数小于7为止。式子中c是指公

公历和农历之间如何转换

公历和农历之间如何转换? 很多人都一直在找换阴阳历的公式。我也尝试过。曾读过「高平子」天文前辈所着「学历散论」了解古历的变更和阴阳历的缺陷。才知道由於月球转动的不稳定不规则,确定无公式可寻。这也是古代中国每百年必改历的原因。 阴历最大的问题是在如何置闰。好像不难,因为阴历基本法则如下: * 月朔日即是初一 * 月以中气得名 * 以包含雨水中气月为正月,即是「寅」月 * 月无中气者为闰月,以前月同名 如果,日月转动循还有规则的话,推演一套阴阳历转换的公式并不难。问题在有时一个太阴月比一个太阳月还要长。如此一个太阴月就有可能包括两个中气。此双中气月後的阴历月名就全部乱掉了,直到下一个「假」闰月後才调整过来。 一般人接触到的阴阳历是民用历法,它是政府颁令的以东经120度计算的历法或称中原标准时间或北京时。如果,我们用不同时区、不同经度为子午线来重新计算阴阳历,民用历法的置闰法则出了很大的问题。不同时区的闰月可能落在不同月。换言之,在一百年内,任何两个时区的闰月顺序模式是会不相同的。 高平子前辈书中提到了「历理置闰法」。如果应用历理置闰法到不同时区,则所有不同时区的闰月都落在相同月。如此不同时区、不同经度的阴

阳历置闰之问题就消失了。民用置闰和历理置闰的不同是: * 在民用置闰,如果月朔日和中气同一天,则该阴历月包含那个中气。 * 在历理置闰,如果月朔日和中气同一天,月朔日时间必须在中气时间之前,则该阴历月才包含那个中气。 简言之,民用置闰比较月朔和中气日期;历理置闰比较月朔和中气日期、时、分、秒。由此可知,没有精确的太阳和月亮的时间数字,阴历的闰月可能会排错了。 基於这些理由,我着手寻找天文公式计算精确的太阳和月亮在纬度的时间。当年没有网路,发了大半年於美国南加州各大图书馆及大学,找寻答案。1993年出版了「中美天文万年历」一书。书中精确的天文日月时间只从1900到2010年。因恐2011後时间误差超过一分钟,不够精确,不敢印出。今年2002从网路资讯,确定太阳和月亮时间的精确度後,百忙中重新整理资料,提供给需要阴阳历转换公式的朋友。 整理出的太阳和月亮时间数字是从西元1年到2246年。有历理和中国民用两套历法。数字内容清清楚楚的看出民用历法的敝端。例如,从西元1600年到2246年,民用历法双中气的阴历月有22个,历理历法只有5个。民用历法甚至在2033、2128和2242年中,三个月之间居然跑出两个双中气;换言之,三个月中多出两个「假」闰月。前後12个阴历月中有三个闰月,闰月的去留造成许多学者的讨论和困恼。历理历法在此三年中,却没有发现到双中气阴历月。闰月的去留只要把双中气月後的「假」闰月取消,则历理历法近乎於完美。 由此可知,民用历法问题很大,应该废除。上次阴阳历重大改历在1645

公历和农历转换算法详解

公历和农历转换算法详解 //C51写的公历转农历和星期 #define uchar unsigned char #define uint unsigned int #include /* 公历年对应的农历数据,每年三字节, 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天) 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期 */ code uchar year_code[597] = { 0x04,0xAe,0x53, //1901 0 0x0A,0x57,0x48, //1902 3 0x55,0x26,0xBd, //1903 6 0x0d,0x26,0x50, //1904 9 0x0d,0x95,0x44, //1905 12 0x46,0xAA,0xB9, //1906 15 0x05,0x6A,0x4d, //1907 18 0x09,0xAd,0x42, //1908 21 0x24,0xAe,0xB6, //1909 0x04,0xAe,0x4A, //1910 0x6A,0x4d,0xBe, //1911 0x0A,0x4d,0x52, //1912 0x0d,0x25,0x46, //1913 0x5d,0x52,0xBA, //1914 0x0B,0x54,0x4e, //1915 0x0d,0x6A,0x43, //1916 0x29,0x6d,0x37, //1917 0x09,0x5B,0x4B, //1918 0x74,0x9B,0xC1, //1919 0x04,0x97,0x54, //1920 0x0A,0x4B,0x48, //1921 0x5B,0x25,0xBC, //1922 0x06,0xA5,0x50, //1923 0x06,0xd4,0x45, //1924 0x4A,0xdA,0xB8, //1925 0x02,0xB6,0x4d, //1926 0x09,0x57,0x42, //1927 0x24,0x97,0xB7, //1928

公历转农历EXCEL宏讲解

Public Function NongLi(Optional XX_DATE As Date) Dim MonthAdd(11), NongliData(99), TianGan(9), DiZhi(11), ShuXiang(11), DayName(30), MonName(12) Dim curTime, curYear, curMonth, curDay Dim GongliStr, NongliStr, NongliDayStr Dim i, m, n, k, isEnd, bit, TheDate '??è?μ±?°?μí3ê±?? curTime = XX_DATE 'ìì?é??3? TianGan(0) = "?×" TianGan(1) = "òò" TianGan(2) = "±?" TianGan(3) = "??" TianGan(4) = "?ì" TianGan(5) = "?o" TianGan(6) = "?y" TianGan(7) = "Dá" TianGan(8) = "èé" TianGan(9) = "1?" 'μ??§??3? DiZhi(0) = "×ó" DiZhi(1) = "3ó" DiZhi(2) = "òú" DiZhi(3) = "??" DiZhi(4) = "3?" DiZhi(5) = "?è" DiZhi(6) = "??" DiZhi(7) = "?′" DiZhi(8) = "éê" DiZhi(9) = "ó?" DiZhi(10) = "D?" DiZhi(11) = "o¥" 'ê??à??3? ShuXiang(0) = "êó" ShuXiang(1) = "?£" ShuXiang(2) = "?¢" ShuXiang(3) = "í?" ShuXiang(4) = "áú" ShuXiang(5) = "é?" ShuXiang(6) = "?í"

阴历阳历转换计算公式

1、阳历日期推算阴历日期的方法: 前已述及阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月 为十六日),以月晦为二十九日(大月为三十日)。 如要知道1984年6月8日是阴历几日?可以利用公式推算阴历日期: 设:公元年数-1977(或1901)=4Q+R 则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n (注:式中Q、R、n均为自然数,R<4) 例:1994年5月7日的阴历日期为: 1994-1977=17=4×4+1 故:Q=4,R=1 则:5月7日的阴历日期为: 14×4+10.6(1+1)+(31+28+31+31+7)-29.5n =204.2- 29.5n 然后用29.5去除204.2得商数 6......27.2,6即是n值,余数27即是阴历二十七日2.公历换算为农历 二十四节气在黄道上的位置是固定的,但各年有平年和闰年之分,就使得回归年天数与 实际天数不等,每年在日历上可差一天。这样可以将阴历经过任意整回归年在现在的日历上 查到阳历(阳历一年相当阴历的月数为365.2422/29.530588=12.36827个月)。例如,可先在1995年的日历上查得与(该年)阴历对应的阳历日期,这样就找到了临时落脚点, 也就是找到了阴阳互换的关键。例如,可先以阴历四月初一(日)为引数,在1995年日历上查到对应的阳历为4月30日。由于已经计算出经过的月数,将经过的月数的尾数(小数)化为日,加在4月30日上,就得到经过(1995-1070)整年数的阳历日期,也就是起始阴 历日期对应的阳历日期,即得到了待查的日期为4月30日加上0.64957×29.530588得到(1070年)5月19.1821840日。这样就得到了所给例子的阴阳历日期换算结果……”。 0.64957月的由来, (1995-1070)×12.36827=11440.64957月 已知依泽公生于梁龙德二年(922)六月二十一日,依下表提供的2099年各月初一日的公历月日数,可以算出龙德二年六月二十一日的公历月日数 公元2099年农历各月初一日的公历月日 (2099-922)×12.36827=1455.45379月 余数为0.45379月×29.530588日=13.4O日 因2099年五月初一日(包括该年闯二月)在公历6月19日,加上计算所得的13日为龙德二年六月初一日的公历月日,即该年7月2日,则该年农历六月二十一日为该年7月22日。 3.计算结果的订正 实际上上列公历换算为农历时常有较大的误差,如熙宁三年四月初一日为公历1070年5月13日,而不是5月19日。通过中国历法所用的于支记日法求算所用两历的干支,对所 求结果加以订正。 如,马依泽公生于回历310年3月20日,自回历历元起算共历日数为: 自回历元旦至其3月20日,共历79日。 自回历元年元旦至309年元旦,共历113个闰年196个平年。又回历历元在公历622年7月16日,已知该日的干支序数为50,癸丑日,减1(因自甲子起算),余49应加入下列算式中, (309 ×354+113+79+49)÷60=1827.116667

excel公历转农历的四种方法

excel公历转农历的四种方法 excel公历转农历方法一:使用text函数 A列是公历日期,我们在B1单元格输入公式:=TEXT(A1,"[$-130000]yyyy年m月"&I F(LEN(--TEXT(A1,"[$-130000]dd"))=1,"初","")&"d"),下拉完成公历转农历。 excel公历转农历方法二:使用text+MID函数 A列仍然是公历,B1输入公式:=MID("甲乙丙丁戊己庚辛壬癸",MOD(TEXT(A1,"[$-13 0000]e")-4,10)+1,1)&MID("子丑寅卯辰巳午未申酉戌亥",MOD(TEXT(A1,"[$-130000]e")-4, 12)+1,1)&"年"&TEXT(A1,"[$-130000][DBNum1]m月d日"即可。 excel公历转农历方法三:使用text+MID+ CHOOSE+ YEAR函数 A1为公历,B1输入:=CHOOSE(MOD(YEAR(A1)-1900,10)+1,"庚","辛","壬","癸","甲", "乙","丙","丁","戊","己")&CHOOSE(MOD(YEAR(A1)-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")&TEXT(A1,"[dbnum1][$-130000]年m月"&IF(--TEXT(A1, "[$-130000]d")<11,"初","")&TEXT(A1,"[dbnum1][$-130000]d")) excel公历转农历方法四:使用自定义函数 上面介绍的excel公历转农历都是使用excel内置函数完成的,有一个弊端就是公式太长,如果使用自定义函数,在公式栏就可以简化输入。 如下图所示,我们在B2输入公式:=nongli(A2),即可。C列农历简称中C2公式是:=RIGHT(B2,LEN(B2)-8)。

阴历转阳历星座查询属相

阴历转阳历星座查询属相 星座查询 星座是按阳历公历日期划分的首先你得知道你的阳历出生日期然后对照下面的资料。如果只知道阴历出生日期可先到这里换算成阳历生日再输入资料。白羊座3月21日4月20日金牛座4月21日5月21日双子座5月22日6月21日巨蟹座6月22日7月22日狮子座7月23日8月23日处女座8月24日9月23日天秤座9月24日10月23日天蝎座10月24日11月22日射手座11月23日12月21日魔羯座12月22日1月20日水瓶座1月21日2月19日双鱼座2月20日3月20日新旧历转换星座查询因为太阳每年进入各个星座的时间略有差别如果你的生日在交界日附近不好确定的话请到这里输入你的出生资料绘制出你的个人星盘其中太阳所在的星座就是通常我们所说的星座。四分法将星座按火、地、风、水分为四类火相星座白羊座、狮子座、射手座地相星座金牛座、处女座、魔羯座风相星座双子座、天秤座、水瓶座水相星座巨蟹座、天蝎座、双鱼座火相星座的人精力充沛感情奔放激烈有十足的行动力但来的快去的也快有时较草率和粗心。地相星座的人慎重、冷静对待感情真诚持久做事也脚踏实地但有时过于保守和自信心不强。风相星座的人思维发达想象力丰富有思想家的倾向擅长社交语言表达能力强但性格变化多端有喜新厌旧和情绪化的毛病。水相星座的人温柔宁静、感情细腻对事物的洞察力极强直觉也很敏感但有时想法不切实际且喜凭感情用事。一般来说火、地、风、水四种类别中火和风相处较好地和水相处不错。俗话说风助火势。风相星座的人冷静、理性火相星座的人热情、冲动这两种人在一起时风相星座的人往往以理性辅助火相星座的人在行动上也经常给与指导。地相星座的人在感情方面稳重、持久水相星座的人在感情方面由于过分敏感而情绪波动较大于是地相星座的人往往关怀、安慰水相星座的人在感情上就形成了一种辅助关系。另外我赠送你其他2个星座分配法一、二分法将星座按阳性和阴性分为两类阳性白羊座、双子座、狮子座、天秤座、射手座、水瓶座。阴性金牛座、巨蟹座、处女座、天蝎座、魔羯座、双鱼座阳性星座的人大多是有进取心的、积极主动的理想主义者。阴性星座的人大多是性格内向的、被动的战略家。二、三分法将星座按本位型、固定型、变通型分为三类本位型白羊座、巨蟹座、天秤座、魔羯座这类星座属于领导者型。固定型金牛座、狮子座、天蝎座、水瓶座这类星座属于组织者型。变通型双子座、处女座、射手座、双鱼座这类星座属于传授者型。在这三种分类中以四分法最为常用因其包含了二分法火相、风相为阳性地相、水相为阴性其展现也较明显可作为一般人的基本分类法。问题有很多网友提到出生日期刚好介于两个星座之间搞不清楚自己到底是那个座比方8月23日有的书说是狮子座有的说是处女座到底该怎么看才正确呢例如网友问我使用贵站的星座查询输入11月22日得到的结果是射手座。可是对照网上的星座查询对照表我又应该是天蝎座这让我很头晕前后有矛盾同时我搜索了很多网站11月22日归属的星座有的在射手座有的在魔羯座我不知道自己倒底应该属哪个星座了。回答在星座交接日出生的人需要有出生年和出生地才可以确定到底是什么星座。所谓交界点就是太阳正好跨越星座的时间每年都不一样说穿了是跟节气转换有关呢第一次听到星座跟节气有关的朋友是不是觉得很神奇呢所以问题来了当天是这个星座还是当天是下一个星座呢大家如果去翻农民历就会发现节气转换是有时间点的好比某年冬至是晚上八点45分意思就是晚上八点45分后太阳从射手座跨越到

回历、公历、农历的换算

回历、公历、农历的换算 2002-2-10 22:02:19 马肇曾阅读9061次 研究世界伊斯兰教历史,免不了要对以回历所记载的历史事实换算为公历,或将所载的公历换算为回历。《回历纲要》、《历法丛谈》、《万年历谱》以及《回回天文学史研究》[1--4]等专著都载有自回历换算为公历的算式,并称两历因闰年的时间不同,故换算结果常有一日之差,惟均未讨论一日之差的简易订正方法。1998年《北京大学学报》(自然科学版)载文讨论了中国农历与公历、回历的换算问题[5]。惟笔者依上列著作中所列算式推算结果;发现与实际所载日期误差常大于一日,最高可达十日之多。因此有必要对计算中误差的来源及计算公式的改进进行探讨,特撰此文。 二、国历换算为公历 1.换算公式的导出 公历每年365.242 199074075 日(简化为365.2422日),而回历每年为354.367074375日(简化为354.36707日),所以回历一年只相当354.36707/365.2422=0.970223或0.970224个公历年。又回历元年元旦定在公元622年7月16日,由于当时历法在推算上的误差,致当时的7月16日,按现代的公历应改为7月19日,自公元某年元旦至该年7月19日已达200日.相200/365.2422=0.5476公历年;又因到回历二年元旦才达到0.970224个公历年,故自回历纪年元旦换算为公历的算式即为: (回历纪年一1)× 0.970224+622.5476年 =所求公历年月日 (1) 或回历纪年× 0.970224+621.5774年 =所求公历年月日 (2) 式中621.5774来自622.5476-0.970224。 如所求某一历史事实不在回历元旦时,可将事实经过本年的总日数化为回历年,加人回历纪年总数中即可。 然而上列公历一年的总日数,实际上是一回归年的实测数,因现用公历每年的日数实为365.2425日,它与一回归年的日数只能是基本相符,到公元四千多年后会再出现一日之差。 实际上在明万历十年九月十八日,回历990年9月16日,公元1582年10月4日前(包括4日)的公历称儒略历,儒略历每年365.25日,它每年与一回归年的差值远大于格列高利历即现代的公历,大约历128年就需多闰去一日,至万历十年已经多闰出十日了。因此,对于儒略历时期的回、公两历换算,不能仍采用(l)、(2)两式,而需依儒略历的年实际日数将上列二式略加修正即可,结果如下: (回历纪年一l)× 0.9702+622.5393 = 所求公历年月日 (3)

阳历转化成农历算法

c++中怎样将阳历转化成农历 已关闭20[ 标签:c++, 阳历, 农历 ] 小^鱼、2011-05-03 11:06 推荐答案 一、原理篇 1.公历转换农历的算法 公历(Gregorian Calendar)与农历(Chinese Lunar Calendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。 比较常用并且比较简单的公历转换农历算法就是查表方法。首先要保存公历农历的转换信息:以任何一年作为起点,把从这一年起若干年的农历信息保存起来(在我的C++类中,是从1900年作为起点的。选择一个起始点的思想十分重要,在下面的干支纪法和二十四节气中也体现到了)。回想一下,我们平时是怎样来转换公历农历的呢?是查阅历书,历书中有每一天的公历农历,直接一查就可以了。那么我们可不可以也这样做呢?当然可以,但是这样做要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。如何简化呢? 要保存一年的信息,其实只要两个信息就可以了:(1)农历每个月的大小;(2)今年是否有闰月,闰几月以及闰月的大小。用一个整数来保存这些信息就足够了。具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉了12位,再用低四位来表示闰月的月份,没有闰月记为0。比如说,2000年的信息数据是0x0c960,转化成二进制就是1100100101100000,表示的含义是1、2、5、8、10、11月大,其余月小,低四位为0说明没有闰月。2001年的农历信息数据是0x0d954,其中的4表示该年闰4月,月份大小信息就是0x0d95,具体的就是1、2、4、5、8、10、12月大,其余月小。这样就可以用一个数组来保存这些信息。在我的C++类中是用m_lunarInfo这个数组来保存这些信息的。 下面就是公历转换成农历的具体算法: (1)计算所求时间到起始年正月初一的天数。 (2)从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止。此时,m_lunarInfo的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月。如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月。剩余的天数就是农历日。(具体实现时有所改进。) 2.利于泰勒公式巧算星期 在应用数学中有一个计算某一天是星期几的公式,这就是泰勒公式。公式如下: w = [c÷4] - 2c + y + [y÷4] + [26(m+1)÷10] + d - 1,其中w就是所求日期的星期数。如果求得的数大于(小于)7,就减去(加上)7的倍数,直到余数小于7为止。式子中c是指公

阳历与阴历的转换

public class Date2 { //天干 private static string[] TianGan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" }; //地支 private static string[] DiZhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" }; //十二生肖 private static string[] ShengXiao = { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" }; //农历日期 private static string[] DayName = {"*","初一","初二","初三","初四","初五", "初六","初七","初八","初九","初十", "十一","十二","十三","十四","十五", "十六","十七","十八","十九","二十", "廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十"}; //农历月份 private static string[] MonthName = { "*", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊" }; //公历月计数天 private static int[] MonthAdd = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; //农历数据 private static int[] LunarData = {2635,333387,1701,1748,267701,694,2391,133423,1175,396438 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402 ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738 ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762 ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413 ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395 ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031 ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222 ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709 ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};

公元与农历的换算方法

公元与农历的换算方法 一、记住农历的天干和地支的顺序 天干顺序:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。 地支顺序:子、丑、寅、卯、辰、巳、午、未、申、酉、戍、亥。 二、掌握天干和地支的搭配方法KCB齿轮泵 年数从甲子、乙丑、丙寅、丁卯、戊辰、己巳、庚午、辛未、癸酉;后继续甲戍、乙亥、丙子……,60年时刚好是葵亥。每个干支为一年,六十个干支后,又从头算起2CY系列齿轮泵,周而复始,循环不息。由甲子开始,满六十年称做一甲子或一花甲子,称为干支纪年法。搭配时先天干后地支。 三、使用如下公式KCB不锈钢齿轮泵 1、天干计算公式:(公元年代—3)/10.整除时是葵,余数1、 2、 3、 4、 5、 6、 7、 8、9分别是甲、乙、丙、丁、戊、己、庚、辛、壬(按顺序)。LYB系列立式液下齿轮泵 2、地支计算公式:(公元年代—3)/12.整除时是亥,余数1、2、 3、4、5、6、7、8、9、10、11分别是子、丑、寅、卯、辰、巳、午、未、申、酉、戍(按顺序)KCB-T铜齿轮泵。 如:1894年甲午中**战争 (1894—3)/10 余数是1,GZYB高精度齿轮泵天干属于“甲”;(1894—3)/12 余数是7,地支属于“午”。再把天干和地支合起来就是“甲午”。KCB系列大流量齿轮泵 又如:1898年戊戌变法

(1898—3)/10 余数是5,KCB齿轮泵安装尺寸天干属于“戊”;(1898—3)/12 余数是11,地支属于“戌”。再把天干和地支合起来就是“戊戌”。2CY齿轮泵安装尺寸 再如:1911年辛亥革命 (1911—3)/10 余数是8,天干属于“辛”;(1911—3)/12 结果是整除,地支属于“亥”。高压齿轮泵再把天干和地支合起来就是“辛亥”。

公历转农历方法

阳历日期推算阴历日期的方法:前已述及阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是阴历几日?翻开万年历6月10日是阴历十一,则逆推6月8日是阴历初九。其二可以利用公式推算阴历日期: 设:公元年数-1977(或1901)=4q+r 则:阴历日期=14q+10.6(r+1)+年内日期序数-29.5n (注:式中q、r、n均为自然数,r<4) 例:1994年5月7日的阴历日期为: 1994-1977=17=4×4+1 故:q=4,r=1 则:5月7日的阴历日期为: 14×4+10.6(1+1)+(31+28+31+31+7)-29.5n =204.2- 29.5n 然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日。 蔡勒(Zeller)公式:是一个计算星期的公式。 随便给一个日期,就能用这个公式推算出是星期几。 蔡勒公式如下: W = [ C/4 ] - 2C + y + [ y/4 ] + [ 13 * (M + 1) / 5] + d -1 公式中的符号含义如下: W: 星期;w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 C: 世纪-1(前两位数) y: 年(后两位数) m: 月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算) d: 日 [ ]代表取整,即只要整数部分。 下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除以7余5) 即2049年10月1日(100周年国庆)是星期五。 再比如计算2006年4月4日,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1 =-12 (除以7余2,注意对负数的取模运算!) 不过,以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗

公历转农历(a版本)

公历转农历(A版本) Tags:版本wCurMonth wCurYear if农历nTheDate nBit const公历转农历(C 版本) PHP开发环境的选择、建立及使用[8]编写自定义任务,轻松扩展Ant(2)代联接的自定义右键菜单面试中如何体现身价希特勒生日(4月20日)突破生命中那条线怎么用ado打开带密码的access数据库算法复杂度攻击激烈讨论在Visual https://www.sodocs.net/doc/da2388522.html,中使用自定义插公历转农历(C版本)版本wCurMonth wCurYear if农历nTheDate nBit const 前段时间做软件写了个公历转农历的函数,目前公开给大家参考,有兴趣的朋友可以在此基础上进一步完善其功能 /*------------农历转换函数-----------*/ char *GetDayOf(PSYSTEMTIME pSt) { /*天干名称*/ const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"}; /*地支名称*/ const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"}; /*属相名称*/ const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇", "马","羊","猴","鸡","狗","猪"}; /*农历日期名*/ const char *cDayName[] = {"*","初一","初二","初三","初四","初五", "初六","初七","初八","初九","初十",

采用查表的方法实现农历与公历的转换)

采用查表的方法实现农历与公历的转换,可以坚持50年,50年以后可以补充表继续使用,当然50年以后什么样子都不知道,这个方法可能早淘汰了。哈哈! #define uchar unsigned char #define uint unsigned int #include /* 公历年对应的农历数据,每年三字节, 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天) 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期 */ code uchar year_code[597]={ 0x04,0xAe,0x53, //1901 0 0x0A,0x57,0x48, //1902 3 0x55,0x26,0xBd, //1903 6 0x0d,0x26,0x50, //1904 9 0x0d,0x95,0x44, //1905 12 0x46,0xAA,0xB9, //1906 15 0x05,0x6A,0x4d, //1907 18 0x09,0xAd,0x42, //1908 21 0x24,0xAe,0xB6, //1909 0x04,0xAe,0x4A, //1910 0x6A,0x4d,0xBe, //1911 0x0A,0x4d,0x52, //1912 0x0d,0x25,0x46, //1913 0x5d,0x52,0xBA, //1914 0x0B,0x54,0x4e, //1915 0x0d,0x6A,0x43, //1916 0x29,0x6d,0x37, //1917 0x09,0x5B,0x4B, //1918 0x74,0x9B,0xC1, //1919 0x04,0x97,0x54, //1920 0x0A,0x4B,0x48, //1921 0x5B,0x25,0xBC, //1922 0x06,0xA5,0x50, //1923 0x06,0xd4,0x45, //1924 0x4A,0xdA,0xB8, //1925 0x02,0xB6,0x4d, //1926 0x09,0x57,0x42, //1927 0x24,0x97,0xB7, //1928 0x04,0x97,0x4A, //1929 0x66,0x4B,0x3e, //1930

公历转换为农历的算法

公历转换为农历的算法: 0101000101111 前12为代表大小月,第13位代表闰月的大小月 6 代表闰月的月份 0 代表无闰月 64311 代表当年春节的公历日期 1.首先获取当前日期。S time=+$h 2.判断查询日期是否在春节之前。如果是取上一年的信息。否则取当前年的信息为 农历年 3. 4.判断当前日期和最近的春节相差的天数。 Days 5.如果没有闰月,判断前12位的大小月, 如果是大月 ,则相差天数-30 如果是小月则相差天数-29,直到相差天数在30 或者 29天内。 取当前的月份,即农历的月份,天数+1 即为农历的天。 如果有闰月,判断前13位的大小月,判断方法和前面的类似,只是到闰月的月份时,需要在前面增加一个闰字。 /// gl 23/06/2016格式 gldays数字形式的日期 /// w ##class(websys.CalendarUtil).ToLuner("01/01/2017") /// @param: gl 公历日期格式 DD/MM/YYYY /// @return: 返回农历日期 2016*8*12 2017*闰6*12,2017*闰6*12 ClassMethod ToLuner(gl = {+$h}) { //q "2016*8*12" s Nmonth="" s Nday="" s ^TMP("Toluner")=$g(gl)

if gl=""{ set gldt=$h set gldays=$p(gldt,",",1) set gl=$zd(gldays,4) }else{ set gldays=$zdh(gl,4) } ;获取传过来的年份 set year=$p(gl,"/",3) ;查询数据库,获取这个年份的信息串 set calId="" Set calId = $o(^websys.CalendarUtilI("YearIndex"," "_year,calId)) q:calId="" "" s g=$list(^websys.CalendarUtilD(calId),1,3) Set calInfo = $list(g,2) b ;获取这个信息串的春节 s springFes=$p(calInfo,"^",3) ;如果要查询的日期在春节之前,获取前一年的信息串 if (gldays

公历日期与农历日期的相互转换程序

公历日期与农历日期的相互转换程序 //********************************** // 公历日期与农历日期的相互转换程序 // 公元1800年1月25日~2101年1月28日 // 请在VC++6.0平台运行 //********************************** #include; #include; #include; #include; #include; #include; struct date{ short year,month,day; } d1={ 1800,1,25 },//农历1800正月初一(星期六) d2={ 2101,1,28 };//农历2100腊月廿九(未使用) struct lunarYear //农历年 { char run; //闰月月份(0表示无闰月) char ZL[13]; //农历i月初一对应公历i月ZL[i]日(广义) } Year[2101

//但是ZL[i]的最高位1表示大月0表示小月 -1800]={4};//农历1800年闰四月 #define leap(y) !(y%(y%100?4:400)) //公元闰年宏定义 unsigned char days[]={ 0,31,28,31,30,31,30,31,31,30,31,30,31 }, b[]= //农历1800-2100年大月(30天)小月(29天)闰月数据(hex string) { "adca5aa92bb525bba25bb493b64a5ba9add496ea8a6 ed14eea4a6da5b6" "545baa4bba45bba82b75a5b654abaa55d526eda4aed 495da526daa5655" "abb295ba5257aa4b75a95655abaa56ea4a5da92ed96 5d594adaa56692b" "75a5ba64977493b6ca5a69add496da925dd24dda495 da9add45a6a4b75"

Excel公历转农历阳历转阴历

参看一: 可以这样试一下:EXCEL2007中可以直接做到,例如 TEXT(日期,"[$-130000]e-m-d"),可返回日期的阿拉伯数字的农历年月日, 中文农历转换公式如下: B2单元格 =MID("庚辛壬癸甲乙丙丁戊己",MOD(TEXT(A2,"[$-130000]e"),10)+1,1)&MID("申酉戌亥子丑寅卯辰巳午未",MOD(TEXT(A2,"[$-130000]e"),12)+1,1)&TEXT(A2,"[dbnum1][$-130000]年M月 "&IF(-TEXT(A2,"[$-130000]d")<-10,,"初")&"D日") 此公式仅EXCEL2007以使用,EXCEL2003及以下不能正常使用 上面那个公式好像有问题,可以试一下这个: 参看二: 日期在A2, 这个公式在B2 =CHOOSE(MOD(YEAR(LEFT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),4)&"-"&MID(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),2))-1900,10)+1,"庚","辛","壬","癸","甲","乙","丙","丁","戊","己 ")&CHOOSE(MOD(YEAR(LEFT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),4)&"-"&MID(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),2))-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥 ")&TEXT(A2,"[dbnum1][$-130000]年m月"&IF(--TEXT(A2,"[$-130000]d")<11,"初 ","")&TEXT(A2,"[dbnum1][$-130000]d日")) =CHOOSE(MOD(YEAR(LEFT(TEXT(A11,"[$-130000]yyyy年mm月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),4) &"-"&MID(TEXT(A11,"[$-130000]yyyy年mm月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),6,2) &"-"&RIGHT(TEXT(A11,"[$-130000]yyyy年mm月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),2))-1900,10)+1,"庚","辛","壬","癸","甲","乙","丙","丁","戊","己") &CHOOSE(MOD(YEAR(LEFT(TEXT(A11,"[$-130000]yyyy年mm月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),4)&"-" &MID(TEXT(A11,"[$-130000]yyyy年mm月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),6,2) &"-" &RIGHT(TEXT(A11,"[$-130000]yyyy年mm月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),2))-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")

相关主题