[万年历公历农历转换]甲子日是怎么算的---2010年新历农历转换
[万年历公历农历转换]甲子日是怎么算
的???2010年新历农历转换 篇一 : 甲子日是怎么算的???2010年新历农历转换
阴历年份的是按10个天干初五 癸巳年戊午月己酉日 端午节
2013年6月13日 周四 农历五月初六 癸巳年戊午月庚戌日
2013年6月14日 周五 农历五月初七 癸巳年戊午月辛亥日
2013年6月15日 周六 农历五月初八 癸巳年戊午月壬子日
2013年6月16日 星期日 农历五月初九 癸巳年戊午月癸丑日 爸爸节
2013年6月17日 周一 农历五月初十 癸巳年戊午月甲寅日 防治荒漠化和干旱日
2013年6月18日 周二 农历五月十一 癸巳年戊午月乙卯日
2013年6月19日 周三 农历五月十二 癸巳年戊午月丙辰日
2013年6月20日 周四 农历五月十三 癸巳年戊午月丁巳日
2013年6月21日 周五 农历五月十四 癸巳年戊午月戊午日 13:03夏至
2013年6月22日 周六 农历五月十五 癸巳年戊午月己未日
2013年6月23日 星期日 农历五月十六 癸巳年戊午月庚申日 国际奥林匹克日
2013年6月24日 周一 农历五月十七 癸巳年戊午月辛酉日
2013年6月25日 周二 农历五月十八 癸巳年戊午月壬戌日 全国土地日
2013年6月26日 周三 农历五月十九 癸巳年戊午月癸亥日 国际反毒品日
2013年6月27日 周四 农历五月二十 癸巳年戊午月甲子日
2013年6月28日 周五 农历五月廿一 癸巳年戊午月乙丑日
2013年6月29日 周六 农历五月廿二 癸巳年戊午月丙寅日
2013年6月30日 星期日 农历五月廿三 癸巳年戊午月丁卯日
篇三 : 万年历:2013年7月-2013年8月
2013年7月 1日 周一 农历五月廿四 癸巳年戊午月戊辰日 中国共产党建党日 世界建筑日
2013年7月 2日 周二 农历五月廿五 癸巳年戊午月己巳日 国际体育记者日
2013年7月 3日 周三 农历五月廿六 癸巳年戊午月庚午日
2013年7月 4日 周四 农历五月廿七 癸巳年戊午月辛未日
2013年7月 5日 周五 农历五月廿八 癸巳年戊午月壬申日
2013年7月 6日 周六 农历五月廿九 癸巳年戊午月癸酉日
2013年7月 7日 星期日 农历五月三十 癸巳年己未月甲戌日 06:34小暑 中国人民抗日战争纪念日
2013年7月 8日 周一 农历六月初一 癸巳年己未月乙亥日
2013年7月 9日 周二 农历六月初二 癸巳年己未月丙子日
2013年7月10日 周三 农历六月初三 癸巳年己未月丁丑日
2013年7月11日 周四 农历六月初四 癸巳年己未月戊寅日 世界人口日
2013年7月12日 周五 农历六月初五 癸巳年己未月己卯日
2013年7月13日 周六 农历六月初六 癸巳年己未月庚辰日
2013年7月14日 星期日 农历六月初七 癸巳年己未月辛巳日
2013年7月15日 周一 农历六月初八 癸巳年己未月壬午日
2013年7月16日 周二 农历六月初九 癸巳年己未月癸未日
2013年7月17日 周三 农历六月初十 癸巳年己未月甲申日
2013年7月18日 周四 农历六月十一 癸巳年己未月乙酉日
2013年7月19日 周五 农历六月十二 癸巳年己未月丙戌日
2013年7月20日 周六 农历六月十三 癸巳年己未月丁亥日
2013年7月21日 星期日 农历六月十四 癸巳年己未月戊子日
2013年7月22日 周一 农历六月十五 癸巳年己未月己丑日 23:55 大暑
2013年7月23日 ,)周二 农历六月十六 癸巳年己未月庚寅日
2013年7月24日 周三 农历六月十七 癸巳年己未月辛卯日
2013年7月25日 周四 农历六月十八 癸巳年己未月壬辰日
2013年7月26日 周五 农历六月十九 癸巳年己未月癸巳日
2013年7月27日 周六 农历六月二十 癸巳年己未月甲午日
2013年7月28日 星期日 农历六月廿一 癸巳年己未月乙未日
2013年7月29日 周一 农历六月廿二 癸巳年己未月丙申日
2013年7月30日 周二 农历六月廿三 癸巳年己未月丁酉日 非洲妇女日
2013年7月31日 周三 农历六月廿四 癸巳年己未月戊戌日
2013年8月 1日 周四 农历六月廿五 癸巳年己未月己亥日 中国建军节
2013年8月 2日 周五 农历六月廿六 癸巳年己未月庚子日
2013年8月 3日 周六 农历六月廿七 癸巳年己未月辛丑日
2013年8月 4日 星期日 农历六月廿八 癸巳年己未月壬寅日
2013年8月 5日 周一 农历六月廿九 癸巳年己未月癸卯日
2013年8月 6日 周二 农历六月三十 癸巳年己未月甲辰日
2013年8月 7日 周三 农历七月初一 癸巳年庚申月乙巳日 16:20立秋
2013年8月 8日 周四 农历七月初二 癸巳年庚申月丙午日 中国男子节
2013年8月 9日 周五 农历七月初三 癸巳年庚申月丁未日
2013年8月10日 周六 农历七月初四 癸巳年庚申月戊申日
2013年8月11日 星期日 农历七月初五 癸巳年庚申月己酉日
2013年8月12日 周一 农历七月初六 癸巳年庚申月庚戌日
2013年8月13日 周二 农历七月初七 癸巳年庚申月辛亥日 七七中国情人节
2013年8月14日 周三 农历七月初八 癸巳年庚申月壬子日
2013年8月15日 周四 农历七月初九 癸巳年庚申月癸丑日 日本正式宣布无条件投降日
2013年8月16日 周五 农历七月初十 癸巳年庚申月甲寅日
2013年8月17日 周六 农历七月十一 癸巳年庚申月乙卯日
2013年8月18日 星期日 农历七月十二 癸巳年庚申月丙辰日
2013年8月19日 周一 农历七月十三 癸巳年庚申月丁巳日
2013年8月20日 周二 农历七月十四 癸巳年庚申月戊午日
2013年8月21日 周三 农历七月十五 癸巳年庚申月己未日
2013年8月22日 周四 农历七月十六 癸巳年庚申月庚申日
2013年8月23日 周五 农历七月十七 癸巳年庚申月辛酉日 07:01处暑
2013年8月24日 周六 农历七月十八 癸巳年庚申月壬戌日
2013年8月25日 星期日 农历七月十九 癸巳年庚申月癸亥日
2013年8月26日 周一 农历七月二十 癸巳年庚申月甲子日
2013年8月27日 周二 农历七月廿一 癸巳年庚申月乙丑日
2013年8月28日 周三 农历七月廿二 癸巳年庚申月丙寅日
2013年8月29日 周四 农历七月廿三 癸巳年庚申月丁卯日
2013年8月30日 周五 农历七月廿四 癸巳年庚申月戊辰日
2013年8月31日 周六 农历七月廿五 癸巳年庚申月己巳日
篇四 : 万年历:1997年9月-1997年10月
1997年9月 1日 周一 农历七月三十 丁丑年戊申月丙午日 劳动节
1997年9月 2日 周二 农历八月初一 丁丑年戊申月丁未日
1997年9月 3日 周三 农历八月初二 丁丑年戊申月戊申日
1997年9月 4日 周四 农历八月初三 丁丑年戊申月己酉日
1997年9月 5日 周五 农历八月初四 丁丑年戊申月庚戌日
1997年9月 6日 周六 农历八月初五 丁丑年戊申月辛亥日
1997年9月 7日 星期日 农历八月初六 丁丑年己酉月壬子日 22:28白露
1997年9月 8日 周一 农历八月初七 丁丑年己酉月癸丑日 国际扫盲日 国际新闻工作者日
1997年9月 9日 周二 农历八月初八 丁丑年己酉月甲寅日
1997年9月10日 周三 农历八月初九 丁丑年己酉月乙卯日 教师节
1997年9月11日 周四 农历八月初十 丁丑年己酉月丙辰日
1997年9月12日 周五 农历八月十一 丁丑年己酉月丁巳日
1997年9月13日 周六 农历八月十二 丁丑年己酉月戊午日
1997年9月14日 星期日 农历八月十三 丁丑年己酉月己未日 世界清洁地球日
1997年9月15日 周一 农历八月十四 丁丑年己酉月庚申日
1997年9月16日 周二 农历八月十五 丁丑年己酉月辛酉日 中秋
节 国际臭氧层保护日国际和平日
1997年9月17日 周三 农历八月十六 丁丑年己酉月壬戌日
1997年9月18日 周四 农历八月十七 丁丑年己酉月癸亥日 九?一八事变纪念日
1997年9月19日 周五 农历八月十八 丁丑年己酉月甲子日
1997年9月20日 周六 农历八月十九 丁丑年己酉月乙丑日 国际爱牙日
1997年9月21日 星期日 农历八月二十 丁丑年己酉月丙寅日
1997年9月22日 周一 农历八月廿一 丁丑年己酉月丁卯日
1997年9月23日 周二 农历八月廿二 丁丑年己酉月戊辰日 07:55秋分
1997年9月24日 周三 农历八月廿三 丁丑年己酉月己巳日
1997年9月25日 周四 农历八月廿四 丁丑年己酉月庚午日
1997年9月26日 周五 农历八月廿五 丁丑年己酉月辛未日
1997年9月27日 周六 农历八月廿六 丁丑年己酉月壬申日 世界旅游日
1997年9月28日 星期日 农历八月廿七 丁丑年己酉月癸酉日 国际聋人节 世界儿童日 世界海事日
1997年9月29日 周一 农历八月廿八 丁丑年己酉月甲戌日
1997年9月30日 周二 农历八月廿九 丁丑年己酉月乙亥日
1997年10月 1日 周三 农历八月三十 丁丑年己酉月丙子日 国庆
节 世界音乐日 国际老人节 国际音乐日
1997年10月 2日 周四 农历九月初一 丁丑年己酉月丁丑日 国际和平与民主自由斗争日
1997年10月 3日 周五 农历九月初二 丁丑年己酉月戊寅日
1997年10月 4日 周六 农历九月初三 丁丑年己酉月己卯日 世界动物日
1997年10月 5日 星期日 农历九月初四 丁丑年己酉月庚辰日
1997年10月 6日 周一 农历九月初五 丁丑年己酉月辛巳日 国际住房日
1997年10月 7日 周二 农历九月初六 丁丑年己酉月壬午日
1997年10月 8日 周三 农历九月初七 丁丑年庚戌月癸未日 14:06寒露 全国高血压日 世界视觉日国际减轻自然灾害日
1997年10月 9日 周四 农历九月初八 丁丑年庚戌月甲申日 世界邮政日 万国邮联日
1997年10月10日 周五 农历九月初九 丁丑年庚戌月乙酉日 重阳节 辛亥革命纪念日世界精神卫生日
1997年10月11日 周六 农历九月初十 丁丑年庚戌月丙戌日
1997年10月12日 星期日 农历九月十一 丁丑年庚戌月丁亥日
1997年10月13日 周一 农历九月十二 丁丑年庚戌月戊子日 世界保健日 国际教师节
1997年10月14日 周二 农历九月十三 丁丑年庚戌月己丑日 世界标准日
1997年10月15日 周三 农历九月十四 丁丑年庚戌月庚寅日 国际盲人节
1997年10月16日 周四 农历九月十五 丁丑年庚戌月辛卯日 世界粮食日
1997年10月17日 周五 农历九月十六 丁丑年庚戌月壬辰日 世界消除贫困日
19[)97年10月18日 周六 农历九月十七 丁丑年庚戌月癸巳日
1997年10月19日 星期日 农历九月十八 丁丑年庚戌月甲午日
1997年10月20日 周一 农历九月十九 丁丑年庚戌月乙未日
1997年10月21日 周二 农历九月二十 丁丑年庚戌月丙申日
1997年10月22日 周三 农历九月廿一 丁丑年庚戌月丁酉日 世界传统医药日
1997年10月23日 周四 农历九月廿二 丁丑年庚戌月戊戌日 17:14霜降
1997年10月24日 周五 农历九月廿三 丁丑年庚戌月己亥日 联合国日 世界发展信息日
1997年10月25日 周六 农历九月廿四 丁丑年庚戌月庚子日
1997年10月26日 星期日 农历九月廿五 丁丑年庚戌月辛丑日
1997年10月27日 周一 农历九月廿六 丁丑年庚戌月壬寅日
1997年10月28日 周二 农历九月廿七 丁丑年庚戌月癸卯日
1997年10月29日 周三 农历九月廿八 丁丑年庚戌月甲辰日
1997年10月30日 周四 农历九月廿九 丁丑年庚戌月乙巳日
1997年10月31日 周五 农历十月初一 丁丑年庚戌月丙午日 世界
勤俭日
篇五 : 39公历和农历转换算法详解
公历和农历转换算法详解
//C51写的公历转农历和星期 #define uchar unsigned char
#define uint unsigned int #include
/*
公历年对应的农历数据,每年三字节,
格式第一字节BIT7-4 位
示闰月月份,值为0 为无闰
月,BIT3-0 对应农历第1-4 月的大小 第二字节BIT7-0 对应农历第
5-12 月大小,第三字节BIT7 表示农历第13 个月大小 月份对应的位
为1 表示本农历月大,为0 表示小
第三字节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 0x0d,0x4A,0x51, //1931 0x0e,0xA5,0x46, //1932
0x56,0xd4,0xBA, //1933 0x05,0xAd,0x4e, //1934 0x02,0xB6,0x44, //1935 0x39,0x37,0x38, //1936 0x09,0x2e,0x4B, //1937 0x7C,0x96,0xBf, //1938 0x0C,0x95,0x53, //1939 0x0d,0x4A,0x48, //1940
0x6d,0xA5,0x3B, //1941 0x0B,0x55,0x4f, //1942 0x05,0x6A,0x45, //1943 0x4A,0xAd,0xB9, //1944
1
0x02,0x5d,0x4d, //1945 0x09,0x2d,0x42, //1946 0x2C,0x95,0xB6, //1947 0x0A,0x95,0x4A, //1948 0x7B,0x4A,0xBd, //1949
0x06,0xCA,0x51, //1950 0x0B,0x55,0x46, //1951 0x55,0x5A,0xBB, //1952 0x04,0xdA,0x4e, //1953 0x0A,0x5B,0x43, //1954
0x35,0x2B,0xB8, //1955 0x05,0x2B,0x4C, //1956 0x8A,0x95,0x3f, //1957 0x0e,0x95,0x52, //1958 0x06,0xAA,0x48, //1959
0x7A,0xd5,0x3C, //1960 0x0A,0xB5,0x4f, //1961 0x04,0xB6,0x45, //1962 0x4A,0x57,0x39, //1963 0x0A,0x57,0x4d, //1964 0x05,0x26,0x42, //1965 0x3e,0x93,0x35, //1966 0x0d,0x95,0x49, //1967
0x75,0xAA,0xBe, //1968 0x05,0x6A,0x51, //1969
0x09,0x6d,0x46, //1970 0x54,0xAe,0xBB, //1971 0x04,0xAd,0x4f, //1972 0x0A,0x4d,0x43, //1973 0x4d,0x26,0xB7, //1974 0x0d,0x4A,0x4C, //2002 0x0d,0xA5,0x41, //2003 0x25,0xAA,0xB6, //2004 0x05,0x6A,0x49, //2005 0x7A,0xAd,0xBd, //2006 0x02,0x5d,0x52, //2007 0x09,0x2d,0x47, //2008 0x5C,0x95,0xBA, //2009 0x0d,0x25,0x4f, //2037 0x0d,0x52,0x44, //2038 0x5d,0xAA,0x38, //2039 0x0B,0x5A,0x4C, //2040 0x05,0x6d,0x41, //2041 0x24,0xAd,0xB6, //2042 0x04,0x9B,0x4A, //2043 0x7A,0x4B,0xBe, //2044 0x0d,0x25,0x4B, 0x8d,0x52,0xBf, 0x0B,0x54,0x52, 0x0B,0x6A,0x47, 0x69,0x6d,0x3C, 0x09,0x5B,0x50, 0x04,0x9B,0x45, 0x4A,0x4B,0xB9, 0x0A,0x4B,0x4d, 0xAB,0x25,0xC2, 0x06,0xA5,0x54, 0x06,0xd4,0x49, 0x6A,0xdA,0x3d, 0x0A,0xB6,0x51, 0x09,0x37,0x46, 0x54,0x97,0xBB, 0x04,0x97,0x4f, 0x06,0x4B,0x44, 0x36,0xA5,0x37, 0x0e,0xA5,0x4A, 0x86,0xB2,0xBf, 0x05,0xAC,0x53, 0x0A,0xB6,0x47, 0x59,0x36,0xBC, 0x09,0x2e,0x50, 0x0C,0x96,0x45, 297
0x4d,0x4A,0xB8,
//1975 //1976 //1977 //1978 //1979 //1980 //1981 //1982 //1983 //1984 //1985 //1986 //1987 //1988 //1989 //1990 //1991 //1992 //1993 //1994 //1995 //1996 //1997 //1998 //1999 294 //2000 //2001
0x0A,0x95,0x4e, 0x0B,0x4A,0x43, 0x4B,0x55,0x37, 0x0A,0xd5,0x4A, 0x95,0x5A,0xBf, 0x04,0xBA,0x53, 0x0A,0x5B,0x48, 0x65,0x2B,0xBC, 0x05,0x2B,0x50, 0x0A,0x93,0x45, 0x47,0x4A,0xB9,
0x06,0xAA,0x4C, 0x0A,0xd5,0x41, 0x24,0xdA,0xB6, 0x04,0xB6,0x4A, 0x69,0x57,0x3d, 0x0A,0x4e,0x51, 0x0d,0x26,0x46, 0x5e,0x93,0x3A, 0x0d,0x53,0x4d, 0x05,0xAA,0x43, 0x36,0xB5,0x37, 0x09,0x6d,0x4B, 0xB4,0xAe,0xBf, 0x04,0xAd,0x53, 0x0A,0x4d,0x48, 0x6d,0x25,0xBC, 2
//2010 0x0A,0x4B,0x51, 0x0A,0xA5,0x46, //2011 //2012 0x5B,0x52,0xBA, 0x06,0xd2,0x4e, //2013 //2014 0x0A,0xdA,0x42, 0x35,0x5B,0x37, //2015 0x09,0x37,0x4B, //2016 0x84,0x97,0xC1, //2017 //2018 0x04,0x97,0x53, //2019 0x06,0x4B,0x48, 0x66,0xA5,0x3C, //2020 0x0e,0xA5,0x4f, //2021 //2022 0x06,0xB2,0x44, //2023 0x4A,0xB6,0x38, 0x0A,0xAe,0x4C, //2024 0x09,0x2e,0x42, //2025 0x3C,0x97,0x35, //2026 0x0C,0x96,0x49, //2027 0x7d,0x4A,0xBd, //2028 //2029 0x0d,0x4A,0x51, 0x0d,0xA5,0x45, //2030
0x55,0xAA,0xBA, //2031 //2032 0x05,0x6A,0x4e, 0x0A,0x6d,0x43, //2033 //2034 0x45,0x2e,0xB7, //2035 0x05,0x2d,0x4B, //2036
0x8A,0x95,0xBf, //2045 //2046 //2048 //2047 //2049 //2050 //2051 //2052 //2053 //2054 //2056 //2055 //2057 //2058 //2060 //2059 //2061 //2062 //2063 //2064 //2065 //2067 //2066 //2068 //2069 //2070 //2071
0x0A,0x95,0x53, //2072 0x0B,0x4A,0x47, //2073
0x6B,0x55,0x3B, //2074 0x0A,0xd5,0x4f, //2075 0x05,0x5A,0x45, //2076 0x4A,0x5d,0x38, //2077 0x0A,0x5B,0x4C, //2078
0x05,0x2B,0x42, //2079 0x77,0x29,0xBd, //2082 0x06,0xAA,0x51, //2083 0x0A,0xd5,0x46, //2084 0x54,0xdA,0xBA, //2085
0x04,0xB6,0x4e, //2086 0x0A,0x57,0x43, //2087 0x45,0x27,0x38, //2088 0x0d,0x52,0x52, //2091 0x0d,0xAA,0x47, //2092 0x66,0xB5,0x3B, //2093 0x05,0x6d,0x4f, //2094 0x04,0xAe,0x45, //2095 0x4A,0x4e,0xB9, //2096 0x0A,0x4d,0x4C, //2097 0x0d,0x15,0x41, //2098 0x3A,0x93,0xB6, 0x0d,0x26,0x4A, //2080 //2089 0x2d,0x92,0xB5, 0x06,0x93,0x49, //2081 0x8e,0x93,0x3e, //2090
};
///月份数据表
code uchar
day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; code uint day_code2[3]={0x111,0x130,0x14e};
/*
函数功能:输入BCD阳历数据,输出BCD阴历数据
调用函数示例:Conversion 如:计算2004年10月16日
Conversion;
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪
标志位,c_sun=0为21世 纪,c_sun=1为19世纪
调用函数后,原有数据不变,读
c_moon,year_moon,month_moon,day_moon得出阴历BCD数据*/
bit c_moon;
data uchar year_moon,month_moon,day_moon,week;
/*子函数,用于读取数据表中农历月的大月或小月,如果该月为
大返回1,为小返回0*/ bit get_moon_day {
uchar temp; switch {
case 1:{temp=year_code[table_addr]&0x08; if return;else return;} case 2:{temp=year_code[table_addr]&0x04; if return;else return;} case 3:{temp=year_code[table_addr]&0x02; if return;else return;} case 4:{temp=year_code[table_addr]&0x01; if return;else return;} case 5:{temp=year_code[table_addr+1]&0x80; if return;else return;} case 6:{temp=year_code[table_addr+1]&0x40; if return;else return;}
3
//2099
case 7:{temp=year_code[table_addr+1]&0x20; if return;else return;} case 8:{temp=year_code[table_addr+1]&0x10; if return;else return;} case 9:{temp=year_code[table_addr+1]&0x08; if return;else return;} case 10:{temp=year_code[table_addr+1]&0x04; if return;else return;} case 11:{temp=year_code[table_addr+1]&0x02; if return;else return;} case 12:{temp=year_code[table_addr+1]&0x01; if return;else return;} case 13:{temp=year_code[table_addr+2]&0x80; if return;else return;} }
} /*
函数功能:输入BCD阳历数据,输出BCD阴历数据 调用函数示
例:Conversion 如:计算2004年10月16日Conversion;
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪
标志位,c_sun=0为21世 纪,c_sun=1为19世纪
调用函数后,原有数据不变,读
c_moon,year_moon,month_moon,day_moon得出阴历BCD数据 */
void Conversion
{ //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数
据 uchar temp1,temp2,temp3,month_p; uint temp4,table_addr;
bit flag2,flag_y;
temp1=year/16; //BCD->hex 先把数据转换为十六进制
temp2=year%16;
year=temp1*10+temp2; temp1=month/16; temp2=month%16;
month=temp1*10+temp2; temp1=day/16; temp2=day%16; day=temp1*10+temp2; //定位数据表地址 if
{
table_addr=*0x3; } else
{
table_addr=*0x3;
4
}
//定位数据表地址完成 //取当年春节所在的公历月份
temp1=year_code[table_addr+2]&0x60; temp1=_cror_;
//取当年春节所在的公历月份完成 //取当年春节所在的公历日
temp2=year_code[table_addr+2]&0x1f; //取当年春节所在的公历
日完成
// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月 if {
temp3=temp2-1; } else
{
temp3=temp2+0x1f-1; }
// 计算当年春年离当年元旦的天数完成
//计算公历日离当年元旦的天数,为了减少运算,用了两个表 //day_code1[9],day_code2[3]
//如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
//在九月后,天数大于0xff,用表day_code2[3]
//如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1 //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1 if {
temp4=day_code1[month-1]+day-1; } else
{
temp4=day_code2[month-10]+day-1; }
if &&)
{ //如果公历月大于2月并且该年的2月为闰月,天数加1 temp4+=1; }
//计算公历日离当年元旦的天数完成 //判断公历日在春节前还是春节后
if
{ //公历日在春节后或就是春节当日使用下面代码进行运算 temp4-=temp3;
month=0x1;
month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月 flag2=get_moon_day; //检查该农历月为大小还是小月,大月返回1,小月返回0
5
39公历和农历转换算法详解_农历转公历
flag_y=0;
iftemp1=0x1d; //小月29天
else temp1=0x1e; //大小30天
temp2=year_code[table_addr]&0xf0;
temp2=_cror_; //从数据表中取该年的闰月月份,如为0则该年无闰月
while
{
temp4-=temp1;
month_p+=1;
if
{
flag_y=~flag_y;
if
month+=1;
}
else month+=1;
flag2=get_moon_day;
iftemp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else
{ //公历日在春节前使用下面代码进行运算
temp3-=temp4;
if
{
year=0x63;c=1;
}
else year-=1;
table_addr-=0x3;
month=0xc;
temp2=year_code[table_addr]&0xf0;
temp2=_cror_;
if
month_p=0xc;
else
month_p=0xd; //
/*month_p为月份指向,如果当年有闰月,一年有十三个月,月指
向13,无闰月指向12*/
flag_y=0;
flag2=get_moon_day;
iftemp1=0x1d;
else temp1=0x1e;
while
{
temp3-=temp1;
month_p-=1;
ifmonth-=1;
ifflag_y=~flag_y;
flag2=get_moon_day;
iftemp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据
temp1=year/10;
temp1=_crol_;
temp2=year%10;
year_moon=temp1|temp2;
temp1=month/10;
temp1=_crol_;
temp2=month%10;
month_moon=temp1|temp2;
temp1=day/10;
temp1=_crol_;
temp2=day%10;
day_moon=temp1|temp2;
}
/*函数功能:输入BCD阳历数据,输出BCD星期数据
调用函数示例:Conver_week
如:计算2004年10月16日Conversion;
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
纪,c_sun=1为19世纪
调用函数后,原有数据不变,读week得出阴历BCD数据
*/
code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
/*
算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在
闰年又不到3 月份上述之和要减一天再除7
星期数为0
*/
void Conver_week
{//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
uchar temp1,temp2;
temp1=year/16; //BCD->hex 先把数据转换为十六进制
temp2=year%16;
year=temp1*10+temp2;
temp1=month/16;
temp2=month%16;
month=temp1*10+temp2;
temp1=day/16;
temp2=day%16;
day=temp1*10+temp2;
if {year+=0x64;} //如果为21世纪,年份数加100
temp1=year/0x4; //所过闰年数只算1900年之后的
temp2=year+temp1;
temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
temp2=temp2+day+table_week[month-1];
if temp2-=1;
week=temp2%0x7;
}
//test
uchar c_sun,year_sun,month_sun,day_sun;
void main
{
c_sun=1;
year_sun=0x2;
month_sun=0x11;
day_sun=0x3;
Conver_week;
Conversion;
while;
}
算法一:公历转农历
====================================================
======================== /*------------农历转换函数-----------*/
char *GetDayOf
{
/*天干名称*/
const char *cTianGan[] = {“甲”,”乙”,”丙”,”丁”,”戊”,”己”,”庚”,”辛”,”壬”,”癸”};
/*地支名称*/
const char *cDiZhi[] = {“子”,”丑”,”寅”,”卯”,”辰”,”巳”,”午”,”未”,”申”,”酉”,”戌”,”亥”};
/*属相名称*/
const char *cShuXiang[] = {“鼠”,”牛”,”虎”,”兔”,”龙”,”蛇”,”马”,”羊”,”猴”,”鸡”,”狗”,”猪”};
/*农历日期名*/
const char *cDayName[] = {“*”,”初一”,”初二”,”初三”,”初四”,”初五”,
“初六”,”初七”,”初八”,”初九”,”初十”,”十一”,”十二”,”十三”,”十四”,”十五”,”十六”,”十”,”十八”,”十九”,”二十”,”廿一”,”廿二”,”廿三”,”廿四”,”廿五”,”廿六”,”廿七”,”廿八”,”廿九”,”三十”};
/*农历月份名*/
const char *cMonName[] = {“*”,”正”,”二”,”三”,”四”,”五”,”六”,”七”,”八”,”九”,”十”,”十一”,”腊”};
/*公历每月前面的天数*/
const int wMonthAdd[12] =
{0,31,59,90,120,151,181,212,243,273,304,334};
/*农历数据*/
const int wNongliData[100] =
{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};
static int wCurYear,wCurMonth,wCurDay;
static int nTheDate,nIsEnd,m,k,n,i,nBit;
TCHAR szNongli[30], szNongliDay[10],szShuXiang[10];
/*---取当前公历年、月、日---*/
wCurYear = pSt->wYear;
wCurMonth = pSt->wMonth;
wCurDay = pSt->wDay;
/*---计算到初始时间1921年2月8日的天数:1921-2-8---*/
nTheDate = * 365 + / 4 + wCurDay +
wMonthAdd[wCurMonth - 1] - 38; if) && )
nTheDate = nTheDate + 1;
/*--计算农历天干、地支、月、日---*/
nIsEnd = 0;
m = 0;
while
{
if
k = 11;
else
k = 12;
n = k;
while
{
//获取wNongliData的第n个二进制位的值
nBit = wNongliData[m];
for
nBit = nBit/2;
nBit = nBit % 2;
if )
{
nIsEnd = 1;
break;
}
nTheDate = nTheDate - 29 - nBit;
n = n - 1;
}
if
break;
m = m + 1;
}
wCurYear = 1921 + m;
wCurMonth = k - n + 1;
wCurDay = nTheDate;
if
{
if
wCurMonth = 1 - wCurMonth;
else if
wCurMonth = wCurMonth - 1;
}
/*--生成农历天干、地支、属相 ==> wNongli--*/
wsprintf % 60) % 12]);
wsprintf年”,szShuXiang,cTianGan[ % 60) % 10],cDiZhi[ %
60) % 12]);
/*--生成农历月、日 ==> wNongliDay--*/
if
wsprintf;
else
strcpy;
strcat;
strcat;
return strcat;
}
====================================================
========================
首先,我们要确定一个时刻,作为一天的起点。然后我们以月亮通过朔望交界点的那一天作为每个月的第一天,以太阳通过雨水点的那个月作为正月,依次的,以太阳通过各中气点的那个月作为二月、三月等等。
经过长期的观察之后,我们就会发现每个月不是29天就是30天,每年不是12个月就是13个月,每个中气点唯一对应一个月,但是有的月却没有中气。
为了制定我们的历法,我们至少要知道足够精度的朔望月长
度,记为ML,和两个中气的间隔时间记为YL,这两个值经过前人长期不懈的观测和计算,我们知道分别为29.5306日和30.4377日。接下来,我们要随便找到某一年,以太阳通过雨水点的时刻到那一年开始的那个时刻的时间,记为DY,以日为单位,还
39公历和农历转换算法详解_农历转公历
要找出这一年正月里,月亮通过朔望交界点的时刻到那一月开始的那个时刻的时间,记为DM,以日为单位。这两个值是要通过实地观测得出来的。
这个时候,我们就可以通过递推来制订我们的历法,以预测未来月球和太阳的运行情况,并进一步预测月相的变化和气候的变化。
在本算法中我们使用了三个近似处理:
每天的长度总是一样的;
每个朔望月的长度总是一样的;
每两个相邻中气的时间总是一样的。
接下来,我们就逐月推算每月的大小:
Select Case Fix
Case is = 29
The month have 29 days.
The DM of next month is DM + ML - 29.
Case is = 30
The month have 30 days.
The DM of next month is DM + ML - 30.
End Select
每年中各月的月份、是否为闰月
For i = 1 to 12
This month has A days.
If DY>=A Then
This month is an Extra Month.
DY = DY - A
Else
This month is the i Month.
DY = DY + YL - A
i = i + 1
End If
Next
这就是我们的核心算法。通过它,我们可以从任何一个包含中气的月份开始向后推算各月各年的情况。 由于我们所用的DM、DY、ML、YL都是近似值,若干年后,我们的历法必有偏差,我们只要重新观测,更新DM、DY、ML、YL的值就可以了。事实上,诸朝气数最多不过400年,在这些值精确到万分位的时候,通行一朝是完全可以的。
下面对大小月的排列和闰月的出现作一些定性分析
显然0?DM,1,那么
DM,0.4694时,当月为小月,下月为大月
DM?0.4694时,当月为大月
DM,0.4694 * 2时,下月为小月,下下月为大月
DM?0.4694 * 2时,下月亦为大月,下下月为小月
所以,大小月一般是交替出现,有时会出现连续两个月是大月的情况,但不会出现连续三个月或更多的是大月的情况,也不会出现连续两个月更多的是小月的情况。也就是说,一般是小月大月相继出现一段时间
后,接着就出现一个大月,然后又是小月大月相继出现,具体的间隔也不定,大家可以通过计算机推算后,找点规律出来。
一年中最少有十二个月,因为YL * 12 , ML * 12 + 1 ,最多有十三个月,因为30 + YL * 12 , ML * 14。两个相邻中气的间隔时间大于30,所以一个月不可能有两个中气,那么一年有十二个月的时候,12个中气必然刚好依次各居一个月,这一年就称为平年,一年有十三个月的时候,必然有且仅有一个月没有中气,那个月就时闰月,这一年就称为闰年。平年的时候,根据大小月的排列规则,一年最多有8个大月,最少有6个大月,因为ML * 12 + 1 , 30 * 8 + 29
* ,所以不可能有8个大月,最多为7个大月,那么一年就为354或355天。闰年的时候,根据大小月的排列规则,一年最多有9个大月,最少有6个大月,因为ML * 13 + 1 , 30 * 8 + 29 * ,所以不可能有8个或更多的大月,最多为7个大月,那么一年就为383或384天。
因为每月的天数不固定,所以闰月的出现规律也不好讨论,连续十二个月的天数也不固定,所以闰年的出现规律也不好讨论。不过
可以肯定是,每年的第一个月肯定不是闰月,因为我们是以包含中气雨水的月份作为正月,也就是每年的第一个月的。所以,闰月必定出现在某个有名字的月份后面,出现在哪个后面就叫闰哪月。
由于有闰月,所以函数形式:
int toSolar;
引理:公历y-m-d一定在农历y-m-d之前
由引理,我们的探测可以从公历y-m-d开始,步骤如下:
1)toLunar;
2)估算ly0-lm0-ld0和ly-lm-ld的日子差 N = *12*29 + *29 + ;
3)如果 N > 0,把探测公历y-m-d加上这个天数, dateAddDays;
4)如果 N = 0,如果&&&&得到一个解sy=y;sm=m;sd=d;
否则表示出现误差,修正N = 1;dateAddDays;
从而开始探测闰月,令N = 30;dateAddDays;
5)如果 N = -30,肯定是上次探测N+29不够,应该+30,
所以令N = 1; dateAddDays;
经过测试,最多需要3次可以命中,还是比较理想的算法了:)
PS:经过完全测试,公元1500-2100年没有问,最多尝试次数为3次
#define LUNAR_TO_SOLAR_STEPS 3 // 公历转公历搜索最长步数
// 农历返回公历
// 注意:这是我在掌心万年历中写的代码,版权属于我所有,
仅供个人学习使用,严禁在任何商业软件中使用本代码
// 输入 农历年-月-日 ly-lm-ld
// 输出 公历年-月-日 y-m-d
/*
公元1500年前的情况太特殊,比如公元9-1月,缺少农历11月,直接导致计算ldiff错误...
所以toSolar只支持1500年以后的转换. --ZV
*/
int toSolar
{
if { // 非常复杂的问题
return CALENDAR_ERROR;
}
int ret; int y = LunarYear; int m = abs; int d = LunarDay;
int i, ldiff = 0, lunDate;
int ly, lm, ld;
validateDate;
for {
lunDate = toLunar;
DATE_TO_YMD;
if == abs && ld == LunarDay) {
if {
ret = YMD_TO_DATE;
return ret;
}
// 如果找到一个,则开始探测闰月
ldiff = 30; // 要么直接转到,要么多了一天而已
} else {
ldiff = * 12 * 29 + - abs) * 29 + ; if { // 稍做修正
ldiff = 1;
}
}
dateAddDays; // 注意可能出现负数
}
return CALENDAR_ERROR;
}