bug fix && moon phase date calc
This commit is contained in:
+114
@@ -2,6 +2,7 @@ package moon
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"b612.me/astro/basic"
|
||||
@@ -180,24 +181,137 @@ func ShuoYue(year float64) time.Time {
|
||||
return basic.JDE2DateByZone(jde, time.UTC, false)
|
||||
}
|
||||
|
||||
func NextShuoYue(date time.Time) time.Time {
|
||||
return nextMoonPhase(date, 0)
|
||||
}
|
||||
|
||||
func LastShuoYue(date time.Time) time.Time {
|
||||
return lastMoonPhase(date, 0)
|
||||
}
|
||||
|
||||
func ClosestShuoYue(date time.Time) time.Time {
|
||||
return closestMoonPhase(date, 0)
|
||||
}
|
||||
|
||||
func closestMoonPhase(date time.Time, typed int) time.Time {
|
||||
//0=shuo 1=wang 2=shangxian 3=xiaxian
|
||||
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
||||
if typed < 2 {
|
||||
return basic.JDE2DateByZone(basic.TD2UT(basic.CalcMoonSHByJDE(jde, typed), false), date.Location(), false)
|
||||
}
|
||||
return basic.JDE2DateByZone(basic.TD2UT(basic.CalcMoonXHByJDE(jde, typed-2), false), date.Location(), false)
|
||||
}
|
||||
|
||||
func nextMoonPhase(date time.Time, typed int) time.Time {
|
||||
//0=shuo 1=wang 2=shangxian 3=xiaxian
|
||||
diffCode := 0.00
|
||||
switch typed {
|
||||
case 1:
|
||||
diffCode = 180
|
||||
case 2:
|
||||
diffCode = 90
|
||||
case 3:
|
||||
diffCode = 270
|
||||
}
|
||||
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
||||
cost := basic.HMoonSeeLo(jde) - basic.HSunSeeLo(jde) - float64(diffCode)
|
||||
for cost < 0 {
|
||||
cost += 360
|
||||
}
|
||||
if cost < 0 && math.Floor(math.Abs(cost)*10000) == 0 {
|
||||
cost = 0
|
||||
}
|
||||
if cost < 240 {
|
||||
jde += (240 - cost) / 11.19
|
||||
}
|
||||
if typed < 2 {
|
||||
return basic.JDE2DateByZone(basic.TD2UT(basic.CalcMoonSHByJDE(jde, typed), false), date.Location(), false)
|
||||
}
|
||||
return basic.JDE2DateByZone(basic.TD2UT(basic.CalcMoonXHByJDE(jde, typed-2), false), date.Location(), false)
|
||||
}
|
||||
|
||||
func lastMoonPhase(date time.Time, typed int) time.Time {
|
||||
//0=shuo 1=wang 2=shangxian 3=xiaxian
|
||||
diffCode := 0.00
|
||||
switch typed {
|
||||
case 1:
|
||||
diffCode = 180
|
||||
case 2:
|
||||
diffCode = 90
|
||||
case 3:
|
||||
diffCode = 270
|
||||
}
|
||||
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
||||
cost := basic.HMoonSeeLo(jde) - basic.HSunSeeLo(jde) - float64(diffCode)
|
||||
for cost < 0 {
|
||||
cost += 360
|
||||
}
|
||||
if cost > 0 && math.Floor(math.Abs(cost)*10000) == 0 {
|
||||
cost = 360
|
||||
}
|
||||
if cost > 120 {
|
||||
jde -= (cost - 120) / 11.19
|
||||
}
|
||||
if typed < 2 {
|
||||
return basic.JDE2DateByZone(basic.TD2UT(basic.CalcMoonSHByJDE(jde, typed), false), date.Location(), false)
|
||||
}
|
||||
return basic.JDE2DateByZone(basic.TD2UT(basic.CalcMoonXHByJDE(jde, typed-2), false), date.Location(), false)
|
||||
}
|
||||
|
||||
// WangYue 望月
|
||||
func WangYue(year float64) time.Time {
|
||||
jde := basic.TD2UT(basic.CalcMoonSH(year, 1), false)
|
||||
return basic.JDE2DateByZone(jde, time.UTC, false)
|
||||
}
|
||||
|
||||
func NextWangYue(date time.Time) time.Time {
|
||||
return nextMoonPhase(date, 1)
|
||||
}
|
||||
|
||||
func LastWangYue(date time.Time) time.Time {
|
||||
return lastMoonPhase(date, 1)
|
||||
}
|
||||
|
||||
func ClosestWangYue(date time.Time) time.Time {
|
||||
return closestMoonPhase(date, 1)
|
||||
}
|
||||
|
||||
// ShangXianYue 上弦月
|
||||
func ShangXianYue(year float64) time.Time {
|
||||
jde := basic.TD2UT(basic.CalcMoonXH(year, 0), false)
|
||||
return basic.JDE2DateByZone(jde, time.UTC, false)
|
||||
}
|
||||
|
||||
func NextShangXianYue(date time.Time) time.Time {
|
||||
return nextMoonPhase(date, 2)
|
||||
}
|
||||
|
||||
func LastShangXianYue(date time.Time) time.Time {
|
||||
return lastMoonPhase(date, 2)
|
||||
}
|
||||
|
||||
func ClosestShangXianYue(date time.Time) time.Time {
|
||||
return closestMoonPhase(date, 2)
|
||||
}
|
||||
|
||||
// XiaXianYue 下弦月
|
||||
func XiaXianYue(year float64) time.Time {
|
||||
jde := basic.TD2UT(basic.CalcMoonXH(year, 1), false)
|
||||
return basic.JDE2DateByZone(jde, time.UTC, false)
|
||||
}
|
||||
|
||||
func NextXiaXianYue(date time.Time) time.Time {
|
||||
return nextMoonPhase(date, 3)
|
||||
}
|
||||
|
||||
func LastXiaXianYue(date time.Time) time.Time {
|
||||
return lastMoonPhase(date, 3)
|
||||
}
|
||||
|
||||
func ClosestXiaXianYue(date time.Time) time.Time {
|
||||
return closestMoonPhase(date, 3)
|
||||
}
|
||||
|
||||
// EarthDistance 日地距离
|
||||
// 返回date对应UTC世界时日地距离
|
||||
func EarthDistance(date time.Time) float64 {
|
||||
|
||||
+45
-2
@@ -6,6 +6,49 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func Test_Rise(t *testing.T) {
|
||||
fmt.Println(RiseTime(time.Now(), 120, 40, 10, true))
|
||||
func Test_MoonPhaseDate(t *testing.T) {
|
||||
//指定北京时间2022年1月20日
|
||||
tz := time.FixedZone("CST", 8*3600)
|
||||
date := time.Date(2022, 01, 20, 00, 00, 00, 00, tz)
|
||||
//指定日期后的下一个朔月
|
||||
moonPhase01 := NextShuoYue(date)
|
||||
fmt.Println("下一朔月", moonPhase01)
|
||||
if moonPhase01.Unix() != 1643694349 {
|
||||
t.Fatal(moonPhase01)
|
||||
}
|
||||
//指定日期后的上一个朔月
|
||||
moonPhase01 = LastShuoYue(date)
|
||||
fmt.Println("上一朔月", moonPhase01)
|
||||
if moonPhase01.Unix() != 1641148399 {
|
||||
t.Fatal(moonPhase01)
|
||||
}
|
||||
//离指定日期最近的朔月
|
||||
moonPhase01 = ClosestShuoYue(date)
|
||||
fmt.Println("最近朔月", moonPhase01)
|
||||
if moonPhase01.Unix() != 1643694349 {
|
||||
t.Fatal(moonPhase01)
|
||||
}
|
||||
//离指定日期最近的望月时间
|
||||
moonPhase01 = ClosestWangYue(date)
|
||||
fmt.Println("最近望月", moonPhase01)
|
||||
if moonPhase01.Unix() != 1642463294 {
|
||||
t.Fatal(moonPhase01)
|
||||
}
|
||||
//离指定日期最近的上弦月时间
|
||||
moonPhase01 = ClosestShangXianYue(date)
|
||||
fmt.Println("最近上弦月", moonPhase01)
|
||||
if moonPhase01.Unix() != 1641751864 {
|
||||
t.Fatal(moonPhase01)
|
||||
}
|
||||
//离指定日期最近的下弦月时间
|
||||
moonPhase01 = ClosestXiaXianYue(date)
|
||||
fmt.Println("最近下弦月", moonPhase01)
|
||||
if moonPhase01.Unix() != 1643118043 {
|
||||
t.Fatal(moonPhase01)
|
||||
}
|
||||
//-------------------
|
||||
for i := 0; i < 26; i++ {
|
||||
moonPhase01 = LastShuoYue(moonPhase01)
|
||||
fmt.Println("上一朔月", moonPhase01)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user