7 Commits

Author SHA1 Message Date
b612 438f1700c7 - fix: Correct sun.TrueBo calculation, now using basic.HSunTrueBo for correct solar latitude
- fix: Rename GetSunDownTime to GetSunSetTime in basic/sun.go and update related calls/outputs
- fix: Update test cases to use new method and error constant names

- improve: Rename all DownTime/Down functions to SetTime/Set for consistency
- improve: Standardize ERR_XXX_NEVER_DOWN error constants to ERR_XXX_NEVER_SET, with ERR_XXX_NEVER_DOWN kept as compatibility alias
- improve: More standard naming for interfaces and errors to improve maintainability and readability
2025-09-08 10:59:04 +08:00
b612 126cf68cab Merge remote-tracking branch 'origin/master' 2025-09-08 10:40:37 +08:00
b612 4302981518 - fix: Correct sun.TrueBo calculation, now using basic.HSunTrueBo for correct solar latitude
- fix: Rename GetSunDownTime to GetSunSetTime in basic/sun.go and update related calls/outputs
- fix: Update test cases to use new method and error constant names

- improve: Rename all DownTime/Down functions to SetTime/Set for consistency
- improve: Standardize ERR_XXX_NEVER_DOWN error constants to ERR_XXX_NEVER_SET, with ERR_XXX_NEVER_DOWN kept as compatibility alias
- improve: More standard naming for interfaces and errors to improve maintainability and readability
2025-09-08 10:37:46 +08:00
b612 94aeb84da5 update 2025-01-31 15:38:25 +08:00
b612 1952df0c30 update 2025-01-31 15:35:36 +08:00
b612 b0920d327c bug fix:腊月十二显示为正月初一的问题 2024-12-31 13:52:59 +08:00
b612 616cd54222 fix:时区转换问题 2024-10-26 21:28:26 +08:00
29 changed files with 320 additions and 146 deletions
+1
View File
@@ -0,0 +1 @@
.idea
-8
View File
@@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 数据源本地存储已忽略文件
/../../../../../../:\gocode\src\b612.me\astro\.idea/dataSources/
/dataSources.local.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
-9
View File
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/astro.iml" filepath="$PROJECT_DIR$/.idea/astro.iml" />
</modules>
</component>
</project>
Generated
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
+1 -1
View File
@@ -26,7 +26,7 @@ func show() {
fmt.Println("当前太阳星座:", WhichCst(ra, dec, jde)) fmt.Println("当前太阳星座:", WhichCst(ra, dec, jde))
fmt.Println("当前黄赤交角:", EclipticObliquity(jde-8.0/24.0, true)) fmt.Println("当前黄赤交角:", EclipticObliquity(jde-8.0/24.0, true))
fmt.Println("当前日出:", JDE2Date(GetSunRiseTime(jde, 115, 32, 8, 1, 10))) fmt.Println("当前日出:", JDE2Date(GetSunRiseTime(jde, 115, 32, 8, 1, 10)))
fmt.Println("当前日落:", JDE2Date(GetSunDownTime(jde, 115, 32, 8, 1, 10))) fmt.Println("当前日落:", JDE2Date(GetSunSetTime(jde, 115, 32, 8, 1, 10)))
fmt.Println("当前晨影 -6", JDE2Date(GetAsaTime(jde, 115, 32, 8, -6))) fmt.Println("当前晨影 -6", JDE2Date(GetAsaTime(jde, 115, 32, 8, -6)))
fmt.Println("当前晨影 -12", JDE2Date(GetAsaTime(jde, 115, 32, 8, -12))) fmt.Println("当前晨影 -12", JDE2Date(GetAsaTime(jde, 115, 32, 8, -12)))
fmt.Println("当前昏影 -6", JDE2Date(GetBanTime(jde, 115, 32, 8, -6))) fmt.Println("当前昏影 -6", JDE2Date(GetBanTime(jde, 115, 32, 8, -6)))
+10 -6
View File
@@ -197,10 +197,14 @@ func JDE2Date(JD float64) time.Time {
Days = math.Floor(Days) Days = math.Floor(Days)
tz, _ := time.LoadLocation("Local") tz, _ := time.LoadLocation("Local")
dates := time.Date(int(Years), time.Month(int(Months)), int(Days), 0, 0, 0, 0, tz) dates := time.Date(int(Years), time.Month(int(Months)), int(Days), 0, 0, 0, 0, tz)
dates = time.Unix(dates.Unix()+int64(tms), int64((tms-math.Floor(tms))*1000000000)) return time.Unix(dates.Unix()+int64(tms), int64((tms-math.Floor(tms))*1000000000))
return dates
} }
// JDE2DateByZone JDE(儒略日)转日期
// JD: 儒略日
// tz: 目标时区
// byZone: (true: 传入的儒略日视为目标时区当地时间的儒略日,false: 传入的儒略日视为UTC时间的儒略日)
// 回参:转换后的日期,时区始终为目标时区
func JDE2DateByZone(JD float64, tz *time.Location, byZone bool) time.Time { func JDE2DateByZone(JD float64, tz *time.Location, byZone bool) time.Time {
JD = JD + 0.5 JD = JD + 0.5
Z := float64(int(JD)) Z := float64(int(JD))
@@ -231,12 +235,12 @@ func JDE2DateByZone(JD float64, tz *time.Location, byZone bool) time.Time {
} }
tms := (Days - math.Floor(Days)) * 24 * 3600 tms := (Days - math.Floor(Days)) * 24 * 3600
Days = math.Floor(Days) Days = math.Floor(Days)
var transTz = tz
if !byZone { if !byZone {
dates := time.Date(int(Years), time.Month(int(Months)), int(Days), 0, 0, 0, 0, time.UTC) transTz = time.UTC
return time.Unix(dates.Unix()+int64(tms), int64((tms-math.Floor(tms))*1000000000)).In(tz)
} }
dates := time.Date(int(Years), time.Month(int(Months)), int(Days), 0, 0, 0, 0, tz) return time.Date(int(Years), time.Month(int(Months)), int(Days), 0, 0, 0, 0, transTz).
return time.Unix(dates.Unix()+int64(tms), int64((tms-math.Floor(tms))*1000000000)) Add(time.Duration(int64(1000000000 * tms))).In(tz)
} }
func GetLunar(year, month, day int, tz float64) (lmonth, lday int, leap bool, result string) { func GetLunar(year, month, day int, tz float64) (lmonth, lday int, leap bool, result string) {
+9 -1
View File
@@ -5,8 +5,12 @@ import (
"fmt" "fmt"
"math" "math"
"os" "os"
"testing"
) )
func TestGenerateMagic(t *testing.T) {
generateMagicNumber()
}
func generateMagicNumber() { func generateMagicNumber() {
//0月份 00000 日期 0000闰月 0000000000000 农历信息 //0月份 00000 日期 0000闰月 0000000000000 农历信息
var tz = 8.0000 / 24.000 var tz = 8.0000 / 24.000
@@ -14,6 +18,7 @@ func generateMagicNumber() {
spYear := make(map[int][]int) spYear := make(map[int][]int)
var upper []uint16 var upper []uint16
var lower []uint16 var lower []uint16
var full []uint32
//var info uint32 = 0 //var info uint32 = 0
for year := 1899; year <= 2401; year++ { for year := 1899; year <= 2401; year++ {
fmt.Println(year) fmt.Println(year)
@@ -89,13 +94,16 @@ func generateMagicNumber() {
} }
for year := 1900; year <= 2400; year++ { for year := 1900; year <= 2400; year++ {
fmt.Println(year) fmt.Println(year)
up, low := magicNumberSpilt(magicNumber(yearMap[year], spYear[year])) magic := magicNumber(yearMap[year], spYear[year])
up, low := magicNumberSpilt(magic)
upper = append(upper, up) upper = append(upper, up)
lower = append(lower, uint16(low)) lower = append(lower, uint16(low))
full = append(full, uint32(magic))
} }
res := make(map[string]interface{}) res := make(map[string]interface{})
res["up"] = upper res["up"] = upper
res["low"] = lower res["low"] = lower
res["full"] = full
d, _ := json.Marshal(res) d, _ := json.Marshal(res)
os.WriteFile("test.json", d, 0644) os.WriteFile("test.json", d, 0644)
} }
+1 -1
View File
@@ -551,7 +551,7 @@ func GetSunRiseTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
} }
return JD1 - ntz/24 + TZ/24 return JD1 - ntz/24 + TZ/24
} }
func GetSunDownTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 { func GetSunSetTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
var An float64 var An float64
JD = math.Floor(JD) + 1.5 JD = math.Floor(JD) + 1.5
ntz := math.Round(Lon / 15) ntz := math.Round(Lon / 15)
+9 -5
View File
@@ -4,13 +4,14 @@ import (
"b612.me/astro/tools" "b612.me/astro/tools"
"fmt" "fmt"
"math" "math"
"os"
"testing" "testing"
"time" "time"
) )
func Test_Jq(t *testing.T) { func Test_Jq(t *testing.T) {
data := GetJieqiLoops(2019, 24) data := GetJieqiLoops(2019, 24)
for i := 1; i < 25; i++ { for i := 1; i < len(data); i++ {
fmt.Println(JDE2Date(data[i])) fmt.Println(JDE2Date(data[i]))
} }
//fmt.Println(JDE2Date(GetWHTime(2019, 10))) //fmt.Println(JDE2Date(GetWHTime(2019, 10)))
@@ -144,7 +145,7 @@ func Test_SunRiseRound(t *testing.T) {
func Test_SunDown(t *testing.T) { func Test_SunDown(t *testing.T) {
jde := GetNowJDE() jde := GetNowJDE()
for i := 10.0; i < 90.0; i += 0.3 { for i := 10.0; i < 90.0; i += 0.3 {
fmt.Println(i, GetSunDownTime(jde, 115, float64(i), 8, 0, 0)) fmt.Println(i, GetSunSetTime(jde, 115, float64(i), 8, 0, 0))
} }
} }
@@ -162,17 +163,20 @@ func TestJQDate(t *testing.T) {
return math.Floor(d) + 0.5 return math.Floor(d) + 0.5
} }
c := 0 c := 0
var info string
for year := 1900; year <= 2600; year++ { for year := 1900; year <= 2600; year++ {
for pos := 0; pos < 360; pos += 15 { for pos := 0; pos < 360; pos += 15 {
n := newGetJQTime(year, pos) n := newGetJQTime(year, pos) + 8.0/24.000000
o := GetJQTime(year, pos) o := GetJQTime(year, pos) + 8.0/24.0000000
if trimDay(n) != trimDay(o) { if trimDay(n) != trimDay(o) {
c++ c++
fmt.Printf("\"%d%03d\":%.0f,", year, pos, trimDay(o)-trimDay(n)) fmt.Printf("\"%d%03d\"=>%v %v\n", year, pos, JDE2Date(trimDay(o)), JDE2Date(trimDay(n)))
info += fmt.Sprintf("\"%d%03d\"=>%.0f,", year, pos, trimDay(o)-trimDay(n))
} }
} }
} }
fmt.Println(c) fmt.Println(c)
os.WriteFile("test.txt", []byte(info), 0644)
} }
func newGetJQTime(Year, Angle int) float64 { //节气时间 func newGetJQTime(Year, Angle int) float64 { //节气时间
+1 -1
View File
@@ -143,7 +143,7 @@ recalc:
magic := int32(upper[idx])<<8 + int32(lower[idx]) magic := int32(upper[idx])<<8 + int32(lower[idx])
springMonth := (magic&0x800000)>>23 + 1 springMonth := (magic&0x800000)>>23 + 1
springDay := (magic & 0x7FFFFF) >> 18 springDay := (magic & 0x7FFFFF) >> 18
if springMonth == int32(month) && springDay == int32(day) { if !useGoto && springMonth == int32(month) && springDay == int32(day) {
return 1, 1, false, "正月初一" return 1, 1, false, "正月初一"
} }
if !useGoto && (springMonth > int32(month) || (springMonth == int32(month) && springDay > int32(day))) { if !useGoto && (springMonth > int32(month) || (springMonth == int32(month) && springDay > int32(day))) {
+31 -12
View File
@@ -18,6 +18,7 @@ type lunarSolar struct {
func Test_ChineseCalendar(t *testing.T) { func Test_ChineseCalendar(t *testing.T) {
var testData = []lunarSolar{ var testData = []lunarSolar{
{Lyear: 1995, Lmonth: 12, Lday: 12, Leap: false, Year: 1996, Month: 1, Day: 31},
{Lyear: 2034, Lmonth: 1, Lday: 1, Leap: false, Year: 2034, Month: 2, Day: 19}, {Lyear: 2034, Lmonth: 1, Lday: 1, Leap: false, Year: 2034, Month: 2, Day: 19},
{Lyear: 2033, Lmonth: 12, Lday: 30, Leap: false, Year: 2034, Month: 2, Day: 18}, {Lyear: 2033, Lmonth: 12, Lday: 30, Leap: false, Year: 2034, Month: 2, Day: 18},
{Lyear: 2033, Lmonth: 11, Lday: 27, Leap: true, Year: 2034, Month: 1, Day: 17}, {Lyear: 2033, Lmonth: 11, Lday: 27, Leap: true, Year: 2034, Month: 1, Day: 17},
@@ -37,19 +38,37 @@ func Test_ChineseCalendar(t *testing.T) {
{Lyear: 2021, Lmonth: 12, Lday: 29, Leap: false, Year: 2022, Month: 1, Day: 31}, {Lyear: 2021, Lmonth: 12, Lday: 29, Leap: false, Year: 2022, Month: 1, Day: 31},
} }
for _, v := range testData { for _, v := range testData {
var lyear int = v.Year {
lmonth, lday, leap, desp := SolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local)) var lyear int = v.Year
if lmonth > v.Month { lmonth, lday, leap, desp := SolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
lyear-- if lmonth > v.Month {
} lyear--
fmt.Println(lyear, desp, v.Year, v.Month, v.Day) }
if lyear != v.Lyear || lmonth != v.Lmonth || lday != v.Lday || leap != v.Leap { fmt.Println(lyear, desp, v.Year, v.Month, v.Day)
t.Fatal(v, lyear, lmonth, lday, leap, desp) if lyear != v.Lyear || lmonth != v.Lmonth || lday != v.Lday || leap != v.Leap {
} t.Fatal(v, lyear, lmonth, lday, leap, desp)
}
date := LunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap) date := LunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day { if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
t.Fatal(v, date) t.Fatal(v, date)
}
}
{
var lyear int = v.Year
lmonth, lday, leap, desp := RapidSolarToLunar(time.Date(v.Year, time.Month(v.Month), v.Day, 0, 0, 0, 0, time.Local))
if lmonth > v.Month {
lyear--
}
fmt.Println(lyear, desp, v.Year, v.Month, v.Day)
if lyear != v.Lyear || lmonth != v.Lmonth || lday != v.Lday || leap != v.Leap {
t.Fatal(v, lyear, lmonth, lday, leap, desp)
}
date := RapidLunarToSolar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
t.Fatal(v, date)
}
} }
} }
} }
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_JUPITER_NEVER_RISE = errors.New("ERROR:极夜,木星今日永远在地平线下!") ERR_JUPITER_NEVER_RISE = errors.New("ERROR:极夜,木星今日永远在地平线下!")
ERR_JUPITER_NEVER_DOWN = errors.New("ERROR:极昼,木星今日永远在地平线上!") ERR_JUPITER_NEVER_SET = errors.New("ERROR:极昼,木星今日永远在地平线上!")
// ERR_JUPITER_NEVER_DOWN deprecated: -- use ERR_JUPITER_NEVER_SET instead
ERR_JUPITER_NEVER_DOWN = ERR_JUPITER_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_JUPITER_NEVER_RISE err = ERR_JUPITER_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_JUPITER_NEVER_DOWN err = ERR_JUPITER_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_JUPITER_NEVER_RISE err = ERR_JUPITER_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_JUPITER_NEVER_DOWN err = ERR_JUPITER_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -205,7 +218,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextJupiterRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextJupiterRetrogradeToPrograde(jde), date.Location(), false)
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_MARS_NEVER_RISE = errors.New("ERROR:极夜,火星今日永远在地平线下!") ERR_MARS_NEVER_RISE = errors.New("ERROR:极夜,火星今日永远在地平线下!")
ERR_MARS_NEVER_DOWN = errors.New("ERROR:极昼,火星今日永远在地平线上!") ERR_MARS_NEVER_SET = errors.New("ERROR:极昼,火星今日永远在地平线上!")
// ERR_MARS_NEVER_DOWN deprecated: -- use ERR_MARS_NEVER_SET instead
ERR_MARS_NEVER_DOWN = ERR_MARS_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_MARS_NEVER_RISE err = ERR_MARS_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_MARS_NEVER_DOWN err = ERR_MARS_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_MARS_NEVER_RISE err = ERR_MARS_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_MARS_NEVER_DOWN err = ERR_MARS_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -205,7 +218,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextMarsRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextMarsRetrogradeToPrograde(jde), date.Location(), false)
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_MERCURY_NEVER_RISE = errors.New("ERROR:极夜,水星今日永远在地平线下!") ERR_MERCURY_NEVER_RISE = errors.New("ERROR:极夜,水星今日永远在地平线下!")
ERR_MERCURY_NEVER_DOWN = errors.New("ERROR:极昼,水星今日永远在地平线上!") ERR_MERCURY_NEVER_SET = errors.New("ERROR:极昼,水星今日永远在地平线上!")
// ERR_MERCURY_NEVER_DOWN deprecated: -- use ERR_MERCURY_NEVER_SET instead
ERR_MERCURY_NEVER_DOWN = ERR_MERCURY_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_MERCURY_NEVER_RISE err = ERR_MERCURY_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_MERCURY_NEVER_DOWN err = ERR_MERCURY_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_MERCURY_NEVER_RISE err = ERR_MERCURY_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_MERCURY_NEVER_DOWN err = ERR_MERCURY_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -233,7 +246,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextMercuryRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextMercuryRetrogradeToPrograde(jde), date.Location(), false)
+16 -4
View File
@@ -7,8 +7,20 @@ import (
) )
func TestMercury(t *testing.T) { func TestMercury(t *testing.T) {
date := time.Now().Add(time.Hour * -24) tz := time.FixedZone("CST", 8*3600)
fmt.Println(CulminationTime(date, 115)) date := time.Date(2022, 01, 20, 00, 00, 00, 00, tz)
fmt.Println(RiseTime(date, 115, 23, 0, false)) if NextConjunction(date).Unix() != 1642933683 {
fmt.Println(DownTime(date, 115, 23, 0, false)) t.Fatal(NextConjunction(date).Unix())
}
if CulminationTime(date, 115).Unix() != 1642654651 {
t.Fatal(CulminationTime(date, 115).Unix())
}
date, err := (RiseTime(date, 115, 40, 0, false))
if err != nil {
t.Fatal(err)
}
if date.Unix() != 1642636481 {
t.Fatal(date.Unix())
}
fmt.Println(SetTime(date, 115, 40, 0, false))
} }
+21 -5
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_MOON_NEVER_RISE = errors.New("ERROR:极夜,月亮在今日永远在地平线下!") ERR_MOON_NEVER_RISE = errors.New("ERROR:极夜,月亮在今日永远在地平线下!")
ERR_MOON_NEVER_DOWN = errors.New("ERROR:极昼,月亮在今日永远在地平线上!") ERR_MOON_NEVER_SET = errors.New("ERROR:极昼,月亮在今日永远在地平线上!")
// ERR_MOON_NEVER_DOWN deprecated: -- use ERR_MOON_NEVER_SET instead
ERR_MOON_NEVER_DOWN = ERR_MOON_NEVER_SET
ERR_NOT_TODAY = errors.New("ERROR:月亮已在(昨日/明日)(升起/降下)") ERR_NOT_TODAY = errors.New("ERROR:月亮已在(昨日/明日)(升起/降下)")
) )
@@ -164,19 +166,30 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_MOON_NEVER_RISE err = ERR_MOON_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_MOON_NEVER_DOWN err = ERR_MOON_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// DownTime 月亮降下时间 // deprecated: -- use SetTime instead
// DownTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 月亮降下时间
// //
// date, 世界时(忽略此处时区) // date, 世界时(忽略此处时区)
// lon,经度,东正西负 // lon,经度,东正西负
// lat,纬度,北正南负 // lat,纬度,北正南负
// height,高度 // height,高度
// aero,大气修正 // aero,大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
if date.Hour() > 12 { if date.Hour() > 12 {
date = date.Add(time.Hour * -12) date = date.Add(time.Hour * -12)
@@ -196,7 +209,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_MOON_NEVER_RISE err = ERR_MOON_NEVER_RISE
} }
if downJde == -1 { if downJde == -1 {
err = ERR_MOON_NEVER_DOWN err = ERR_MOON_NEVER_SET
} }
return basic.JDE2DateByZone(downJde, date.Location(), true), err return basic.JDE2DateByZone(downJde, date.Location(), true), err
} }
@@ -209,11 +222,14 @@ func Phase(date time.Time) float64 {
} }
// ShuoYue 朔月 // ShuoYue 朔月
// 返回Date对应UTC世界时的月相大小
func ShuoYue(year float64) time.Time { func ShuoYue(year float64) time.Time {
jde := basic.TD2UT(basic.CalcMoonSH(year, 0), false) jde := basic.TD2UT(basic.CalcMoonSH(year, 0), false)
return basic.JDE2DateByZone(jde, time.UTC, false) return basic.JDE2DateByZone(jde, time.UTC, false)
} }
// NextShuoYue 下次朔月时间
// 返回date之后的下一个朔月时间(UTC时间)
func NextShuoYue(date time.Time) time.Time { func NextShuoYue(date time.Time) time.Time {
return nextMoonPhase(date, 0) return nextMoonPhase(date, 0)
} }
+12 -19
View File
@@ -13,38 +13,38 @@ func Test_MoonPhaseDate(t *testing.T) {
//指定日期后的下一个朔月 //指定日期后的下一个朔月
moonPhase01 := NextShuoYue(date) moonPhase01 := NextShuoYue(date)
fmt.Println("下一朔月", moonPhase01) fmt.Println("下一朔月", moonPhase01)
if moonPhase01.Unix() != 1643694349 { if moonPhase01.Unix() != 1643694356 {
t.Fatal(moonPhase01) t.Fatal(moonPhase01.Unix())
} }
//指定日期后的上一个朔月 //指定日期后的上一个朔月
moonPhase01 = LastShuoYue(date) moonPhase01 = LastShuoYue(date)
fmt.Println("上一朔月", moonPhase01) fmt.Println("上一朔月", moonPhase01)
if moonPhase01.Unix() != 1641148399 { if moonPhase01.Unix() != 1641148406 {
t.Fatal(moonPhase01) t.Fatal(moonPhase01.Unix())
} }
//离指定日期最近的朔月 //离指定日期最近的朔月
moonPhase01 = ClosestShuoYue(date) moonPhase01 = ClosestShuoYue(date)
fmt.Println("最近朔月", moonPhase01) fmt.Println("最近朔月", moonPhase01)
if moonPhase01.Unix() != 1643694349 { if moonPhase01.Unix() != 1643694356 {
t.Fatal(moonPhase01) t.Fatal(moonPhase01.Unix())
} }
//离指定日期最近的望月时间 //离指定日期最近的望月时间
moonPhase01 = ClosestWangYue(date) moonPhase01 = ClosestWangYue(date)
fmt.Println("最近望月", moonPhase01) fmt.Println("最近望月", moonPhase01)
if moonPhase01.Unix() != 1642463294 { if moonPhase01.Unix() != 1642463301 {
t.Fatal(moonPhase01) t.Fatal(moonPhase01.Unix())
} }
//离指定日期最近的上弦月时间 //离指定日期最近的上弦月时间
moonPhase01 = ClosestShangXianYue(date) moonPhase01 = ClosestShangXianYue(date)
fmt.Println("最近上弦月", moonPhase01) fmt.Println("最近上弦月", moonPhase01)
if moonPhase01.Unix() != 1641751864 { if moonPhase01.Unix() != 1641751871 {
t.Fatal(moonPhase01) t.Fatal(moonPhase01.Unix())
} }
//离指定日期最近的下弦月时间 //离指定日期最近的下弦月时间
moonPhase01 = ClosestXiaXianYue(date) moonPhase01 = ClosestXiaXianYue(date)
fmt.Println("最近下弦月", moonPhase01) fmt.Println("最近下弦月", moonPhase01)
if moonPhase01.Unix() != 1643118043 { if moonPhase01.Unix() != 1643118050 {
t.Fatal(moonPhase01) t.Fatal(moonPhase01.Unix())
} }
//------------------- //-------------------
for i := 0; i < 26; i++ { for i := 0; i < 26; i++ {
@@ -52,10 +52,3 @@ func Test_MoonPhaseDate(t *testing.T) {
fmt.Println("上一朔月", moonPhase01) fmt.Println("上一朔月", moonPhase01)
} }
} }
func TestMoon(t *testing.T) {
now := time.Now()
fmt.Println(RiseTime(now, 115, 40, 0, true))
fmt.Println(CulminationTime(now, 115, 40))
fmt.Println(DownTime(now, 115, 40, 0, true))
}
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_NEPTUNE_NEVER_RISE = errors.New("ERROR:极夜,海王星今日永远在地平线下!") ERR_NEPTUNE_NEVER_RISE = errors.New("ERROR:极夜,海王星今日永远在地平线下!")
ERR_NEPTUNE_NEVER_DOWN = errors.New("ERROR:极昼,海王星今日永远在地平线上!") ERR_NEPTUNE_NEVER_SET = errors.New("ERROR:极昼,海王星今日永远在地平线上!")
// ERR_NEPTUNE_NEVER_DOWN deprecated: -- use ERR_NEPTUNE_NEVER_SET instead
ERR_NEPTUNE_NEVER_DOWN = ERR_NEPTUNE_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_NEPTUNE_NEVER_RISE err = ERR_NEPTUNE_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_NEPTUNE_NEVER_DOWN err = ERR_NEPTUNE_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_NEPTUNE_NEVER_RISE err = ERR_NEPTUNE_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_NEPTUNE_NEVER_DOWN err = ERR_NEPTUNE_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -205,7 +218,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextNeptuneRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextNeptuneRetrogradeToPrograde(jde), date.Location(), false)
+16 -4
View File
@@ -7,8 +7,20 @@ import (
) )
func TestNeptune(t *testing.T) { func TestNeptune(t *testing.T) {
date := time.Now().Add(time.Hour * -24) tz := time.FixedZone("CST", 8*3600)
fmt.Println(CulminationTime(date, 115)) date := time.Date(2022, 01, 20, 00, 00, 00, 00, tz)
fmt.Println(RiseTime(date, 115, 23, 0, false)) if NextConjunction(date).Unix() != 1647171796 {
fmt.Println(DownTime(date, 115, 23, 0, false)) t.Fatal(NextConjunction(date).Unix())
}
if CulminationTime(date, 115).Unix() != 1642665021 {
t.Fatal(CulminationTime(date, 115).Unix())
}
date, err := (RiseTime(date, 115, 40, 0, false))
if err != nil {
t.Fatal(err)
}
if date.Unix() != 1642644398 {
t.Fatal(date.Unix())
}
fmt.Println(SetTime(date, 115, 40, 0, false))
} }
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_SATURN_NEVER_RISE = errors.New("ERROR:极夜,木星今日永远在地平线下!") ERR_SATURN_NEVER_RISE = errors.New("ERROR:极夜,木星今日永远在地平线下!")
ERR_SATURN_NEVER_DOWN = errors.New("ERROR:极昼,木星今日永远在地平线上!") ERR_SATURN_NEVER_SET = errors.New("ERROR:极昼,木星今日永远在地平线上!")
// ERR_SATURN_NEVER_DOWN deprecated: -- use ERR_SATURN_NEVER_SET instead
ERR_SATURN_NEVER_DOWN = ERR_SATURN_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_SATURN_NEVER_RISE err = ERR_SATURN_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_SATURN_NEVER_DOWN err = ERR_SATURN_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_SATURN_NEVER_RISE err = ERR_SATURN_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_SATURN_NEVER_DOWN err = ERR_SATURN_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -205,7 +218,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextSaturnRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextSaturnRetrogradeToPrograde(jde), date.Location(), false)
+19 -3
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_STAR_NEVER_RISE = errors.New("ERROR:极夜,星星在今日永远在地平线下!") ERR_STAR_NEVER_RISE = errors.New("ERROR:极夜,星星在今日永远在地平线下!")
ERR_STAR_NEVER_DOWN = errors.New("ERROR:极昼,星星在今日永远在地平线上!") ERR_STAR_NEVER_SET = errors.New("ERROR:极昼,星星在今日永远在地平线上!")
// ERR_STAR_NEVER_DOWN deprecated: -- use ERR_STAR_NEVER_SET instead
ERR_STAR_NEVER_DOWN = ERR_STAR_NEVER_SET
) )
// Constellation // Constellation
@@ -52,11 +54,12 @@ func RiseTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (tim
err = ERR_STAR_NEVER_RISE err = ERR_STAR_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_STAR_NEVER_DOWN err = ERR_STAR_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 星星降落时间 // DownTime 星星降落时间
// //
// date, 世界时(忽略此处时区) // date, 世界时(忽略此处时区)
@@ -67,6 +70,19 @@ func RiseTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (tim
// height,高度 // height,高度
// aero,是否进行大气修正 // aero,是否进行大气修正
func DownTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, ra, dec, lon, lat, height, aero)
}
// SetTime 星星降落时间
//
// date, 世界时(忽略此处时区)
// raDate瞬时赤经
// decDate瞬时赤纬
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aero,是否进行大气修正
func SetTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
if date.Hour() > 12 { if date.Hour() > 12 {
date = date.Add(time.Hour * -12) date = date.Add(time.Hour * -12)
@@ -79,7 +95,7 @@ func DownTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (tim
err = ERR_STAR_NEVER_RISE err = ERR_STAR_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_STAR_NEVER_DOWN err = ERR_STAR_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
+1 -1
View File
@@ -22,5 +22,5 @@ func TestStar(t *testing.T) {
fmt.Println(tools.Format(ra/15, 1), tools.Format(dec, 0)) fmt.Println(tools.Format(ra/15, 1), tools.Format(dec, 0))
fmt.Println(RiseTime(now, ra, dec, 115, 40, 0, true)) fmt.Println(RiseTime(now, ra, dec, 115, 40, 0, true))
fmt.Println(CulminationTime(now, ra, 115)) fmt.Println(CulminationTime(now, ra, 115))
fmt.Println(DownTime(now, ra, dec, 115, 40, 0, true)) fmt.Println(SetTime(now, ra, dec, 115, 40, 0, true))
} }
+27 -16
View File
@@ -2,15 +2,16 @@ package sun
import ( import (
"errors" "errors"
"math"
"time" "time"
"b612.me/astro/basic" "b612.me/astro/basic"
) )
var ( var (
ERR_SUN_NEVER_RISE = errors.New("ERROR:极夜,太阳在今日永远在地平线下!") ERR_SUN_NEVER_RISE = errors.New("ERROR:极夜,太阳在今日永远在地平线下!")
ERR_SUN_NEVER_DOWN = errors.New("ERROR:极昼,太阳在今日永远在地平线上!") ERR_SUN_NEVER_SET = errors.New("ERROR:极昼,太阳在今日永远在地平线上!")
// ERR_SUN_NEVER_DOWN deprecated: -- use ERR_SUN_NEVER_RISE instead
ERR_SUN_NEVER_DOWN = ERR_SUN_NEVER_SET
ERR_TWILIGHT_NOT_EXISTS = errors.New("ERROR:今日晨昏朦影不存在!") ERR_TWILIGHT_NOT_EXISTS = errors.New("ERROR:今日晨昏朦影不存在!")
) )
@@ -38,26 +39,39 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
if date.Hour() > 12 { if date.Hour() > 12 {
date = date.Add(time.Hour * -12) date = date.Add(time.Hour * -12)
} }
//忽略时区的字面量时间
jde := basic.Date2JDE(date) jde := basic.Date2JDE(date)
_, loc := date.Zone() _, loc := date.Zone()
timezone := float64(loc) / 3600.0 timezone := float64(loc) / 3600.0
//risedate 时区修正后的时间,转换应当包括时区
riseJde := basic.GetSunRiseTime(jde, lon, lat, timezone, aeroFloat, height) riseJde := basic.GetSunRiseTime(jde, lon, lat, timezone, aeroFloat, height)
if riseJde == -2 { if riseJde == -2 {
err = ERR_SUN_NEVER_RISE err = ERR_SUN_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_SUN_NEVER_DOWN err = ERR_SUN_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// SunDownTime 太阳落下时间 // deprecated: -- use SetTime instead
// DownTime 太阳落下时间
// date,当地时区日期,务必做时区修正 // date,当地时区日期,务必做时区修正
// lon,经度,东正西负 // lon,经度,东正西负
// lat,纬度,北正南负 // lat,纬度,北正南负
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 太阳落下时间
// date,当地时区日期,务必做时区修正
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -69,18 +83,18 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
jde := basic.Date2JDE(date) jde := basic.Date2JDE(date)
_, loc := date.Zone() _, loc := date.Zone()
timezone := float64(loc) / 3600.0 timezone := float64(loc) / 3600.0
downJde := basic.GetSunDownTime(jde, lon, lat, timezone, aeroFloat, height) downJde := basic.GetSunSetTime(jde, lon, lat, timezone, aeroFloat, height)
if downJde == -2 { if downJde == -2 {
err = ERR_SUN_NEVER_RISE err = ERR_SUN_NEVER_RISE
} }
if downJde == -1 { if downJde == -1 {
err = ERR_SUN_NEVER_DOWN err = ERR_SUN_NEVER_SET
} }
return basic.JDE2DateByZone(downJde, date.Location(), true), err return basic.JDE2DateByZone(downJde, date.Location(), true), err
} }
// MorningTwilight 晨朦影 // MorningTwilight 晨朦影
// date,当地时区日期 // date,当地时区日期,返回的时间时区与此参数中的时区一致
// lon,经度,东正西负 // lon,经度,东正西负
// lat,纬度,北正南负 // lat,纬度,北正南负
// angle,朦影角度:可选-6 -12 -18(民用、航海、天文) // angle,朦影角度:可选-6 -12 -18(民用、航海、天文)
@@ -99,11 +113,11 @@ func MorningTwilight(date time.Time, lon, lat, angle float64) (time.Time, error)
if calcJde == -1 { if calcJde == -1 {
err = ERR_TWILIGHT_NOT_EXISTS err = ERR_TWILIGHT_NOT_EXISTS
} }
return basic.JDE2Date(calcJde), err return basic.JDE2DateByZone(calcJde, date.Location(), true), err
} }
// EveningTwilight 昏朦影 // EveningTwilight 昏朦影
// date,当地时区日期 // date,当地时区日期,返回的时间时区与此参数中的时区一致
// lon,经度,东正西负 // lon,经度,东正西负
// lat,纬度,北正南负 // lat,纬度,北正南负
// angle,朦影角度:可选-6 -12 -18(民用、航海、天文) // angle,朦影角度:可选-6 -12 -18(民用、航海、天文)
@@ -123,7 +137,7 @@ func EveningTwilight(date time.Time, lon, lat, angle float64) (time.Time, error)
if calcJde == -1 { if calcJde == -1 {
err = ERR_TWILIGHT_NOT_EXISTS err = ERR_TWILIGHT_NOT_EXISTS
} }
return basic.JDE2Date(calcJde), err return basic.JDE2DateByZone(calcJde, date.Location(), true), err
} }
// EclipticObliquity 黄赤交角 // EclipticObliquity 黄赤交角
@@ -176,7 +190,7 @@ func TrueLo(date time.Time) float64 {
func TrueBo(date time.Time) float64 { func TrueBo(date time.Time) float64 {
//转换为UTC时间 //转换为UTC时间
jde := basic.Date2JDE(date.UTC()) jde := basic.Date2JDE(date.UTC())
return basic.HSunTrueLo(basic.TD2UT(jde, true)) return basic.HSunTrueBo(basic.TD2UT(jde, true))
} }
// ApparentLo 太阳视黄经 // ApparentLo 太阳视黄经
@@ -256,10 +270,7 @@ func Zenith(date time.Time, lon, lat float64) float64 {
// CulminationTime 太阳中天时间 // CulminationTime 太阳中天时间
// 返回给定经纬度、对应date时区date时刻的太阳中天日期 // 返回给定经纬度、对应date时区date时刻的太阳中天日期
func CulminationTime(date time.Time, lon float64) time.Time { func CulminationTime(date time.Time, lon float64) time.Time {
jde := basic.Date2JDE(date) jde := basic.Date2JDE(date.Add(time.Duration(-1*date.Hour())*time.Hour)) + 0.5
if jde-math.Floor(jde) > 0.5 {
jde++
}
_, loc := date.Zone() _, loc := date.Zone()
timezone := float64(loc) / 3600.0 timezone := float64(loc) / 3600.0
calcJde := basic.GetSunTZTime(jde, lon, timezone) - timezone/24.00 calcJde := basic.GetSunTZTime(jde, lon, timezone) - timezone/24.00
+23 -3
View File
@@ -2,13 +2,33 @@ package sun
import ( import (
"fmt" "fmt"
"math"
"testing" "testing"
"time" "time"
) )
func TestSun(t *testing.T) { func TestSun(t *testing.T) {
now := time.Now() ja, err := time.LoadLocation("Asia/Tokyo")
fmt.Println(RiseTime(now, 115, 40, 0, true)) if err != nil {
t.Fatal(err)
}
now, err := time.ParseInLocation("2006-01-02 15:04:05", "2020-01-01 00:00:00", ja)
if err != nil {
t.Fatal(err)
}
d, err := RiseTime(now, 115, 40, 0, true)
if err != nil {
t.Fatal(err)
}
if d.Format("2006-01-02 15:04:05") != "2020-01-01 08:41:45" {
t.Fatal(d.Format("2006-01-02 15:04:05"))
}
bo := TrueBo(now)
if math.Abs(bo) > 2 {
t.Fatal(bo)
}
fmt.Println(CulminationTime(now, 115)) fmt.Println(CulminationTime(now, 115))
fmt.Println(DownTime(now, 115, 40, 0, true)) fmt.Println(SetTime(now, 115, 40, 0, true))
fmt.Println(MorningTwilight(now, 115, 40, -6))
fmt.Println(EveningTwilight(now, 115, 40, -6))
} }
+2 -4
View File
@@ -34,10 +34,8 @@ func FloatRound(f float64, n int) float64 {
} }
func Limit360(x float64) float64 { func Limit360(x float64) float64 {
for x > 360 { x = math.Mod(x, 360)
x -= 360 if x < 0 {
}
for x < 0 {
x += 360 x += 360
} }
return x return x
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_URANUS_NEVER_RISE = errors.New("ERROR:极夜,天王星今日永远在地平线下!") ERR_URANUS_NEVER_RISE = errors.New("ERROR:极夜,天王星今日永远在地平线下!")
ERR_URANUS_NEVER_DOWN = errors.New("ERROR:极昼,天王星今日永远在地平线上!") ERR_URANUS_NEVER_SET = errors.New("ERROR:极昼,天王星今日永远在地平线上!")
// ERR_URANUS_NEVER_DOWN deprecated: -- use ERR_URANUS_NEVER_SET instead
ERR_URANUS_NEVER_DOWN = ERR_URANUS_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_URANUS_NEVER_RISE err = ERR_URANUS_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_URANUS_NEVER_DOWN err = ERR_URANUS_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_URANUS_NEVER_RISE err = ERR_URANUS_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_URANUS_NEVER_DOWN err = ERR_URANUS_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -205,7 +218,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextUranusRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextUranusRetrogradeToPrograde(jde), date.Location(), false)
+17 -4
View File
@@ -10,7 +10,9 @@ import (
var ( var (
ERR_VENUS_NEVER_RISE = errors.New("ERROR:极夜,金星今日永远在地平线下!") ERR_VENUS_NEVER_RISE = errors.New("ERROR:极夜,金星今日永远在地平线下!")
ERR_VENUS_NEVER_DOWN = errors.New("ERROR:极昼,金星今日永远在地平线上!") ERR_VENUS_NEVER_SET = errors.New("ERROR:极昼,金星今日永远在地平线上!")
// ERR_VENUS_NEVER_DOWN deprecated: -- use ERR_VENUS_NEVER_SET instead
ERR_VENUS_NEVER_DOWN = ERR_VENUS_NEVER_SET
) )
// ApparentLo 视黄经 // ApparentLo 视黄经
@@ -122,11 +124,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_VENUS_NEVER_RISE err = ERR_VENUS_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_VENUS_NEVER_DOWN err = ERR_VENUS_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
// deprecated: -- use SetTime instead
// DownTime 落下时间 // DownTime 落下时间
// date,取日期,时区忽略 // date,取日期,时区忽略
// lon,经度,东正西负 // lon,经度,东正西负
@@ -134,6 +137,16 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
// height,高度 // height,高度
// aerotrue时进行大气修正 // aerotrue时进行大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
return SetTime(date, lon, lat, height, aero)
}
// SetTime 落下时间
// date,取日期,时区忽略
// lon,经度,东正西负
// lat,纬度,北正南负
// height,高度
// aerotrue时进行大气修正
func SetTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error var err error
var aeroFloat float64 var aeroFloat float64
if aero { if aero {
@@ -150,7 +163,7 @@ func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
err = ERR_VENUS_NEVER_RISE err = ERR_VENUS_NEVER_RISE
} }
if riseJde == -1 { if riseJde == -1 {
err = ERR_VENUS_NEVER_DOWN err = ERR_VENUS_NEVER_SET
} }
return basic.JDE2DateByZone(riseJde, date.Location(), true), err return basic.JDE2DateByZone(riseJde, date.Location(), true), err
} }
@@ -233,7 +246,7 @@ func LastRetrogradeToPrograde(date time.Time) time.Time {
} }
// NextRetrogradeToPrograde 上次留(逆转瞬) // NextRetrogradeToPrograde 上次留(逆转瞬)
//// 返回上次逆转瞬留的时间 // // 返回上次逆转瞬留的时间
func NextRetrogradeToPrograde(date time.Time) time.Time { func NextRetrogradeToPrograde(date time.Time) time.Time {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
return basic.JDE2DateByZone(basic.NextVenusRetrogradeToPrograde(jde), date.Location(), false) return basic.JDE2DateByZone(basic.NextVenusRetrogradeToPrograde(jde), date.Location(), false)
+1 -1
View File
@@ -10,5 +10,5 @@ func TestVenus(t *testing.T) {
date := time.Now().Add(time.Hour * -24) date := time.Now().Add(time.Hour * -24)
fmt.Println(CulminationTime(date, 115)) fmt.Println(CulminationTime(date, 115))
fmt.Println(RiseTime(date, 115, 23, 0, false)) fmt.Println(RiseTime(date, 115, 23, 0, false))
fmt.Println(DownTime(date, 115, 23, 0, false)) fmt.Println(SetTime(date, 115, 23, 0, false))
} }