mirror of
https://github.com/araddon/dateparse.git
synced 2024-09-20 19:06:34 +08:00
acba2cf96b
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.
132 lines
2.9 KiB
Go
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)
|
|
}
|