-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcrossquarter.go
More file actions
executable file
·69 lines (59 loc) · 1.43 KB
/
crossquarter.go
File metadata and controls
executable file
·69 lines (59 loc) · 1.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
import (
"flag"
"fmt"
"strconv"
"time"
"github.com/soniakeys/meeus/julian"
"github.com/soniakeys/meeus/solstice"
)
// datefromJD in Python is julian.JDToCalendar(JD) here
func eventJDE(year, event int) (jd float64) {
switch event {
case 0:
return solstice.March(year)
case 1:
return solstice.June(year)
case 2:
return solstice.September(year)
case 3:
return solstice.December(year)
default:
panic(fmt.Sprintf("unexpected event value %d", event))
}
}
func cqafter(year, event int) (jd float64) {
low := eventJDE(year, event)
var high float64
if event == 3 {
high = eventJDE(year+1, 0)
} else {
high = eventJDE(year, event+1)
}
return (low + high) / 2
}
func pprintJD(jd float64) string {
y, m, d := julian.JDToCalendar(jd)
return fmt.Sprintf("%d %s %.2f", y, time.Month(m), d)
}
func main() {
curyear, err := strconv.Atoi(time.Now().Format("2006"))
if err != nil {
fmt.Println(err)
}
var year = flag.Int("year", curyear, "year for which to calculate cross quarter dates")
flag.Parse()
extremes := [...]string{"March", "June", "September", "December"}
var tag string
for event, name := range extremes {
if event%2 == 0 {
tag = "equinox"
} else {
tag = "solstice"
}
fmt.Printf("%s %s is: %s\n", name, tag, pprintJD(eventJDE(*year, event)))
}
for event := range extremes {
fmt.Printf("Cross quarter #%v for year %v is: %s\n", event, *year, pprintJD(cqafter(*year, event)))
}
}