每個人都認為一年是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>