儒略日转换为格里高利历

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++
            }
        }
    }
}

原文地址:http://www.cnblogs.com/gjycn/p/16860147.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性