WIP WIP, nae nae
This commit is contained in:
parent
d3fbe75661
commit
e54a8c6241
153
time.go
153
time.go
|
@ -25,20 +25,20 @@ func main() {
|
||||||
fmt.Println("Loc", now.In(loc))
|
fmt.Println("Loc", now.In(loc))
|
||||||
|
|
||||||
/* boundary checks */
|
/* boundary checks */
|
||||||
CheckInput([]int{2019, 11, 10,
|
for _, st := range [][]int{
|
||||||
01, 02, 56, 0})
|
[]int{2019, 11, 10, 01, 02, 56, 0},
|
||||||
CheckInput([]int{2019, 11, 10,
|
[]int{2019, 11, 10, 01, 02, 60, 0},
|
||||||
01, 02, 60, 0})
|
[]int{2019, 11, 10, 01, 60, 59, 0},
|
||||||
CheckInput([]int{2019, 11, 10,
|
[]int{2019, 11, 10, 24, 59, 59, 0},
|
||||||
01, 60, 59, 0})
|
[]int{2019, 11, 10, 25, 59, 59, 0},
|
||||||
CheckInput([]int{2019, 11, 10,
|
[]int{2019, 11, 10, 23, 59, 59, 0},
|
||||||
24, 59, 59, 0})
|
[]int{2019, 11, 31, 23, 0, 0, 0},
|
||||||
CheckInput([]int{2019, 11, 10,
|
} {
|
||||||
25, 59, 59, 0})
|
err := Exists(st, "America/Denver")
|
||||||
CheckInput([]int{2019, 11, 10,
|
if nil != err {
|
||||||
23, 59, 59, 0})
|
fmt.Println(err)
|
||||||
CheckInput([]int{2019, 11, 31,
|
}
|
||||||
23, 0, 0, 0})
|
}
|
||||||
|
|
||||||
/* funky times */
|
/* funky times */
|
||||||
tz := "America/Denver"
|
tz := "America/Denver"
|
||||||
|
@ -75,41 +75,94 @@ func main() {
|
||||||
05, 01, 00, 0}, tz)
|
05, 01, 00, 0}, tz)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CheckInput2(st []int, tzstr string) {
|
type ErrNoExist struct {
|
||||||
m := time.Month(st[1])
|
e string
|
||||||
|
t []int
|
||||||
|
z string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err ErrNoExist) Error() string {
|
||||||
|
return fmt.Sprintf("E_INVALID_TIME: '%#v' is not a valid timestamp at '%s': %s", err.t, err.z, err.e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the time is a real time in the given timezone.
|
||||||
|
//
|
||||||
|
// For example: 2:30am doesn't happen on 2019 Nov 3rd according
|
||||||
|
// to America/Denver local time, due to the end of Daylight Savings Time,
|
||||||
|
// but it did happen in America/Phoenix.
|
||||||
|
//
|
||||||
|
// Also rejects times that are parsable and return a valid date object,
|
||||||
|
// but are not canonical, such as 24:60:75 November 31st, 2020.
|
||||||
|
// (which would be represented as `2020-12-02 02:01:15 +0000 UTC`)
|
||||||
|
//
|
||||||
|
// Example of parsable, but non-canonical time:
|
||||||
|
//
|
||||||
|
// fmt.Println(time.Date(2020, time.November, 31, 25, 60, 0, 0, time.UTC))
|
||||||
|
// "2020-12-02 02:01:15 +0000 UTC"
|
||||||
|
//
|
||||||
|
// Example of a canonical, but non-parsable time (the 2016 leap second):
|
||||||
|
//
|
||||||
|
// fmt.Println(time.Date(2016, time.December, 31, 23, 59, 60, 0, time.UTC))
|
||||||
|
// "2020-12-02 02:00:00 +0000 UTC" // should be "2016-12-31 23:59:60 +0000 UTC"
|
||||||
|
func Exists(st []int, tzstr string) error {
|
||||||
tz, err := time.LoadLocation(tzstr)
|
tz, err := time.LoadLocation(tzstr)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
fmt.Println("screwed the pooch")
|
return err
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Does the time exist
|
m := time.Month(st[1])
|
||||||
t1 := time.Date(st[0], m, st[2], st[3], st[4], st[5], st[6], tz)
|
t1 := time.Date(st[0], m, st[2], st[3], st[4], st[5], st[6], tz)
|
||||||
if st[5] != t1.Second() {
|
if st[5] != t1.Second() {
|
||||||
fmt.Println("Bad Second", st, t1)
|
return ErrNoExist{
|
||||||
return
|
t: st,
|
||||||
|
z: tzstr,
|
||||||
|
e: "invalid second, probably just bad math on your part",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if st[4] != t1.Minute() {
|
if st[4] != t1.Minute() {
|
||||||
fmt.Println("Bad Minute", st, t1.Minute())
|
return ErrNoExist{
|
||||||
return
|
t: st,
|
||||||
|
z: tzstr,
|
||||||
|
e: "invalid minute, probably just bad math on your part, but perhaps a half-hour daylight savings or summer time",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if st[3] != t1.Hour() {
|
if st[3] != t1.Hour() {
|
||||||
fmt.Println("Bad Hour", st, t1)
|
return ErrNoExist{
|
||||||
return
|
t: st,
|
||||||
|
z: tzstr,
|
||||||
|
e: "invalid hour, possibly a Daylight Savings or Summer Time error, or perhaps bad math on your part",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if st[2] != t1.Day() {
|
if st[2] != t1.Day() {
|
||||||
fmt.Println("Bad Day of Month", st, t1)
|
return ErrNoExist{
|
||||||
return
|
t: st,
|
||||||
|
z: tzstr,
|
||||||
|
e: "invalid day of month, most likely bad math on your part. Remember: 31 28¼ 31 30 31 30 31 31 30 31 30 31",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if st[1] != int(t1.Month()) {
|
if st[1] != int(t1.Month()) {
|
||||||
fmt.Println("Bad Month", st, t1)
|
return ErrNoExist{
|
||||||
return
|
t: st,
|
||||||
|
z: tzstr,
|
||||||
|
e: "invalid month, most likely bad math on your part. Remember: Decemberween isn't until next year",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if st[0] != t1.Year() {
|
if st[0] != t1.Year() {
|
||||||
fmt.Println("Bad Year", st, t1)
|
return ErrNoExist{
|
||||||
return
|
t: st,
|
||||||
|
z: tzstr,
|
||||||
|
e: "invalid year, must have reached the end of time...",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsAmbigious(st []int, tzstr string) error {
|
||||||
|
return fmt.Errorf("Not Implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckInput2(st []int, tzstr string) error {
|
||||||
// Does the time exist twice?
|
// Does the time exist twice?
|
||||||
// (if I change the time in UTC, do I still get the same time)
|
// (if I change the time in UTC, do I still get the same time)
|
||||||
// Note: Some timezones change by half or quarter hour
|
// Note: Some timezones change by half or quarter hour
|
||||||
|
@ -122,6 +175,12 @@ func CheckInput2(st []int, tzstr string) {
|
||||||
// https://en.wikipedia.org/wiki/Summer_time_in_Europe
|
// https://en.wikipedia.org/wiki/Summer_time_in_Europe
|
||||||
// https://en.wikipedia.org/wiki/Daylight_saving_time_in_the_Americas
|
// https://en.wikipedia.org/wiki/Daylight_saving_time_in_the_Americas
|
||||||
// If I change the time iadd or subtract time in UTC, do I see the same difference in TZ?
|
// If I change the time iadd or subtract time in UTC, do I see the same difference in TZ?
|
||||||
|
tz, err := time.LoadLocation(tzstr)
|
||||||
|
if nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m := time.Month(st[1])
|
||||||
|
t1 := time.Date(st[0], m, st[2], st[3], st[4], st[5], st[6], tz)
|
||||||
u1 := t1.UTC()
|
u1 := t1.UTC()
|
||||||
// A better way to do this would probably be to parse the timezone database, but... yeah...
|
// A better way to do this would probably be to parse the timezone database, but... yeah...
|
||||||
for _, n := range []int{ /*-120, -60,*/ 30, 60, 120} {
|
for _, n := range []int{ /*-120, -60,*/ 30, 60, 120} {
|
||||||
|
@ -131,39 +190,11 @@ func CheckInput2(st []int, tzstr string) {
|
||||||
fmt.Println("Ambiguous Time")
|
fmt.Println("Ambiguous Time")
|
||||||
fmt.Printf("%s, %s, %+d\n", t1, u1, n)
|
fmt.Printf("%s, %s, %+d\n", t1, u1, n)
|
||||||
fmt.Printf("%s, %s, %+d\n", t2, u2, n)
|
fmt.Printf("%s, %s, %+d\n", t2, u2, n)
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//ta :=
|
//ta :=
|
||||||
}
|
return nil
|
||||||
|
|
||||||
func CheckInput(st []int) {
|
|
||||||
m := time.Month(st[1])
|
|
||||||
t1 := time.Date(st[0], m, st[2], st[3], st[4], st[5], st[6], time.UTC)
|
|
||||||
if st[5] != t1.Second() {
|
|
||||||
fmt.Println("Bad Second", st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if st[4] != t1.Minute() {
|
|
||||||
fmt.Println("Bad Minute", st, t1.Minute())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if st[3] != t1.Hour() {
|
|
||||||
fmt.Println("Bad Hour", st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if st[2] != t1.Day() {
|
|
||||||
fmt.Println("Bad Day of Month", st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if st[1] != int(t1.Month()) {
|
|
||||||
fmt.Println("Bad Month", st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if st[0] != t1.Year() {
|
|
||||||
fmt.Println("Bad Year", st)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue