update
parent
32c6e7b534
commit
98ed1980ff
@ -0,0 +1,74 @@
|
|||||||
|
package astro
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed city.json
|
||||||
|
var cityByte []byte
|
||||||
|
|
||||||
|
type City struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
CityName string `json:"city_name"`
|
||||||
|
Lat float64 `json:"lat"`
|
||||||
|
Lon float64 `json:"lon"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var lon, lat, height, loc float64
|
||||||
|
var city string
|
||||||
|
|
||||||
|
func SetLonLatHeight(lo, la, he float64) error {
|
||||||
|
lon, lat, height = lo, la, he
|
||||||
|
return os.WriteFile(".ast.env", []byte(fmt.Sprintf("%f,%f,%f,%f", lon, lat, height, loc)), 0644)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadLonLatHeight() error {
|
||||||
|
if _, err := os.Stat(".ast.env"); errors.Is(err, os.ErrNotExist) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
b, err := os.ReadFile(".ast.env")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = fmt.Sscanf(string(b), "%f,%f,%f,%f", &lon, &lat, &height, &loc)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLonLatHeight() (float64, float64, float64) {
|
||||||
|
return lon, lat, height
|
||||||
|
}
|
||||||
|
|
||||||
|
func Lon() float64 {
|
||||||
|
return lon
|
||||||
|
}
|
||||||
|
|
||||||
|
func Lat() float64 {
|
||||||
|
return lat
|
||||||
|
}
|
||||||
|
|
||||||
|
func Height() float64 {
|
||||||
|
return height
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetFromCity(name string) bool {
|
||||||
|
var c []City
|
||||||
|
err := json.Unmarshal(cityByte, &c)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, v := range c {
|
||||||
|
if strings.Contains(v.CityName, name) {
|
||||||
|
lon, lat = v.Lon, v.Lat
|
||||||
|
loc = 8
|
||||||
|
time.Local = time.FixedZone("Local", int(loc*3600))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package astro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCal(t *testing.T) {
|
||||||
|
//LDateInfo(time.Time{}, time.Date(2021, 1, 1, 0, 0, 0, 0, time.Local), false)
|
||||||
|
//DateInfo(time.Time{}, time.Now().Add(time.Second*-5))
|
||||||
|
for y := 2008; y < 2028; y++ {
|
||||||
|
zq := GuoQing(y)
|
||||||
|
zq.BasicInfo()
|
||||||
|
zq.Detail()
|
||||||
|
fmt.Println("--------")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestChineseHoliday(t *testing.T) {
|
||||||
|
legalData := [][]Holiday{
|
||||||
|
//year 2000
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Start: time.Date(1999, 12, 31, 0, 0, 0, 0, time.Local),
|
||||||
|
End: time.Date(2000, 1, 2, 0, 0, 0, 0, time.Local),
|
||||||
|
Core: time.Date(2000, 1, 1, 0, 0, 0, 0, time.Local),
|
||||||
|
Total: 3,
|
||||||
|
Instead: nil,
|
||||||
|
Name: "元旦",
|
||||||
|
LegalDays: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_ = legalData
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,197 @@
|
|||||||
|
package astro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var isFormat bool
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
Cmd.PersistentFlags().Float64Var(&lon, "lon", -273, "经度,WGS84坐标系")
|
||||||
|
Cmd.PersistentFlags().Float64Var(&lat, "lat", -273, "纬度,WGS84坐标系")
|
||||||
|
Cmd.PersistentFlags().Float64Var(&height, "height", 0, "海拔高度")
|
||||||
|
CmdSun.Flags().StringVarP(&nowDay, "now", "n", "", "指定现在的时间")
|
||||||
|
CmdSun.Flags().BoolVarP(&isTimestamp, "timestamp", "t", false, "是否为时间戳")
|
||||||
|
CmdSun.Flags().BoolVarP(&isLive, "live", "v", false, "是否为实时")
|
||||||
|
CmdSun.Flags().BoolVarP(&isFormat, "format", "f", false, "格式化输出")
|
||||||
|
CmdSun.Flags().StringVarP(&city, "city", "c", "", "城市名")
|
||||||
|
|
||||||
|
CmdMoon.Flags().StringVarP(&nowDay, "now", "n", "", "指定现在的时间")
|
||||||
|
CmdMoon.Flags().BoolVarP(&isTimestamp, "timestamp", "t", false, "是否为时间戳")
|
||||||
|
CmdMoon.Flags().BoolVarP(&isLive, "live", "v", false, "是否为实时")
|
||||||
|
CmdMoon.Flags().BoolVarP(&isFormat, "format", "f", false, "格式化输出")
|
||||||
|
CmdMoon.Flags().StringVarP(&city, "city", "c", "", "城市名")
|
||||||
|
|
||||||
|
CmdStar.Flags().StringVarP(&nowDay, "now", "n", "", "指定现在的时间")
|
||||||
|
CmdStar.Flags().BoolVarP(&isTimestamp, "timestamp", "t", false, "是否为时间戳")
|
||||||
|
CmdStar.Flags().BoolVarP(&isLive, "live", "v", false, "是否为实时")
|
||||||
|
CmdStar.Flags().BoolVarP(&isFormat, "format", "f", false, "格式化输出")
|
||||||
|
CmdStar.Flags().StringVarP(&city, "city", "c", "", "城市名")
|
||||||
|
|
||||||
|
Cmd.AddCommand(CmdCal, CmdSun, CmdMoon, CmdStar)
|
||||||
|
}
|
||||||
|
|
||||||
|
var Cmd = &cobra.Command{
|
||||||
|
Use: "astro",
|
||||||
|
Short: "天文计算",
|
||||||
|
}
|
||||||
|
|
||||||
|
var CmdSun = &cobra.Command{
|
||||||
|
Use: "sun",
|
||||||
|
Short: "太阳计算",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
format := 0
|
||||||
|
if isFormat {
|
||||||
|
format = 1
|
||||||
|
}
|
||||||
|
isSet := CliLoadLonLatHeight()
|
||||||
|
var now = time.Now()
|
||||||
|
var err error
|
||||||
|
if nowDay != "" {
|
||||||
|
now, err = parseDate(now, nowDay, isTimestamp)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
if isSet {
|
||||||
|
fmt.Printf("经度: %f 纬度: %f 海拔: %f\n", lon, lat, height)
|
||||||
|
}
|
||||||
|
BasicSun(now, uint8(format))
|
||||||
|
if isSet {
|
||||||
|
SunDetail(now, lon, lat, height, uint8(format))
|
||||||
|
}
|
||||||
|
if !isLive {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(time.Nanosecond*
|
||||||
|
time.Duration(1000000000-time.Now().Nanosecond()) + 1)
|
||||||
|
if nowDay == "" {
|
||||||
|
now = time.Now()
|
||||||
|
now = now.Add(time.Duration(now.Nanosecond()*-1) * time.Nanosecond)
|
||||||
|
} else {
|
||||||
|
now = now.Add(time.Second)
|
||||||
|
}
|
||||||
|
ClearScreen()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var CmdMoon = &cobra.Command{
|
||||||
|
Use: "moon",
|
||||||
|
Short: "月亮计算",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
format := 0
|
||||||
|
if isFormat {
|
||||||
|
format = 1
|
||||||
|
}
|
||||||
|
isSet := CliLoadLonLatHeight()
|
||||||
|
var now = time.Now()
|
||||||
|
var err error
|
||||||
|
if nowDay != "" {
|
||||||
|
now, err = parseDate(now, nowDay, isTimestamp)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
if isSet {
|
||||||
|
fmt.Printf("经度: %f 纬度: %f 海拔: %f\n", lon, lat, height)
|
||||||
|
}
|
||||||
|
BasicMoon(now, uint8(format))
|
||||||
|
if isSet {
|
||||||
|
MoonDetail(now, lon, lat, height, uint8(format))
|
||||||
|
}
|
||||||
|
if !isLive {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(time.Nanosecond*
|
||||||
|
time.Duration(1000000000-time.Now().Nanosecond()) + 1)
|
||||||
|
if nowDay == "" {
|
||||||
|
now = time.Now()
|
||||||
|
now = now.Add(time.Duration(now.Nanosecond()*-1) * time.Nanosecond)
|
||||||
|
} else {
|
||||||
|
now = now.Add(time.Second)
|
||||||
|
}
|
||||||
|
ClearScreen()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var CmdStar = &cobra.Command{
|
||||||
|
Use: "star",
|
||||||
|
Short: "星星计算",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
if len(args) == 0 {
|
||||||
|
fmt.Println("请输入星星名字")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
format := 0
|
||||||
|
if isFormat {
|
||||||
|
format = 1
|
||||||
|
}
|
||||||
|
isSet := CliLoadLonLatHeight()
|
||||||
|
var now = time.Now()
|
||||||
|
var err error
|
||||||
|
if nowDay != "" {
|
||||||
|
now, err = parseDate(now, nowDay, isTimestamp)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
if isSet {
|
||||||
|
fmt.Printf("经度: %f 纬度: %f 海拔: %f\n", lon, lat, height)
|
||||||
|
}
|
||||||
|
BasicStar(now, args[0], uint8(format))
|
||||||
|
if isSet {
|
||||||
|
StarDetail(now, args[0], lon, lat, height, uint8(format))
|
||||||
|
}
|
||||||
|
if !isLive {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(time.Nanosecond*
|
||||||
|
time.Duration(1000000000-time.Now().Nanosecond()) + 1)
|
||||||
|
if nowDay == "" {
|
||||||
|
now = time.Now()
|
||||||
|
now = now.Add(time.Duration(now.Nanosecond()*-1) * time.Nanosecond)
|
||||||
|
} else {
|
||||||
|
now = now.Add(time.Second)
|
||||||
|
}
|
||||||
|
ClearScreen()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func CliLoadLonLatHeight() bool {
|
||||||
|
if city != "" {
|
||||||
|
if !GetFromCity(city) {
|
||||||
|
fmt.Println("城市名错误")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fmt.Println("城市名: ", city)
|
||||||
|
SetLonLatHeight(lon, lat, height)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
tlon, tlat, theight := lon, lat, height
|
||||||
|
LoadLonLatHeight()
|
||||||
|
if lon == -273 && lon != tlon {
|
||||||
|
lon = tlon
|
||||||
|
}
|
||||||
|
if lat == -273 && lat != tlat {
|
||||||
|
lat = tlat
|
||||||
|
}
|
||||||
|
if height == 0 && height != theight {
|
||||||
|
height = theight
|
||||||
|
}
|
||||||
|
SetLonLatHeight(lon, lat, height)
|
||||||
|
if lon == -273 || lat == -273 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
@ -0,0 +1,130 @@
|
|||||||
|
package astro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"b612.me/astro/moon"
|
||||||
|
"b612.me/astro/star"
|
||||||
|
"b612.me/astro/sun"
|
||||||
|
"b612.me/astro/tools"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BasicMoon(date time.Time, format uint8) {
|
||||||
|
fmt.Printf("时间: %s\n", date.Format("2006-01-02 15:04:05"))
|
||||||
|
lo := moon.ApparentLo(date)
|
||||||
|
eo := moon.Phase(date)
|
||||||
|
bo := moon.TrueBo(date)
|
||||||
|
fmt.Println("月亮")
|
||||||
|
fmt.Println("------------------------")
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("黄经: %f\n", lo)
|
||||||
|
fmt.Printf("黄纬: %f\n", bo)
|
||||||
|
case 1:
|
||||||
|
flo := tools.Format(lo, 0)
|
||||||
|
fbo := tools.Format(bo, 0)
|
||||||
|
fmt.Printf("黄经: %s\n", flo)
|
||||||
|
fmt.Printf("黄纬: %s\n", fbo)
|
||||||
|
}
|
||||||
|
phaseStr := ""
|
||||||
|
mslo := tools.Limit360(lo - sun.ApparentLo(date))
|
||||||
|
if mslo >= 0 && mslo <= 30 {
|
||||||
|
phaseStr = "新月"
|
||||||
|
} else if mslo > 30 && mslo <= 75 {
|
||||||
|
phaseStr = "上峨眉月"
|
||||||
|
} else if mslo > 75 && mslo <= 135 {
|
||||||
|
phaseStr = "上弦月"
|
||||||
|
} else if mslo > 135 && mslo < 170 {
|
||||||
|
phaseStr = "盈凸月"
|
||||||
|
} else if mslo >= 170 && mslo <= 190 {
|
||||||
|
phaseStr = "满月"
|
||||||
|
} else if mslo > 190 && mslo < 225 {
|
||||||
|
phaseStr = "亏凸月"
|
||||||
|
} else if mslo >= 225 && mslo < 285 {
|
||||||
|
phaseStr = "下弦月"
|
||||||
|
} else if mslo >= 285 && mslo < 330 {
|
||||||
|
phaseStr = "下峨眉月"
|
||||||
|
} else {
|
||||||
|
phaseStr = "残月"
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("月相: %.2f%% %s\n", eo*100, phaseStr)
|
||||||
|
sx := moon.NextShangXianYue(date)
|
||||||
|
xx := moon.NextXiaXianYue(date)
|
||||||
|
wang := moon.NextWangYue(date)
|
||||||
|
shuo := moon.NextShuoYue(date)
|
||||||
|
fmt.Printf("朔月: %s\n", shuo.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("上弦: %s\n", sx.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("望月: %s\n", wang.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("下弦: %s\n", xx.Format("2006-01-02 15:04:05"))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func MoonDetail(date time.Time, lon, lat, height float64, format uint8) {
|
||||||
|
var err error
|
||||||
|
ra, dec := moon.ApparentRaDec(date, lon, lat)
|
||||||
|
tmp := new(time.Time)
|
||||||
|
*tmp, err = moon.RiseTime(date, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
if err == moon.ERR_NOT_TODAY {
|
||||||
|
*tmp, err = moon.RiseTime(date.AddDate(0, 0, -1), lon, lat, 0, true)
|
||||||
|
if err != nil {
|
||||||
|
*tmp = time.Time{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rise := *tmp
|
||||||
|
tmp = new(time.Time)
|
||||||
|
*tmp, err = moon.DownTime(date, lon, lat, 0, true)
|
||||||
|
if err != nil {
|
||||||
|
if err == moon.ERR_NOT_TODAY {
|
||||||
|
*tmp, err = moon.DownTime(date.AddDate(0, 0, 1), lon, lat, 0, true)
|
||||||
|
if err != nil {
|
||||||
|
*tmp = time.Time{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if tmp.Before(rise) {
|
||||||
|
tmp = new(time.Time)
|
||||||
|
*tmp, err = moon.DownTime(date.AddDate(0, 0, 1), lon, lat, 0, true)
|
||||||
|
if err != nil {
|
||||||
|
if err == moon.ERR_NOT_TODAY {
|
||||||
|
*tmp, err = moon.DownTime(date.AddDate(0, 0, 2), lon, lat, 0, true)
|
||||||
|
if err != nil {
|
||||||
|
*tmp = time.Time{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set := tmp
|
||||||
|
cst := star.Constellation(ra, dec, date)
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("视赤经: %s\n", ra)
|
||||||
|
fmt.Printf("视赤纬: %s\n", dec)
|
||||||
|
case 1:
|
||||||
|
fra := tools.Format(ra/15, 1)
|
||||||
|
fdec := tools.Format(dec, 0)
|
||||||
|
fmt.Printf("视赤经: %s\n", fra)
|
||||||
|
fmt.Printf("视赤纬: %s\n", fdec)
|
||||||
|
}
|
||||||
|
fmt.Printf("星座: %s\n", cst)
|
||||||
|
fmt.Printf("升起: %s\n", rise.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("落下: %s\n", set.Format("2006-01-02 15:04:05"))
|
||||||
|
az := moon.Azimuth(date, lon, lat)
|
||||||
|
alt := moon.Zenith(date, lon, lat)
|
||||||
|
ta := moon.HourAngle(date, lon, lat)
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("方位角: %f\n", az)
|
||||||
|
fmt.Printf("高度角: %f\n", alt)
|
||||||
|
fmt.Printf("时角: %f\n", ta)
|
||||||
|
case 1:
|
||||||
|
faz := tools.Format(az, 0)
|
||||||
|
falt := tools.Format(alt, 0)
|
||||||
|
fta := tools.Format(ta/15, 1)
|
||||||
|
fmt.Printf("方位角: %s\n", faz)
|
||||||
|
fmt.Printf("高度角: %s\n", falt)
|
||||||
|
fmt.Printf("时角: %s\n", fta)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,101 @@
|
|||||||
|
package astro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"b612.me/astro/star"
|
||||||
|
"b612.me/astro/tools"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BasicStar(date time.Time, name string, format uint8) {
|
||||||
|
fmt.Printf("时间: %s\n", date.Format("2006-01-02 15:04:05"))
|
||||||
|
s, err := star.StarDataByName(name)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ra, dec := s.RaDecByDate(date)
|
||||||
|
fmt.Printf("%s %s 星等:%.2f\n", s.ChineseName, s.Name, s.Mag)
|
||||||
|
fmt.Println("------------------------")
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("视赤经: %f\n", ra)
|
||||||
|
fmt.Printf("视赤纬: %f\n", dec)
|
||||||
|
case 1:
|
||||||
|
fra := tools.Format(ra/15, 1)
|
||||||
|
fdec := tools.Format(dec, 0)
|
||||||
|
fmt.Printf("视赤经: %s\n", fra)
|
||||||
|
fmt.Printf("视赤纬: %s\n", fdec)
|
||||||
|
}
|
||||||
|
cst := star.Constellation(ra, dec, date)
|
||||||
|
fmt.Printf("星座: %s\n", cst)
|
||||||
|
}
|
||||||
|
|
||||||
|
func StarDetail(date time.Time, name string, lon, lat, height float64, format uint8) {
|
||||||
|
s, err := star.StarDataByName(name)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ra, dec := s.RaDecByDate(date)
|
||||||
|
alt := star.Zenith(date, ra, dec, lon, lat)
|
||||||
|
ta := star.HourAngle(date, ra, lon)
|
||||||
|
zt := star.CulminationTime(date, ra, lon)
|
||||||
|
az := star.Azimuth(date, ra, dec, lon, lat)
|
||||||
|
var rise, set time.Time
|
||||||
|
var duration time.Duration
|
||||||
|
for {
|
||||||
|
nk := date.Add(duration)
|
||||||
|
rise, err = star.RiseTime(nk, ra, dec, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
if alt > 0 && rise.After(nk) {
|
||||||
|
rise, err = star.RiseTime(nk.Add(time.Hour*-24), ra, dec, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
} else if alt < 0 && rise.Before(nk) {
|
||||||
|
rise, err = star.RiseTime(nk.Add(time.Hour*24), ra, dec, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
set, err = star.DownTime(nk, ra, dec, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
if set.Before(rise) {
|
||||||
|
set, err = star.DownTime(nk.Add(time.Hour*24), ra, dec, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if set.Before(date) {
|
||||||
|
duration += time.Hour * 24
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if zt.Before(rise) {
|
||||||
|
zt = star.CulminationTime(nk.Add(time.Hour*24), ra, lon)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("升起: %s\n", rise.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("中天: %s\n", zt.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("落下: %s\n", set.Format("2006-01-02 15:04:05"))
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("方位角: %f\n", az)
|
||||||
|
fmt.Printf("高度角: %f\n", alt)
|
||||||
|
fmt.Printf("时角: %f\n", ta)
|
||||||
|
case 1:
|
||||||
|
faz := tools.Format(az, 0)
|
||||||
|
falt := tools.Format(alt, 0)
|
||||||
|
fta := tools.Format(ta/15, 1)
|
||||||
|
fmt.Printf("方位角: %s\n", faz)
|
||||||
|
fmt.Printf("高度角: %s\n", falt)
|
||||||
|
fmt.Printf("时角: %s\n", fta)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package astro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"b612.me/astro/star"
|
||||||
|
"b612.me/astro/sun"
|
||||||
|
"b612.me/astro/tools"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BasicSun(date time.Time, format uint8) {
|
||||||
|
fmt.Printf("时间: %s\n", date.Format("2006-01-02 15:04:05"))
|
||||||
|
ra, dec := sun.ApparentRaDec(date)
|
||||||
|
lo := sun.ApparentLo(date)
|
||||||
|
eo := sun.EclipticObliquity(date, true)
|
||||||
|
fmt.Println("太阳")
|
||||||
|
fmt.Println("------------------------")
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("视赤经: %f\n", ra)
|
||||||
|
fmt.Printf("视赤纬: %f\n", dec)
|
||||||
|
fmt.Printf("视黄经: %f\n", lo)
|
||||||
|
fmt.Printf("黄赤交角: %f\n", eo)
|
||||||
|
case 1:
|
||||||
|
fra := tools.Format(ra/15, 1)
|
||||||
|
fdec := tools.Format(dec, 0)
|
||||||
|
flo := tools.Format(lo, 0)
|
||||||
|
feo := tools.Format(eo, 0)
|
||||||
|
fmt.Printf("视赤经: %s\n", fra)
|
||||||
|
fmt.Printf("视赤纬: %s\n", fdec)
|
||||||
|
fmt.Printf("视黄经: %s\n", flo)
|
||||||
|
fmt.Printf("黄赤交角: %s\n", feo)
|
||||||
|
}
|
||||||
|
cst := star.Constellation(ra, dec, date)
|
||||||
|
fmt.Printf("星座: %s\n", cst)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SunDetail(date time.Time, lon, lat, height float64, format uint8) {
|
||||||
|
rise, err := sun.RiseTime(date, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
set, err := sun.DownTime(date, lon, lat, height, true)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
morning, err := sun.MorningTwilight(date, lon, lat, -6)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
evening, err := sun.EveningTwilight(date, lon, lat, -6)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
|
||||||
|
}
|
||||||
|
fmt.Printf("晨朦影: %s\n", morning.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("升起: %s\n", rise.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("落下: %s\n", set.Format("2006-01-02 15:04:05"))
|
||||||
|
fmt.Printf("昏朦影: %s\n", evening.Format("2006-01-02 15:04:05"))
|
||||||
|
az := sun.Azimuth(date, lon, lat)
|
||||||
|
alt := sun.Zenith(date, lon, lat)
|
||||||
|
ta := sun.HourAngle(date, lon, lat)
|
||||||
|
switch format {
|
||||||
|
case 0:
|
||||||
|
fmt.Printf("方位角: %f\n", az)
|
||||||
|
fmt.Printf("高度角: %f\n", alt)
|
||||||
|
fmt.Printf("时角: %f\n", ta)
|
||||||
|
case 1:
|
||||||
|
faz := tools.Format(az, 0)
|
||||||
|
falt := tools.Format(alt, 0)
|
||||||
|
fta := tools.Format(ta/15, 1)
|
||||||
|
fmt.Printf("方位角: %s\n", faz)
|
||||||
|
fmt.Printf("高度角: %s\n", falt)
|
||||||
|
fmt.Printf("时角: %s\n", fta)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package nmon
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/shirou/gopsutil/v4/cpu"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Cpu() {
|
||||||
|
go func() {
|
||||||
|
flat, err := cpu.Percent(time.Second, false)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(flat)
|
||||||
|
}()
|
||||||
|
flat, err := cpu.Percent(time.Second, true)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c := 0.0000
|
||||||
|
for _, v := range flat {
|
||||||
|
c += v
|
||||||
|
}
|
||||||
|
fmt.Println(flat)
|
||||||
|
fmt.Println(c / float64(len(flat)))
|
||||||
|
time.Sleep(time.Millisecond * 200)
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package nmon
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestCpu(t *testing.T) {
|
||||||
|
Cpu()
|
||||||
|
}
|
Loading…
Reference in New Issue