儒略日转换为格里高利历
儒略日转换为格里高利历
本文参考陈硕老师的实现,感谢陈硕老师的讲解。
【日期计算(中):基于 Julian Day 算法实现 Date class】 https://www.bilibili.com/video/BV1L14y157L4/?share_source=copy_web&vd_source=bddaa01f6a5f571b3cd497c0fe470f4a
Golang
package main
import (
"fmt"
"strconv"
)
// IsLeap 闰年
func IsLeap(year int) int {
if year%4 == 0 && year%100 != 0 || year%400 == 0 {
return 1
} else {
return 0
}
}
// ToJulianDay 格里高利历转换为儒略日
func ToJulianDay(year int, month int, day int) int {
adj := (14 - month) / 12
y := year + 4800 - adj
m := month + 12*adj - 3
return day + (153*m+2)/5 + y*365 + y/4 - y/100 + y/400 - 32045
}
// ToGregorian 儒略日转换为格里高利历
func ToGregorian(julianDay int) (year int, month int, day int) {
a := julianDay + 32044
b := (4*a + 3) / 146097
c := a - ((b * 146097) / 4)
d := (4*c + 3) / 1461
e := c - ((1461 * d) / 4)
m := (5*e + 2) / 153
day = e - ((153*m + 2) / 5) + 1
month = m + 3 - 12*(m/10)
year = b*100 + d - 4800 + m/10
return year, month, day
}
// ToGregorianIosString 儒略日转换为格里高利历
func ToGregorianIosString(julianDay int) (date string) {
year, month, day := ToGregorian(julianDay)
return strconv.Itoa(year) + "-" + strconv.Itoa(month) + "-" + strconv.Itoa(day)
}
// ToMJD 简化的儒略日
func ToMJD(year int, month int, day int) int {
return ToJulianDay(year, month, day) - 2400000
}
var julianDay = 2415021 // 1900-01-01
var days = [][]int{{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}
// 测试样例
func main() {
for year := 1900; year < 2500; year++ {
for month := 1; month <= 12; month++ {
for day := 1; day <= days[IsLeap(year)][month]; day++ {
calculatedJulianDay := ToJulianDay(year, month, day)
calculationDate := ToGregorianIosString(julianDay)
if calculatedJulianDay != julianDay {
fmt.Printf("ERROR: 原始日期: %d-%d-%d\t计算的日期: %s\t儒略日: %d\t计算的儒略日: %d\n", year, month, day, calculationDate, julianDay, calculatedJulianDay)
}
julianDay++
}
}
}
}
浙公网安备 33010602011771号