Compare commits

..

No commits in common. "master" and "v0.0.7" have entirely different histories.

3 changed files with 24 additions and 83 deletions

View File

@ -240,15 +240,13 @@ func GetLunar(year, month, day int, tz float64) (lyear, lmonth, lday int, leap b
adjustedYear := year adjustedYear := year
if month == 11 || month == 12 { if month == 11 || month == 12 {
winterSolsticeDay := GetJQTime(year, 270) + tz winterSolsticeDay := GetJQTime(year, 270) + tz
//firstNewMoonDay := TD2UT(CalcMoonS(float64(year)+11.0/12.0+5.0/30.0/12.0, 0), true) + tz firstNewMoonDay := TD2UT(CalcMoonS(float64(year)+11.0/12.0+5.0/30.0/12.0, 0), true) + tz
//nextNewMoonDay := TD2UT(CalcMoonS(float64(year)+1.0, 0), true) + tz nextNewMoonDay := TD2UT(CalcMoonS(float64(year)+1.0, 0), true) + tz
firstNewMoonDay := TD2UT(CalcMoonSHByJDE(winterSolsticeDay-16, 0), false) + tz
nextNewMoonDay := TD2UT(CalcMoonSHByJDE(firstNewMoonDay+28, 0), false) + tz
firstNewMoonDay = normalizeTimePoint(firstNewMoonDay) firstNewMoonDay = normalizeTimePoint(firstNewMoonDay)
nextNewMoonDay = normalizeTimePoint(nextNewMoonDay) nextNewMoonDay = normalizeTimePoint(nextNewMoonDay)
if winterSolsticeDay >= firstNewMoonDay && winterSolsticeDay < nextNewMoonDay && julianDayEpoch < firstNewMoonDay { if winterSolsticeDay >= firstNewMoonDay && winterSolsticeDay < nextNewMoonDay && julianDayEpoch <= firstNewMoonDay {
adjustedYear-- adjustedYear--
} }
if winterSolsticeDay >= nextNewMoonDay && julianDayEpoch < nextNewMoonDay { if winterSolsticeDay >= nextNewMoonDay && julianDayEpoch < nextNewMoonDay {
@ -263,8 +261,8 @@ func GetLunar(year, month, day int, tz float64) (lyear, lmonth, lday int, leap b
newMoonDays := GetMoonLoops(float64(adjustedYear), 17) newMoonDays := GetMoonLoops(float64(adjustedYear), 17)
// 计算冬至日期 // 计算冬至日期
winterSolsticeFirst := normalizeTimePoint(solarTerms[0] - 8.0/24 + tz) winterSolsticeFirst := solarTerms[0] - 8.0/24 + tz
winterSolsticeSecond := normalizeTimePoint(solarTerms[24] - 8.0/24 + tz) winterSolsticeSecond := solarTerms[24] - 8.0/24 + tz
// 规范化时间点 // 规范化时间点
normalizeTimeArray(newMoonDays, tz) normalizeTimeArray(newMoonDays, tz)
@ -273,9 +271,8 @@ func GetLunar(year, month, day int, tz float64) (lyear, lmonth, lday int, leap b
// 计算朔望月范围 // 计算朔望月范围
minMoonIndex, maxMoonIndex := 20, 0 minMoonIndex, maxMoonIndex := 20, 0
moonCount := 0 moonCount := 0
for i := 0; i < len(newMoonDays)-1; i++ { for i := 0; i < 15; i++ {
if (newMoonDays[i] <= winterSolsticeFirst && newMoonDays[i+1] > winterSolsticeFirst) || if newMoonDays[i] >= winterSolsticeFirst && newMoonDays[i] < winterSolsticeSecond {
(newMoonDays[i] > winterSolsticeFirst && newMoonDays[i] < winterSolsticeSecond && newMoonDays[i+1] <= winterSolsticeSecond) {
if i <= minMoonIndex { if i <= minMoonIndex {
minMoonIndex = i minMoonIndex = i
} }
@ -288,27 +285,27 @@ func GetLunar(year, month, day int, tz float64) (lyear, lmonth, lday int, leap b
// 确定闰月位置 // 确定闰月位置
leapMonthPos := 20 leapMonthPos := 20
if moonCount >= 13 { if moonCount == 13 {
solarTermIndex, i := 0, 0 solarTermIndex, i := 2, 0
for i = minMoonIndex; i <= maxMoonIndex; i++ { for i = minMoonIndex; i <= maxMoonIndex; i++ {
if !(newMoonDays[i] <= solarTerms[solarTermIndex] && newMoonDays[i+1] > solarTerms[solarTermIndex]) { if !(newMoonDays[i] <= solarTerms[solarTermIndex] && newMoonDays[i+1] > solarTerms[solarTermIndex]) {
break break
} }
solarTermIndex += 2 solarTermIndex += 2
} }
leapMonthPos = i - minMoonIndex leapMonthPos = i - minMoonIndex + 1
} }
// 找到当前月相索引 // 找到当前月相索引
currentMoonIndex := 0 currentMoonIndex := 0
for currentMoonIndex = minMoonIndex; currentMoonIndex <= maxMoonIndex; currentMoonIndex++ { for currentMoonIndex = minMoonIndex - 1; currentMoonIndex <= maxMoonIndex; currentMoonIndex++ {
if newMoonDays[currentMoonIndex] > julianDayEpoch { if newMoonDays[currentMoonIndex] > julianDayEpoch {
break break
} }
} }
// 计算农历月份 // 计算农历月份
lmonth = currentMoonIndex - minMoonIndex - 1 lmonth = currentMoonIndex - minMoonIndex
shouldAdjustLeap := false shouldAdjustLeap := false
leap = false leap = false
@ -352,8 +349,8 @@ func GetSolar(year, month, day int, leap bool, tz float64) float64 {
newMoonDays := GetMoonLoops(float64(adjustedYear), 17) newMoonDays := GetMoonLoops(float64(adjustedYear), 17)
// 计算冬至日期 // 计算冬至日期
winterSolsticeFirst := normalizeTimePoint(solarTerms[0] - 8.0/24 + tz) winterSolsticeFirst := solarTerms[0] - 8.0/24 + tz
winterSolsticeSecond := normalizeTimePoint(solarTerms[24] - 8.0/24 + tz) winterSolsticeSecond := solarTerms[24] - 8.0/24 + tz
// 规范化时间点 // 规范化时间点
normalizeTimeArray(newMoonDays, tz) normalizeTimeArray(newMoonDays, tz)
@ -363,8 +360,7 @@ func GetSolar(year, month, day int, leap bool, tz float64) float64 {
minMoonIndex, maxMoonIndex := 20, 0 minMoonIndex, maxMoonIndex := 20, 0
moonCount := 0 moonCount := 0
for i := 0; i < 15; i++ { for i := 0; i < 15; i++ {
if (newMoonDays[i] <= winterSolsticeFirst && newMoonDays[i+1] > winterSolsticeFirst) || if newMoonDays[i] >= winterSolsticeFirst && newMoonDays[i] < winterSolsticeSecond {
(newMoonDays[i] > winterSolsticeFirst && newMoonDays[i] < winterSolsticeSecond && newMoonDays[i+1] <= winterSolsticeSecond) {
if i <= minMoonIndex { if i <= minMoonIndex {
minMoonIndex = i minMoonIndex = i
} }
@ -377,32 +373,32 @@ func GetSolar(year, month, day int, leap bool, tz float64) float64 {
// 确定闰月位置 // 确定闰月位置
leapMonthPos := 20 leapMonthPos := 20
if moonCount >= 13 { if moonCount == 13 {
solarTermIndex, i := 0, 0 solarTermIndex, i := 2, 0
for i = minMoonIndex; i <= maxMoonIndex; i++ { for i = minMoonIndex; i <= maxMoonIndex; i++ {
if !(newMoonDays[i] <= solarTerms[solarTermIndex] && newMoonDays[i+1] > solarTerms[solarTermIndex]) { if !(newMoonDays[i] <= solarTerms[solarTermIndex] && newMoonDays[i+1] > solarTerms[solarTermIndex]) {
break break
} }
solarTermIndex += 2 solarTermIndex += 2
} }
leapMonthPos = i - minMoonIndex leapMonthPos = i - minMoonIndex + 1
} }
// 计算实际月份索引
actualMonth := month actualMonth := month
if leap {
actualMonth++
}
if actualMonth > 10 { if actualMonth > 10 {
actualMonth -= 11 actualMonth -= 11
} else { } else {
actualMonth++ actualMonth++
} }
// 计算实际月份索引
if leap {
actualMonth++
}
if actualMonth >= leapMonthPos && !leap { if actualMonth >= leapMonthPos && !leap {
actualMonth++ actualMonth++
} }
return newMoonDays[minMoonIndex+actualMonth] + float64(day) - 1 return newMoonDays[minMoonIndex-1+actualMonth] + float64(day) - 1
} }
func normalizeTimeArray(timeArray []float64, tz float64) { func normalizeTimeArray(timeArray []float64, tz float64) {

View File

@ -217,33 +217,3 @@ func TestGetJQTime(t *testing.T) {
func TestJQ(t *testing.T) { func TestJQ(t *testing.T) {
fmt.Println(GetJQTime(-721, 15)) fmt.Println(GetJQTime(-721, 15))
} }
func TestCal6402(t *testing.T) {
var year = 6402
var tz = 8.00 / 24.00
winterSolsticeDay := GetJQTime(year, 270) + tz
firstNewMoonDay := TD2UT(CalcMoonSHByJDE(winterSolsticeDay-15, 0), false) + tz
nextNewMoonDay := TD2UT(CalcMoonSHByJDE(firstNewMoonDay+28, 0), false) + tz
fmt.Println(JDE2Date(firstNewMoonDay))
fmt.Println(JDE2Date(nextNewMoonDay))
fmt.Println(HSunTrueLo(TD2UT(nextNewMoonDay, false)))
fmt.Println(HMoonTrueLo(TD2UT(nextNewMoonDay, false)))
firstNewMoonDay = normalizeTimePoint(firstNewMoonDay)
nextNewMoonDay = normalizeTimePoint(nextNewMoonDay)
fmt.Println(JDE2Date(winterSolsticeDay))
fmt.Println(JDE2Date(GetSolar(1984, 10, 2, true, 8.0/24.0)))
fmt.Println(GetLunar(1992, 11, 24, 8.0/24.0))
fmt.Println(GetLunar(6402, 12, 24, 8.0/24.0))
for i := 1; i <= 12; i++ {
fmt.Print("6403", i, "24 ---- ")
fmt.Println(GetLunar(6403, i, 24, 8.0/24.0))
}
fmt.Println("-------")
for _, v := range GetMoonLoops(float64(2132), 17) {
fmt.Println(JDE2Date(v))
}
fmt.Println("-------")
for _, v := range GetJieqiLoops(2132, 25) {
fmt.Println(JDE2Date(v))
}
}

View File

@ -2,11 +2,8 @@ package calendar
import ( import (
"fmt" "fmt"
"math"
"testing" "testing"
"time" "time"
"b612.me/astro/basic"
) )
type lunarSolar struct { type lunarSolar struct {
@ -259,28 +256,6 @@ func TestGanZhiOfDay(t *testing.T) {
fmt.Println(SolarToLunarByYMD(700, 2, 29)) fmt.Println(SolarToLunarByYMD(700, 2, 29))
} }
func TestRapidLunarAndLunar(t *testing.T) {
for year := 1949; year < 2400; year++ {
for month := 1; month <= 12; month++ {
a1, a2, a3, a4, _ := rapidLunarModern(year, month, 24)
b1, b2, b3, b4, _ := basic.GetLunar(year, month, 24, 8.0/24.0)
if a1 != b1 || a2 != b2 || a3 != b3 || a4 != b4 {
if year == 2165 && month == 12 {
continue
}
if math.Abs(float64(b3-a3)) == 1 {
continue
}
t.Fatal(year, month, 24, a1, a2, a3, a4, b1, b2, b3, b4)
}
sol := JDE2Date(basic.GetSolar(b1, b2, b3, b4, 8.0/24))
if sol.Year() != year && int(sol.Month()) != month && sol.Day() != 24 {
t.Fatal(year, month, sol, b1, b2, b3, b4)
}
}
}
}
/* /*
func TestgenReverseMapNianHao(t *testing.T) { func TestgenReverseMapNianHao(t *testing.T) {
//mymap := make(map[string][][]int) //mymap := make(map[string][][]int)