24節氣計算

      在〈24節氣計算〉中尚無留言

每個人都認為一年是365天??

請問一天是幾秒? 一天是 86400 秒,請記熟 24*60*60=86400秒

地球一年時間

地球公轉太陽一圈稱為一年,大家以為就是365天, 31,536,000 秒

但正確數字是 365 日 5 小時 48 分 46 秒,即365.2422天,也就是 365*86400+5*3600+48*60+46 = 31,556,926秒。

多出的 5 個多小時,需要每隔 4 年就多加 1 天,但100年那年不閏年,所以才會有 4 年一閏( 2 月有 29天),百年不閏的現象。不過還是有多出來的部份,所以400年還要一閏(西元 2000 年 2 月還是有 29 天)。

但實際上地球公轉太陽的秒數,每年都不一樣,這是因為受到月球潮汐影響,還有其它行星引力的牽引,造成每年公轉秒數不一樣,所以 24 節氣很難用公式精準算出,誤差值會在30分~60分鐘之間。

24節氣計算

每一節氣代表地球繞太陽移動15度,但因地球軌道是橢圓形,所以每一節氣的總秒數是不一樣的。是有公式可以算出每年每個節氣的啟始日及結束日,公式為 (Y*D+C)-L,Y 是西元年的後 2 位,D=0.2422,C 依不同的節氣有不同的常數,L 為閏年數。

底下的代碼,不使用公式計算,而是先把西元 2001 年每一節氣的總秒數計算出來,然後再套用到其它年。用此方法計算,套用到其它年都非常的準確,誤差不到半小時。

torrance= -210 秒是繞太陽一圈的誤差值。

from datetime import datetime
import numpy as np
solar=[
[2001,2,4,2,23],
[2001,2,18,22,19],
[2001,3,5,20,24],
[2001,3,20,21,19],
[2001,4,5,1,12],
[2001,4,20,8,19],
[2001,5,5,18,29],
[2001,5,21,7,26],
[2001,6,5,22,36],
[2001,6,21,15,20],
[2001,7,7,8,50],
[2001,7,23,2,11],
[2001,8,7,18,37],
[2001,8,23,9,14],
[2001,9,7,21,32],
[2001,9,23,6,53],
[2001,10,8,13,12],
[2001,10,23,16,15],
[2001,11,7,16,26],
[2001,11,22,13,51],
[2001,12,7,9,20],
[2001,12,22,3,13],
[2002,1,5,20,36],
[2002,1,20,13,55],
[2002,2,4,8,16],
]
torrance=-210
start=datetime(1970, 2, 4, 13, 50).timestamp()
period=[]
for i in range(1, len(solar)):
    d1 = datetime(*solar[i-1])
    d2 = datetime(*solar[i])
    period.append((d2-d1).total_seconds()+torrance/24)
    #print(i-1, period[i-1])
solar_dic={'立春':0,'雨水':1,'驚蟄':2,'春分':3,'清明':4,'殼雨':5,
'立夏':6,'小滿':7,'芒種':8,'夏至':9,'小暑':10,'大暑':11,
'立秋':12,'處暑':13,'白露':14,'秋分':15,'寒露':16,'霜降':17,
'立冬':18,'小雪':19,'大雪':20,'冬至':21,'小寒':22,'大寒':23}

year_second=np.sum(period)
now=eval(input('請輸入西元年 : '))
years=now-1970
for i, key in enumerate(solar_dic):
    index = solar_dic[key]
    month = int(index / 2) + 2
    if month == 13: month = 1
    now_stmp=start+year_second*years+np.sum(period[:index])
    d=datetime.fromtimestamp(now_stmp)
    print(key, d.strftime("%Y-%m-%d %H:%M"), end='   ')
    if i%2==1:print()

結果 : 
請輸入西元年 : 2023
立春 2023-02-04 10:33   雨水 2023-02-19 06:29   
驚蟄 2023-03-06 04:34   春分 2023-03-21 05:29   
清明 2023-04-05 09:21   殼雨 2023-04-20 16:28   
立夏 2023-05-06 02:38   小滿 2023-05-21 15:35   
芒種 2023-06-06 06:45   夏至 2023-06-21 23:29   
小暑 2023-07-07 16:59   大暑 2023-07-23 10:19   
立秋 2023-08-08 02:45   處暑 2023-08-23 17:22   
白露 2023-09-08 05:40   秋分 2023-09-23 15:01   
寒露 2023-10-08 21:20   霜降 2023-10-24 00:23   
立冬 2023-11-08 00:33   小雪 2023-11-22 21:58   
大雪 2023-12-07 17:27   冬至 2023-12-22 11:20   
小寒 2024-01-06 04:43   大寒 2024-01-20 22:02  

使用公式計算

使用 (Y*D+C)-L 來計算的話,代碼如下,但非常的不準確

import datetime
#Y : 西元後 2 碼, D : 0.2422, C需查表, L : 閏年數
#(Y*D+C)-L
D=0.2422
solar={'立春':0,'雨水':1,'驚蟄':2,'春分':3,'清明':4,'殼雨':5,
'立夏':6,'小滿':7,'芒種':8,'夏至':9,'小暑':10,'大暑':11,
'立秋':12,'處暑':13,'白露':14,'秋分':15,'寒露':16,'霜降':17,
'立冬':18,'小雪':19,'大雪':20,'冬至':21,'小寒':22,'大寒':23}
C0=[3.87,18.73, 5.63, 20.646,4.81,20.888,
   6.318,21.86,6.5,22.2,7.928,23.65,
   8.35,23.95,8.44,23.822, 9.098,24.218,
   8.218,23.08, 7.9, 22.6, 6.11, 20.84]
C1=[3.87,18.73, 5.63, 20.646,4.81,20.1,
   5.52,21.04,5.678,21.37,7.108,22.83,
   7.5,23.13,7.646,23.042, 8.318,23.438,
   7.438,22.36, 7.18, 21.94, 5.4055, 20.12]
C1=[3.8585,18.689,
    5.6085, 20.6475,
    4.8069,20.106,
    5.526,21.068,
    5.6975,21.398,
    7.123,22.85,
    7.53,23.1445,
    7.652, 23.047,
    8.306,23.4375,
    7.4405,22.338,
    7.145, 21.896,
    5.6155, 20.341]
now=eval(input('請輸入西元年 : '))
year_last=now%100
if now>=2000:
    C=C1
else:
    C=C0
for i, term in enumerate(solar):
    index = solar[term]
    month=int(index/2)+2
    yyyy=now
    if month==13:
        month=1
        yyyy+=1
    #潤年數 : 立春,雨水,小寒,大寒要減 1
    leap=year_last
    if index<=1 or index >=22 : leap-=1
    day=year_last*D+C[index]-int(leap/4)
    #2000年 立春,雨水,小寒,大寒 要加 1 天
    if now ==2000 and (index<=1 or index >=22) : day+=1
    day_int=int(day)
    hr=(day-day_int)*24
    hr_int=int(hr)
    min=int((hr-hr_int)*60)

    print(f'{term} {yyyy}-{month:02d}-{day_int:02d} {hr_int:02d}:{min:02d}', end="    ")
    if i %2==1:print()

結果:
請輸入西元年 : 2023
立春 2023-02-04 10:17    雨水 2023-02-19 06:13    
驚蟄 2023-03-06 04:17    春分 2023-03-21 05:14    
清明 2023-04-05 09:03    殼雨 2023-04-20 16:14    
立夏 2023-05-06 02:19    小滿 2023-05-21 15:19    
芒種 2023-06-06 06:26    夏至 2023-06-21 23:14    
小暑 2023-07-07 16:38    大暑 2023-07-23 10:05    
立秋 2023-08-08 02:24    處暑 2023-08-23 17:09    
白露 2023-09-08 05:20    秋分 2023-09-23 14:49    
寒露 2023-10-08 21:02    霜降 2023-10-24 00:11    
立冬 2023-11-08 00:15    小雪 2023-11-22 21:48    
大雪 2023-12-07 17:10    冬至 2023-12-22 11:11    
小寒 2024-01-06 04:27    大寒 2024-01-20 21:52    

參考:

香港天文台 : 香港天文台是實際觀測天文每進15度的精準時間。網址如下https://www.hko.gov.hk/tc/gts/astronomy/data/files/24SolarTerms_2023.xml

通勝萬年歷 : https://calendar.8s8s.net/24jieqichaxun.php,請由藍色部份破解

<form action="/chahuangli.php" method="POST" name="chaxun">
<p>
<select size="1" name="y" class="set_select">
<option value="1801">1801</option><option value="1802">1802</option></select>年
<select size="1" name="j" class="set_select">
<option value="1">小寒</option><option value="2">大寒</option></select>節氣時間
</p>
<p>
<input type="hidden" name="action" value="jieqi">
<input class="set_submit" type="submit" name="huangli" value="二十四節氣查詢">
</p>
</form>

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *