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