ChinaUnix首页 > 精华文章 > Shell > 正文

[精彩] 我出个题:怎么把阳历的日期换算成阴历?


http://www.chinaunix.net 作者:ohwww  发表于:2004-10-13 12:11:16
发表评论】 【查看原文】 【Shell讨论区】【关闭

我是看到别的版上的帖子想到的,不过我一点也不会, :oops:  :oops:



 sakulagi 回复于:2004-05-21 22:10:33

好像有个程序叫lunar的可以


 bjgirl 回复于:2004-05-22 12:57:18

有意思@_@,关注一下 :oops:


 ohwww 回复于:2004-05-23 13:36:38

引用:原帖由 "sakulagi"]好像有个程序叫lunar的可以
 发表:


知道在那儿嘛?能找到嘛?


 sakulagi 回复于:2004-05-23 15:47:22

http://www.gnu.org/directory/print/postscript/pcal.html
lunar没找到。看到另外一个程序:lcal


 ohwww 回复于:2004-05-23 18:14:58

英文不太好,大体看了看,这个程序是用c语言写的吧??有没有shell下的呢??


 sakulagi 回复于:2004-05-23 19:08:01

那就是用shell脚本自己写一个计算了?可以找一个换算的算法,或者干脆参考一下那个lcal的源码,然后自己编一个shell脚本来算。


 xyb 回复于:2004-05-23 21:02:27

C 编写的 lunar 和 python 编写的 ccal 在这里:http://cxterm.sourceforge.net/ccal.html

不知道按你的想法 python 的程序是不是可以算做是“脚本”?


 admirer 回复于:2004-05-23 22:25:21

题目很好,但作起来难度很大,要有充分的时间去考虑才行噢!
关注中......


 ohwww 回复于:2004-05-24 11:30:28

引用:原帖由 "xyb" 发表:
C 编写的 lunar 和 python 编写的 ccal 在这里:http://cxterm.sourceforge.net/ccal.html

不知道按你的想法 python 的程序是不是可以算做是“脚本”?



 :oops: 我也不知道,我在看ccal的源码呢,挺不容易看的。不知道能不能在shell下运行。


 ohwww 回复于:2004-05-24 11:32:48

反正我是看不懂,我都不知道是用什么写的,怎么来运行,唉 :oops:  :? 

#!/usr/bin/env python
'''
Usage:  ccal Month [4-Digit-Year]
   or:  ccal 4-Digit-Year Month

This Python script is to show Solar and Lunar calender at the
same time. You need to have Python (2.0 or above) installed.

Acceptable date range:  1900/2 -- 2049/12

Output contains Chinese characters (mainland GB2312 encoding),
must be viewed in a Chinese-enabled system or "cxterm" etc.
programms under UNIX X-Windows.

The major reference for me to compose this program is:
lunar-2.1.tgz (1992), composed by
    Fung F. Lee <lee@umunhum.stanford.edu> and
    Ricky Yeung  <Ricky.Yeung@Eng.Sun.Com> .

And Lee and Yeung refered to:
    1. "Zhong1guo2 yin1yang2 ri4yue4 dui4zhao4 wan4nian2li4"
by Lin2 Qi3yuan2. 《中国阴阳日月对照万年历》.林
    2. "Ming4li3 ge2xin1 zi3ping2 cui4yan2" by Xu2 Le4wu2.
《命理革新子平粹言》.徐
    3.  Da1zhong4 wan4nian2li4. 《大众万年历》

License:
    GNU General Public License (GPL, see http://www.gnu.org).
    In short, users are free to use and distribute this program
    in whole. If users make revisions and distribute the revised
    one, they are required to keep the revised source accessible
    to the public.

Version:
    0.2.0,  Jan/6/2002, ShengXiao(生肖), lunar leap month(闰月)
            added.
    0.1.0,  Jan/4/2002

--- Changsen Xu <xucs007@yahoo.com>
'''

#remember, in this program:
#   month=0 means Januaray, month=1 means February ...;
#   day=0 means the first day of a month, day=1 means the second day,
#       so as to easy to manipulate Python lists. 
#   year=0 is 1900, until the last step to output

daysInSolarMonth= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
lunarMonthDays  = [29,30] # a short (long) lunar month has 29 (30) days */

shengXiaoEn     = ["Mouse", "Ox", "Tiger", "Rabbit", "Dragon", "Snake",
                   "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig"]
shengXiaoGB     = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡",
                   "狗", "猪"]
zhiGB           = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉",
                   "戌", "亥"]
ganGB           = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]

monthEn         = ['January', 'February', 'March', 'April', 'May', 'June',
                   'July', 'August', 'September', 'October', 'November',
                   'December']
weekdayEn       = ["Monday", "Tuesday", "Wednesday", "Thursday",
                   "Friday", "Saturday", "Sunday"]
weekdayGB       = ["一", "二", "三", "四", "五", "六", "日"]
numGB           = ['○', "一", "二", "三", "四", "五", "六", "七", "八", "九",
                   "十"]
lunarHoliday    = {'0_0':'春节', '4_4':'端午', '7_14':'中秋', '8_8':'重阳',
                   '0_14':'元宵'}


#   encoding:
#        b bbbbbbbbbbbb bbbb
#      bit#     1 111111000000 0000
#               6 543210987654 3210
#    . ............ ....
#      month#   000000000111
#               M 123456789012   L
#       
#   b_j = 1 for long month, b_j = 0 for short month
#   L is the leap month of the year if 1<=L<=12; NO leap month if L = 0.
#   The leap month (if exists) is long one if M = 1.
yearCode = [
     0x04bd8, # 1900 
    0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, # 1905 
    0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, # 1910 
    0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, # 1915 
    0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, # 1920 
    0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, # 1925 
    0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, # 1930 
    0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, # 1935 
    0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, # 1940 
    0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, # 1945 
    0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, # 1950 
    0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, # 1955 
    0x052d0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, # 1960 
    0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, # 1965 
    0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, # 1970 
    0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, # 1975 
    0x0d558, 0x0b540, 0x0b5a0, 0x195a6, 0x095b0, # 1980 
    0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, # 1985 
    0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, # 1990 
    0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, # 1995 
    0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, # 2000 
    0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, # 2005 
    0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, # 2010 
    0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, # 2015 
    0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, # 2020 
    0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, # 2025 
    0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, # 2030 
    0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, # 2035 
    0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, # 2040 
    0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, # 2045 
    0x0aa50, 0x1b255, 0x06d20, 0x0ada0 # 2049 
]
yearsCoded = len(yearCode)


from sys import argv, exit, stdout
from time import time, localtime
ow=stdout.write



class LunarYearInfo:
    def __init__(self):
        self.yearDays = 0
        self.monthDays = [0]*13
        self.leapMonth = -1  # -1 means no lunar leap month

yearInfo = [0]*yearsCoded #global variable
for i in range(yearsCoded):
    yearInfo = LunarYearInfo()



class Date:
    def __init__(self, year, month, day, weekday=-1, gan=-1, zhi=-1):
        self.year   =year
        self.month  =month
        self.day    =day
        self.weekday=weekday
        self.gan    =gan
        self.zhi    =zhi

solar1st = Date(0, 0, 30, weekday=2)   #Wednesday, January 31, 1900
lunar1st = Date(0, 0, 0,  weekday=2, gan=6, zhi=0)
#Wednesday, First day, First month, 1900, 庚子年



def error(msg):
    print 'Error:', msg; exit(0)



def isSolarLeapYear (year):
    year=year+1900
    return (year%4 == 0) and (year%100 != 0) or (year%400 == 0)



baseYear=1201 - 1900
# in fact, real baseYear=1201.  In order to ease calculation of
# leap years. real baseYear must conform to:
#   realBaseYear%4==1 and realBaseYear%400==1.
# Assert realBaseYear < solar1st.year .

# Compute the number of days from the Solar First Date
# month=0 means January, ...
def solarDaysFromBaseYear(d):    #d is a Date class
    delta = d.year - baseYear 
    offset = delta*365 + delta/4 - delta/100 + delta/400
    for i in range(d.month):
     offset += daysInSolarMonth;
    if d.month>1 and isSolarLeapYear(d.year):
offset += 1
    offset += d.day
##   print '___', year, month, day, 'offset=', offset ########
    return offset

# Compute the number of days from the Solar First Date
# month=0 means January, ..., year=0 means 1900, ...
def solarDaysFromFirstDate (d): #d is a Date class
    return solarDaysFromBaseYear (d) - solarDaysFromBaseYear (solar1st)



def calcLunarDaysPerMonth(iYear):
    code = yearCode[iYear]
    leapMonth = code&0xf #leapMonth==0 means no lunar leap month

    code >>= 4
    for iMonth in range(12):
        yearInfo[iYear].monthDays[11-iMonth] = lunarMonthDays [code&0x1]
        code >>= 1

    if leapMonth>0:
        yearInfo[iYear].leapMonth = leapMonth-1 
        yearInfo[iYear].monthDays.insert (leapMonth,
                lunarMonthDays [code & 0x1])



def calcAllLunarYearsInfo():
    for iYear in range(yearsCoded):
        calcLunarDaysPerMonth (iYear)
        for iMonth in range(13):
    yearInfo[iYear].yearDays += yearInfo[iYear].monthDays[iMonth]




#input dateSolar, return (dateLunar, isLunarMonthOrNot)
def solar2Lunar(d): #d is a Date class
    dLunar = Date(-1, -1, -1) #unknown lunar Date class

    offset = solarDaysFromFirstDate(d)

    dLunar.weekday  = (offset + solar1st.weekday)%7

    for iYear in range(yearsCoded):
        if offset < yearInfo[iYear].yearDays:
            dLunar.year = iYear; break
offset -= yearInfo[iYear].yearDays
    if dLunar.year == -1:   error ("Date out of range.")

    dLunar.gan      = (dLunar.year + lunar1st.gan) % 10
    dLunar.zhi      = (dLunar.year + lunar1st.zhi) % 12

    for iMonth in range(13):
        if offset< yearInfo[dLunar.year].monthDays[iMonth]:
            dLunar.month = iMonth; break
offset -= yearInfo[dLunar.year].monthDays[iMonth]

    dLunar.day = offset
        
    isLeapMonth=0
    if yearInfo[dLunar.year].leapMonth >=0:
        if dLunar.month ==  yearInfo[iYear].leapMonth + 1:
            isLeapMonth=1
        if dLunar.month > yearInfo[dLunar.year].leapMonth:
            dLunar.month -= 1

    return (dLunar, isLeapMonth)



def getSolarDaysInMonth (year, month):
    if isSolarLeapYear(year) and month==1:
            return 29
    else:   return daysInSolarMonth[month]


def num2GB (num):
    if num==10:
        return '十'
    elif num>10 and num<20:
        return '十' + numGB[num-10]

    tmp=''
    while num>10:
        tmp = numGB[num%10] + tmp
        num = int(num/10)
    tmp = numGB[num] + tmp
    return tmp


def lunarDate2GB (dLunar, isLeapMonth):
    tmp = str(dLunar.month)+'_'+str(dLunar.day)
    if lunarHoliday.has_key( tmp ):
        return '%s  '% lunarHoliday[tmp] + \
               ' '*(6-len(lunarHoliday[tmp]))
    elif dLunar.day==0:    
        tmp2 = '闰'*isLeapMonth + num2GB(dLunar.month+1) +'月'
        return '%s' % tmp2 + ' '*(8-len(tmp2))
    elif dLunar.day<10:
        return '初' + num2GB(dLunar.day+1)
    else:
        return num2GB(dLunar.day+1)


def outputCalendar(year, month):
    dLunar = Date(-1,-1,-1)
    ow ('\n     阳历%d年%d月         ' % (year+1900, month+1) )

    for iDay in range( getSolarDaysInMonth(year, month) ):
        dSolar = Date(year, month, iDay)
        dLunar, isLeapMonth = solar2Lunar (dSolar)

        if iDay==0:
            ow ('始于 阴历%s年%s%s月 (%s%s年, 生肖属%s)\n' %
                ( num2GB(dLunar.year+1900), '闰'*isLeapMonth,
                  num2GB(dLunar.month+1),
                  ganGB [dLunar.gan], zhiGB[dLunar.zhi], shengXiaoGB[dLunar.zhi]
                ))
            ow ('='*74 + '\n')
            for i in range(7):
                ow ("%3s %2s     " % (weekdayEn[:3], weekdayGB) )
            ow('\n\n')
            for i in range(dLunar.weekday): ow(' '*11)

        elif dLunar.weekday==0: ow('\n')

        ow ( "%2d %-8s" %(iDay+1, lunarDate2GB(dLunar, isLeapMonth) ) )
    ow('\n\n')




def checkArgv (argv):
    argc = len(argv)
    if argc==1 or argv[1] in ('-h', '--help'):
        print __doc__; exit(0)

    #in case people input arguments as "4-digit-year month"
    if argc==3 and len(argv[1]) == 4 and len(argv[2]) in (1,2):
        argv[1], argv[2] = argv[2], argv[1]

    
    #Get month
    month=-1
    for iMonth in range(12):
        if argv[1].lower() == monthEn[iMonth].lower() or \
           argv[1].lower() == monthEn[iMonth][:3].lower():
               month = iMonth+1; break
    if month==-1:
        month = eval(argv[1])

    if month<1 or month>12:     error ("Month not within 1--12.")

    #Get year
    if argc==2: year = localtime(time())[0]
    else:
        if len(argv[2]) != 4:   error ("Year must be 4 digits.")
        year = eval(argv[2])
        if year<1900 or year>= 1900+yearsCoded or (year==1900 and month==1):
            error ("Year must be within %d--%d, excluding 1900/1."
                    % (1900, 1900 + yearsCoded-1) )

    return year-1900, month-1

year, month = checkArgv(argv)
calcAllLunarYearsInfo()
outputCalendar(year, month)




 bjgirl 回复于:2004-05-24 12:14:43

:oops: PFPF :D


 xyb 回复于:2004-05-24 13:05:19

执行ccal可以:
python ccal.py
或者:
chmod +x ccal.py
./ccal.py

python语言很容易学习的,在国外非常流行,最近几年用python开发的开源项目层出不穷,希望国内有更多的人来关注。请参考:
http://www.czug.org/docs/python/TutorialCN 教程
http://www.linuxforum.net/forum/postlist.php?Cat=&Board=python 论坛


 xyb 回复于:2004-05-24 13:22:05

引用:原帖由 "admirer" 发表:
题目很好,但作起来难度很大,要有充分的时间去考虑才行噢!
关注中......


阴历和阳历的转换是不能通过公式推导的,因为阴历是通过天文演算得到的。常用的办法是做一个对照表,lunar和ccal程序都是这样做的。作一个用shell常用工具更容易处理的映射表,用gawk、grep、bc之类应该也很容易作这个阴阳历转换,不过可能会有点烦琐,不象高级语言那么方便。


 ohwww 回复于:2004-05-24 17:10:35

是没有推导出来,现在的计算机的日历都是所谓的阳历,不过做这个对照表可就太麻烦了吧?我看那个ccal中的程序怎么看不懂那个对照表呢?就那么少就可以了??


对python语音是一点也不知道,就没听说过。真是孤陋寡闻.楼上的有没有这些资料的文档,发过来看看,去网上看不太方便


 xyb 回复于:2004-05-24 18:24:36

引用:原帖由 "ohwww" 发表:
是没有推导出来,现在的计算机的日历都是所谓的阳历,不过做这个对照表可就太麻烦了吧?我看那个ccal中的程序怎么看不懂那个对照表呢?就那么少就可以了??

对python语音是一点也不知道,就没听说过。真是孤陋..........


对照表当然不能把每天都搞出来,那有多累赘。因为阳历是很容易计算的,只要把每年做一个索引就可以了。

python的资料我上面不是已经给你贴出来链接了吗?没有看到?


 ohwww 回复于:2004-05-25 08:10:57

看到了,我是想你有打包的话给一个,否则每次都得去网上看,不方便,从那儿也不好下载.你没有就算了.


 ohwww 回复于:2004-05-28 08:27:14

没人接了


 noskill 回复于:2004-06-01 13:18:31

引用:原帖由 "ohwww" 发表:
是没有推导出来,现在的计算机的日历都是所谓的阳历,不过做这个对照表可就太麻烦了吧?我看那个ccal中的程序怎么看不懂那个对照表呢?就那么少就可以了??


对python语音是一点也不知道,就没听说过。真是孤陋..........


前一段刚用java写了一个,和python的差不多。
那个对照表就是用来记录阴历年份中有没有闰月,闰月是几月,这一年中每个月分别是大月还是小月(29/30天),每条纪录转换成2进制码后用对应位上面的0/1表示,每条纪录是一年,所以这个表也不是无限期的。


 ohwww 回复于:2004-06-02 10:39:33

楼上的不能翻译成shell脚本吗?


 ohwww 回复于:2004-10-10 16:07:19

up


 ecloud 回复于:2004-10-10 16:52:11

其实并不是没有公式计算的
不过很复杂,而且每过一段时间还要更改一个偏移量
对照表也是人家天文台算出来的


 ohwww 回复于:2004-10-10 16:54:03

考虑了一下,阴历和阳历之间应该是没有什么必然的关系的。
阳历和阴历是两种不同的历法,应该没有办法从一种推出另一种的,所以也就没有公式或算法能把阳历换算成阴历,反之亦然。
要想实现换算的话,只能通过对照表实现。


 xchen301 回复于:2004-10-10 18:00:33

晕倒~阴历规则太复杂了,


 xchen301 回复于:2004-10-10 18:01:54

中国的阴历,又称农历,大家应该都很熟悉。很多的传统节日,像春节,中秋都是阴历的节日。不过,若是问起阴历的规则,怕是知道的人就不多了。多数人知道初一是新月出现的那一天,月圆的那一天则在十五左右。不少人也知道二十四节气在阳历的每月中大概的日期。再细节的概念如闰月对大多数人则不甚了解了。本人经过一番查找与阅读,终于对阴历的规则有了一定的认识。在此愿与大家分享。 

首先阴历以月为基本单位,一个月以新月出现的那一天为始直至下一个新月出现的前一天。由于月亮公转的周期介于29到30天之间,阴历的一个月也就由新月出现时刻的早晚或是29天或是30天。大月为30天,小月为29天。与阳历不同的是,大小月在不同的年中不固定。如春节的前一天常称为大年三十,但有不少年如2000年的阴历十二月只有29天。由于十二个月的时间较阳历年即地球绕太阳公转一周的时间短11天左右,为了使阴历年与阳历年保持相对稳定,每隔两三年就需要加入一个闰月。大约每十九年要加入七个闰月。而二十四节气则是由地球在绕太阳公转的轨道上的位置确定的。以每年的冬至为始,每15度为一个节气。是故二十四节气在阳历的每月中有大概固定的日期。古时以二十四节气指导农耕,这就是阴历又称农历的原因。其中阳历下半月的十二个节气又称为中气。中气出现的时刻和闰月的确定有直接的关系。 

中国阴历的计算有下列四条规则: 

所有新月和节气出现的时刻的计算以东经120度即东八区标准时为准。但计算1929年以前的阴历时应以北京即东经116度25分的当地时为准。此条规则用以区分中国阴历和其他类似阴历如日本阴历。 
新月出现的一天为一个月的第一天。如某个节气的出现时刻也在这一天,则不论该节气的出现时刻是否比新月晚,一律算落入新的一个月中。 
每年的冬至总是出现在这年的阴历十一月中。 
从一年的冬至后一天起到下一年冬至这一天止的这段时间中,下称其间,如有十三个新月出现,则其间要加入一个闰月。需要加入闰月时,其间第一个没有中气的月为闰月。因为其间只有十二个中气,所以其间至少有一个月没有中气,也存在有两个月没有中气的可能性。但这种情况下只有第一个没有中气的月为闰月。闰月的前一个月为几月则该闰月称为闰几月。 
以上所列的阴历的计算规则是在清朝顺治年间,即公元1645年,开始采用的。以上规则的一个重要特点就是理论上完全以天文观测为依据,其中没有任何数学关系。这和阳历,即格里历,完全是由数学关系确定的形成了鲜明的对比。当然,具体到未来阴历的计算,仍然需要月亮与地球运动的数学模型,而且精度高的这种数学模型相当复杂,在没有电脑的情况下,一般人根本不可能推算出精确的阴历来。而阳历的数学关系则非常简单,是不是闰年很容易计算。这又形成了另外一种鲜明的对比。


 zhkun 回复于:2004-10-10 18:05:48

如果有shell,就更好啦!


 寂寞烈火 回复于:2004-10-10 18:07:09

网上好像有现成的工具


 xchen301 回复于:2004-10-10 18:17:13

网上很多程序是不准的,


 zhkun 回复于:2004-10-11 07:33:53

十分关注。


 ohwww 回复于:2004-10-11 21:08:39

我倒是找到了那个lunar程序,可是看不太懂


 ecloud 回复于:2004-10-13 11:43:38

本来是跟本版主题无关的,既然大家想了解,我就在这里说一说(要看懂的话你得有一点点的物理基础和天文学基础)
首先明确两个基本概念:
公历,也就是太阳历,其本质就是对太阳在黄道上的视位置进行划分
农历,也就是月亮历,其本质就是对月球在白道上的视位置进行划分
因此公历->农历的转换就是
已知太阳黄经刻度求月亮白经刻度的计算
在换算成更通俗一点的解释就是
已知地球轨道位置,求此时月球的视位置
粗略的计算方法需要的参数就是地球、月球的基本轨道参数(半长径、半短径、向径、偏心率、周期等)、质量,另外还包括轨道焦点的进动和地球的章动这两个偏移量
具体的计算公式就比较复杂了,其中包含大量的三角函数方程和迭代计算法
以上是一个基本的计算方法,用于日历换算足够了
当然精确一点的方法则要考虑到大行星的摄动,也就是他们的引力对地球和月球的轨道的影响,最主要的是离我们最近的火星和金星,以及质量最大的木星,这种计算精度适用于阿波罗登月之类的活动
最吹毛求疵的计算方法是把以上传统力学计算公式换成相对论公式,这样算出来的是最精确的,适用于吃饱了撑得和相对论狂热粉丝


 寂寞烈火 回复于:2004-10-13 12:11:16

引用:原帖由 "ecloud" 发表:
本来是跟本版主题无关的,既然大家想了解,我就在这里说一说(要看懂的话你得有一点点的物理基础和天文学基础)
首先明确两个基本概念:
公历,也就是太阳历,其本质就是对太阳在黄道上的视位置进行划分
农历,也..........


够复杂, :( 谢谢楼上滴,长见识了 ;)




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=330005
转载请注明作者名及原文出处