// JDToCalendar returns the calendar date for the given jd. // // Note that this function returns a date in either the Julian or Gregorian // Calendar, as appropriate. func JDToCalendar(jd float64) (year, month int, day float64) { zf, f := math.Modf(jd + .5) z := int64(zf) a := z if z >= 2299151 { α := base.FloorDiv64(z*100-186721625, 3652425) a = z + 1 + α - base.FloorDiv64(α, 4) } b := a + 1524 c := base.FloorDiv64(b*100-12210, 36525) d := base.FloorDiv64(36525*c, 100) e := int(base.FloorDiv64((b-d)*1e4, 306001)) // compute return values day = float64(int(b-d)-base.FloorDiv(306001*e, 1e4)) + f switch e { default: month = e - 1 case 14, 15: month = e - 13 } switch month { default: year = int(c) - 4716 case 1, 2: year = int(c) - 4715 } return }
// CalendarJulianToJD converts a Julian year, month, and day of month to Julian day. // // Negative years are valid, back to JD 0. The result is not valid for // dates before JD 0. func CalendarJulianToJD(y, m int, d float64) float64 { switch m { case 1, 2: y-- m += 12 } return float64(base.FloorDiv64(36525*(int64(y+4716)), 100)) + float64(base.FloorDiv(306*(m+1), 10)) + d - 1524.5 }
// CalendarGregorianToJD converts a Gregorian year, month, and day of month // to Julian day. // // Negative years are valid, back to JD 0. The result is not valid for // dates before JD 0. func CalendarGregorianToJD(y, m int, d float64) float64 { switch m { case 1, 2: y-- m += 12 } a := base.FloorDiv(y, 100) b := 2 - a + base.FloorDiv(a, 4) // (7.1) p. 61 return float64(base.FloorDiv64(36525*(int64(y+4716)), 100)) + float64(base.FloorDiv(306*(m+1), 10)+b) + d - 1524.5 }
func ExampleFloorDiv64() { // compare to / operator examples in Go spec at // https://golang.org/ref/spec#Arithmetic_operators fmt.Println(base.FloorDiv64(+5, +3)) fmt.Println(base.FloorDiv64(-5, +3)) fmt.Println(base.FloorDiv64(+5, -3)) fmt.Println(base.FloorDiv64(-5, -3)) fmt.Println() // exact divisors, no remainders fmt.Println(base.FloorDiv64(+6, +3)) fmt.Println(base.FloorDiv64(-6, +3)) fmt.Println(base.FloorDiv64(+6, -3)) fmt.Println(base.FloorDiv64(-6, -3)) // Output: // 1 // -2 // -2 // 1 // // 2 // -2 // -2 // 2 }