mirror of
https://github.com/araddon/dateparse.git
synced 2025-04-18 23:00:32 +08:00
132 lines
2.9 KiB
Go
132 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/araddon/dateparse"
|
|
"github.com/scylladb/termtables"
|
|
)
|
|
|
|
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)
|
|
}
|