dateparse/dateparse/main.go
Aloïs Micard acba2cf96b
Refactor to use scylladb/termtables
As you may all already know, apcera/termtables has come to a end.
This commit refactor to use the fork from scylladb.

ScyllaDB is an organization, so there's less chance that their
own fork goes offline too.
2020-04-09 08:39:08 +02:00

132 lines
2.9 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"time"
"github.com/scylladb/termtables"
"github.com/araddon/dateparse"
)
var (
timezone = ""
datestr = ""
)
func main() {
flag.StringVar(&timezone, "timezone", "", "Timezone aka `America/Los_Angeles` formatted time-zone")
flag.Parse()
if len(flag.Args()) == 0 {
fmt.Println(`Must pass a time, and optional location:
./dateparse "2009-08-12T22:15:09.99Z"
./dateparse --timezone="America/Denver" "2017-07-19 03:21:51+00:00"
`)
return
}
datestr = flag.Args()[0]
layout, err := dateparse.ParseFormat(datestr)
if err != nil {
fatal(err)
}
zonename, _ := time.Now().In(time.Local).Zone()
fmt.Printf("\nYour Current time.Local zone is %v\n", zonename)
fmt.Printf("\nLayout String: dateparse.ParseFormat() => %v\n", layout)
var loc *time.Location
if timezone != "" {
// NOTE: This is very, very important to understand
// time-parsing in go
l, err := time.LoadLocation(timezone)
if err != nil {
fatal(err)
}
loc = l
zonename, _ := time.Now().In(l).Zone()
fmt.Printf("\nYour Using time.Local set to location=%s %v \n", timezone, zonename)
}
fmt.Printf("\n")
table := termtables.CreateTable()
table.AddHeaders("method", "Zone Source", "Parsed", "Parsed: t.In(time.UTC)")
parsers := map[string]parser{
"ParseAny": parseAny,
"ParseIn": parseIn,
"ParseLocal": parseLocal,
"ParseStrict": parseStrict,
}
for name, parser := range parsers {
time.Local = nil
table.AddRow(name, "time.Local = nil", parser(datestr, nil, false), parser(datestr, nil, true))
if timezone != "" {
time.Local = loc
table.AddRow(name, "time.Local = timezone arg", parser(datestr, loc, false), parser(datestr, loc, true))
}
time.Local = time.UTC
table.AddRow(name, "time.Local = time.UTC", parser(datestr, time.UTC, false), parser(datestr, time.UTC, true))
}
fmt.Println(table.Render())
}
type parser func(datestr string, loc *time.Location, utc bool) string
func parseLocal(datestr string, loc *time.Location, utc bool) string {
time.Local = loc
t, err := dateparse.ParseLocal(datestr)
if err != nil {
return err.Error()
}
if utc {
return t.In(time.UTC).String()
}
return t.String()
}
func parseIn(datestr string, loc *time.Location, utc bool) string {
t, err := dateparse.ParseIn(datestr, loc)
if err != nil {
return err.Error()
}
if utc {
return t.In(time.UTC).String()
}
return t.String()
}
func parseAny(datestr string, loc *time.Location, utc bool) string {
t, err := dateparse.ParseAny(datestr)
if err != nil {
return err.Error()
}
if utc {
return fmt.Sprintf("%s day=%d", t.In(time.UTC), t.In(time.UTC).Weekday())
}
return t.String()
}
func parseStrict(datestr string, loc *time.Location, utc bool) string {
t, err := dateparse.ParseStrict(datestr)
if err != nil {
return err.Error()
}
if utc {
return t.In(time.UTC).String()
}
return t.String()
}
func fatal(err error) {
fmt.Printf("fatal: %s\n", err)
os.Exit(1)
}