關注我,領取每日份歡樂哦~
從前有個人關注了我,他才發現每天可以如此快樂
01
日期與時間
日期和時間的表達,對於日常生活來說是非常重要用的。時間和日期往往在含義上略有差異,但是實際上日期和時間是有機結合的整體。
年月日時分秒,是一個逐步細化的過程,其實就是精度的提升,當然這裡不考慮星期的事情。
常見的時間日期表達,可能會是像下面這樣的:
1.2019年10月18日下午2點51分
2.己亥年十月二十未時
3.Oct. 18th, 2019, 2:51pm
4.10/18/19 14:51
5.2019-10-18 06:51:00 UTC
6.18 October 2019, 2:51pm
7.2019-10-18T06:51:00
8.JD 2458775.28542
9.MJD 58774.78542
……
02
日期時間的本質
上面的格式雖然很複雜,有中的洋的,還有大家可能不認識的,但是表示的基本上是同一個時間(說基本上是因為它們的精度不太一樣)。
雖然上面的時間表達方式各種各樣,但是在本質上,時間是連續流動的一個序列。所以儘管世俗中有各種時間表達方式,但是時間不會因為表達方式不同而有所改變。
時
間的本質就像一個數軸,我們可以用實數來表達時間點,或者用一個線段來表達時間段。
以實數來表達時間點,就可以避開世俗曆法中各種各樣的問題,例如大小月,閏年閏月,曆法的更替,甚至還有日期的跳過(儒略曆向格里高利曆的變動)……這樣一來,這些問題就都不操心了。
順便說一句,上面列出的表示中,倒數第三個是ISO的表示法,在天文學中也很常用,用來直觀表示時間,不受具體語種的影響。
既然是用實數表達,那麼有兩個問題:
計數單位是什麼,即1代表什麼?
起點在哪裡?
03
儒略日
在天文學中,通常用儒略日(Julian Day, JD)表達時間。顧名思義,以天(24小時)為單位,整數部分表示天,而小數部分表示一天內的時間。那麼剩下的就是起點的事情了。
1583年法國學者Joseph Justus Scaliger提出了使用連續數字計算日期的做法,並且他提出以7980年為一個周期(儒略周期)進行計算。
這個7980年是考慮了了太陽、月亮的軌道運行周期,以及當時收稅的間隔(⊙_⊙)而訂出來的。起點則是西元前4713年(天文學上記為-4712年)1月1日格林威治時間平午(世界時12:00)。
所謂的太陽月亮周期呢,是這樣的:
28年為一太陽周期(solar cycle),經過一太陽周期,則星期的日序與月的日序會重複。
19年為一太陰周期,或稱默冬章(Metonic cycle),因235朔望月=19回歸年,經過一太陰周期則陰曆月年的日序重複。
15年為一小紀(indiction cycle),此為羅馬皇帝君士坦丁一世所頒,每15年評定財產價值以供課稅,成為古羅馬用的一個紀元單位。
故以7980年為一儒略周期,而所選的起點公元前4713年,則是這三個循環周期同時開始的最近年份。[1]
於是,天文學常用的儒略日就這麼(奇葩地)定義下來了。對現在來說,這是一個很大的數字,2000年1月1日的UT12:00是儒略日2451545。
而小數部分呢,則是表示從UT12:00到指定的時間點之間走過的時長,是0.xx天。
04
簡化儒略日
這麼大的一個數字,用起來顯然很麻煩:
1.這個數字太大,表達起來其實前面幾位都不變;
2.作為計算機中的浮點數,有效數字是有限的,前面部分佔了太多位數,後面表示一天之內的部分的精度就會被壓縮了;
3.當初選了正午12點作為起點,有點不方便。
所以現實中,我們做研究的時候往往會給一個就近的時間作為零點,把整個序列都減零點,得到一個看起來小一點的數。
1973年IAU選定了UT1858年11月17日00:00:00作為起點,叫做簡化儒略日(Modified Julian Day, MJD)。這個日期看起來有零有整的,很奇怪,但是寫成公式就不奇怪了:
MJD=JD-2400000.5
也就是去掉了最高的兩位,並且把一天的起點從中午12點調整到了凌晨0點。
至於會不會出現類似千年蟲那樣的問題呢……這個問題不大,還要四萬多天才會把前兩位推進到25,還早呢(反正我們是看不到那一天了),而且就算到了下一位,五位數變六位數,沒毛病。
當然了,除了MJD,還有各種各樣的版本,基本上都是根據各自的需要選擇了不同的零點。
但是在修正儒略日中,有一點需要注意,BJD(太陽系質心儒略日)、HJD(日心儒略日)和MJD等是不同的概念。它們改正的是星光從源頭到達地球的時間和到達太陽的時間之間的差。這和減去個零點是兩碼事,和地球公轉有關,也和源頭在宇宙中的位置有關。
05
儒略日的其他問題
說了一大堆儒略日的事情,關於儒略日有幾點要注意的事情。
1.儒略日是具體時刻,而不是某一天,這裡的單位是天,但是後面還有小數部分呢。
2.計算某個時刻的JD,是用這個時刻的UTC(或者GMT)去計算的,不能是地方時。地方時要做時區改正。
3.注意JD的起點是12:00,而MJD的起點是00:00。
06
儒略日計算
說了這麼多,那怎麼計算某個時刻對應的JD或者MJD呢?如果真從起點開始算肯定會算傻了……正常來說,我們會選一個比較近的日子作為起點的。
有個比較好用的時間:2017-09-04T00:00:00,這個時刻對應的MJD是58000.0,只要計算出當前日期和這一天相差多少,加上就是了。而且就最近來說,還沒到1000天,還是58xxx。
至於一天之內,把時分秒轉成小數就好了唄:(h - tz + m/60 + s/3600) / 24。記得要把地方時轉成世界時哦~
如果用程式語言,那麼也很好辦,各種語言中對日期時間實際上也是用類似的辦法連續表示的,只不過零點不太一樣。加一下就好了。
07
其他時間表達方法
除了天文學用JD/MJD這樣的連續實數來表達時間,其它領域其實很多也是這麼表達的,例如計算機領域就是這樣。
在Unix中,用1970-01-01T00:00:00開始的秒數來表達時間,不考慮閏秒。雖然這也是個巨大的數,但是因為是整數,而且是計算機處理,無所謂。
而Windows中則是用天數。如果你在Excel中輸入一個時間,然後轉成數字表示,你就會看到一個浮點數,就是這個。
參考[1]:維基
點「在看」就是不正經研究所的人咯