Merge pull request #27 from araddon/new_format

new date format for 2013-Feb-03
This commit is contained in:
Aaron Raddon 2017-07-26 17:11:22 -07:00 committed by GitHub
commit 882d5c810b
4 changed files with 74 additions and 35 deletions

View File

@ -11,14 +11,25 @@ Parse any date string without knowing format in advance. Uses a scanner to read
```go
// Normal parse
// Normal parse. If no recognized Timezone/Offset info
// exists in the datestring, it uses UTC.
t, err := dateparse.ParseAny("3/1/2014")
// Parse with Location
// Parse with Location. If no recognized Timezone/Offset info
// exists in the datestring, it uses given location.
// IF there IS timezone/offset info it uses the given location
// info for any zone interpretation. That is, MST means one thing
// when using America/Denver and something else in other locations.
denverLoc, _ := time.LoadLocation("America/Denver")
t, err := dateparse.ParseIn("3/1/2014", denverLoc)
// Set Location to time.Local. Same as ParseIn Location but
// Lazily uses a global variable for Location Info.
denverLoc, _ := time.LoadLocation("America/Denver")
// use time.Local global variable to store location
time.Local = denverLoc
t, err := dateparse.ParseLocal("3/1/2014")
```
Extended example https://github.com/araddon/dateparse/blob/master/example/main.go
@ -26,6 +37,7 @@ Extended example https://github.com/araddon/dateparse/blob/master/example/main.g
package main
import (
"flag"
"fmt"
"time"
@ -33,7 +45,6 @@ import (
"github.com/araddon/dateparse"
)
var examples = []string{
"May 8, 2009 5:57:51 PM",
"Mon Jan 2 15:04:05 2006",
@ -46,6 +57,7 @@ var examples = []string{
"Mon Aug 10 15:44:11 UTC+0100 2015",
"Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
"12 Feb 2006, 19:17",
"2013-Feb-03",
// mm/dd/yy
"3/31/2014",
"03/31/2014",
@ -102,40 +114,38 @@ var examples = []string{
"1384216367189",
}
var (
timezone = ""
)
func main() {
flag.StringVar(&timezone, "timezone", "UTC", "Timezone aka `America/Los_Angeles` formatted time-zone")
flag.Parse()
if timezone != "" {
// NOTE: This is very, very important to understand
// time-parsing in go
loc, err := time.LoadLocation(timezone)
if err != nil {
panic(err.Error())
}
time.Local = loc
}
table := termtables.CreateTable()
table.AddHeaders("Input", "Parsed, and Output as %v")
for _, dateExample := range examples {
t, err := dateparse.ParseAny(dateExample)
t, err := dateparse.ParseLocal(dateExample)
if err != nil {
panic(err.Error())
}
table.AddRow(dateExample, fmt.Sprintf("%v",t))
table.AddRow(dateExample, fmt.Sprintf("%v", t))
}
fmt.Println(table.Render())
}
func init() {
// NOTE: This is very, very important to understand timezone parsing
// The time.Local global tells the parse function to use given
// location/zone for use in the time.Parse() function
// used by this library. It uses UTC by default.
if uzeTimeZone {
loc, _ := time.LoadLocation("America/Denver")
time.Local = loc
} else {
// This is the default behavior
//loc, _ := time.LoadLocation("UTC")
//time.Local = loc
}
}
```
**outputs**
```
/*
+-------------------------------------------------------+----------------------------------------+
| Input | Parsed, and Output as %v |
+-------------------------------------------------------+----------------------------------------+
@ -150,8 +160,7 @@ func init() {
| Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC |
| Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT |
| 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC |
| 2015-02-18 00:12:00 +0000 GMT | 2015-02-18 00:12:00 +0000 UTC |
| 2015-02-18 00:12:00 +0000 UTC | 2015-02-18 00:12:00 +0000 UTC |
| 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC |
| 3/31/2014 | 2014-03-31 00:00:00 +0000 UTC |
| 03/31/2014 | 2014-03-31 00:00:00 +0000 UTC |
| 08/21/71 | 1971-08-21 00:00:00 +0000 UTC |
@ -175,22 +184,24 @@ func init() {
| 2014/4/02 03:00:51 | 2014-04-02 03:00:51 +0000 UTC |
| 2012/03/19 10:11:59 | 2012-03-19 10:11:59 +0000 UTC |
| 2012/03/19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC |
| 2009-08-12T22:15:09-07:00 | 2009-08-12 22:15:09 -0700 -0700 |
| 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC |
| 2009-08-12T22:15:09 | 2009-08-12 22:15:09 +0000 UTC |
| 2006-01-02T15:04:05+0000 | 2006-01-02 15:04:05 +0000 UTC |
| 2009-08-12T22:15:09-07:00 | 2009-08-12 22:15:09 -0700 -0700 |
| 2009-08-12T22:15:09 | 2009-08-12 22:15:09 +0000 UTC |
| 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC |
| 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC |
| 2014-04-26 17:24:37.318636 | 2014-04-26 17:24:37.318636 +0000 UTC |
| 2012-08-03 18:31:59.257000000 +0000 UTC | 2012-08-03 18:31:59.257 +0000 UTC |
| 2015-09-30 18:48:56.35272715 +0000 UTC | 2015-09-30 18:48:56.35272715 +0000 UTC |
| 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC |
| 2013-04-01 22:43:22 | 2013-04-01 22:43:22 +0000 UTC |
| 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC |
| 2013-04-01 22:43:22 | 2013-04-01 22:43:22 +0000 UTC |
| 2014-12-16 06:20:00 UTC | 2014-12-16 06:20:00 +0000 UTC |
| 2014-12-16 06:20:00 GMT | 2014-12-16 06:20:00 +0000 UTC |
| 2014-04-26 05:24:37 PM | 2014-04-26 17:24:37 +0000 UTC |
| 2014-04-26 13:13:43 +0800 | 2014-04-26 13:13:43 +0800 +0800 |
| 2014-04-26 13:13:44 +09:00 | 2014-04-26 13:13:44 +0900 +0900 |
| 2012-08-03 18:31:59.257000000 +0000 UTC | 2012-08-03 18:31:59.257 +0000 UTC |
| 2015-09-30 18:48:56.35272715 +0000 UTC | 2015-09-30 18:48:56.35272715 +0000 UTC |
| 2015-02-18 00:12:00 +0000 GMT | 2015-02-18 00:12:00 +0000 UTC |
| 2015-02-18 00:12:00 +0000 UTC | 2015-02-18 00:12:00 +0000 UTC |
| 2017-07-19 03:21:51+00:00 | 2017-07-19 03:21:51 +0000 UTC |
| 2014-04-26 | 2014-04-26 00:00:00 +0000 UTC |
| 2014-04 | 2014-04-01 00:00:00 +0000 UTC |
| 2014 | 2014-01-01 00:00:00 +0000 UTC |
@ -199,4 +210,6 @@ func init() {
| 1332151919 | 2012-03-19 10:11:59 +0000 UTC |
| 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC |
+-------------------------------------------------------+----------------------------------------+
```
*/
```

View File

@ -21,6 +21,7 @@ var examples = []string{
"Mon Aug 10 15:44:11 UTC+0100 2015",
"Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
"12 Feb 2006, 19:17",
"2013-Feb-03",
// mm/dd/yy
"3/31/2014",
"03/31/2014",
@ -99,7 +100,7 @@ func main() {
table.AddHeaders("Input", "Parsed, and Output as %v")
for _, dateExample := range examples {
t, err := dateparse.ParseAny(dateExample)
t, err := dateparse.ParseLocal(dateExample)
if err != nil {
panic(err.Error())
}
@ -123,6 +124,7 @@ func main() {
| Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC |
| Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT |
| 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC |
| 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC |
| 3/31/2014 | 2014-03-31 00:00:00 +0000 UTC |
| 03/31/2014 | 2014-03-31 00:00:00 +0000 UTC |
| 08/21/71 | 1971-08-21 00:00:00 +0000 UTC |

View File

@ -25,6 +25,7 @@ const (
ST_START DateState = iota
ST_DIGIT
ST_DIGITDASH
ST_DIGITDASHALPHA
ST_DIGITDASHWS
ST_DIGITDASHWSWS
ST_DIGITDASHWSWSAMPMMAYBE
@ -86,12 +87,22 @@ func ParseAny(datestr string) (time.Time, error) {
// ParseIn Given an unknown date format, detect the layout,
// using given location, parse.
//
// If no recognized Timezone/Offset info exists in the datestring, it uses
// given location. IF there IS timezone/offset info it uses the given location
// info for any zone interpretation. That is, MST means one thing when using
// America/Denver and something else in other locations.
func ParseIn(datestr string, loc *time.Location) (time.Time, error) {
return parseTime(datestr, loc)
}
// ParseLocal Given an unknown date format, detect the layout,
// using time.Local, parse.
//
// If no recognized Timezone/Offset info exists in the datestring, it uses
// given location. IF there IS timezone/offset info it uses the given location
// info for any zone interpretation. That is, MST means one thing when using
// America/Denver and something else in other locations.
func ParseLocal(datestr string) (time.Time, error) {
return parseTime(datestr, time.Local)
}
@ -155,11 +166,17 @@ iterRunes:
// 2006-01-02
// 2013-04-01 22:43:22
// 2014-04-26 05:24:37 PM
// 2013-Feb-03
switch {
case r == ' ':
state = ST_DIGITDASHWS
case r == 'T':
state = ST_DIGITDASHT
default:
if unicode.IsLetter(r) {
state = ST_DIGITDASHALPHA
break iterRunes
}
}
case ST_DIGITDASHWS:
// 2013-04-01 22:43:22
@ -569,6 +586,10 @@ iterRunes:
} else if len(datestr) == len("2014-04") {
return parse("2006-01", datestr, loc)
}
case ST_DIGITDASHALPHA:
// 2013-Feb-03
return parse("2006-Jan-02", datestr, loc)
case ST_DIGITDASHTDELTA:
// 2006-01-02T15:04:05+0000
return parse("2006-01-02T15:04:05-0700", datestr, loc)

View File

@ -232,6 +232,9 @@ func TestParse(t *testing.T) {
ts = MustParse("12 Feb 2006, 19:17:22")
assert.Equal(t, "2006-02-12 19:17:22 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC)))
ts = MustParse("2013-Feb-03")
assert.Equal(t, "2013-02-03 00:00:00 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC)))
//---------------------------------------------
// mm/dd/yyyy ?