儒略日转换为格里高利历

儒略日转换为格里高利历

本文参考陈硕老师的实现,感谢陈硕老师的讲解。
【日期计算(中):基于 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++
            }
        }
    }
}

posted @ 2022-11-05 14:29  有你何须仰望  阅读(450)  评论(0)    收藏  举报