mirror of
https://github.com/araddon/dateparse.git
synced 2024-11-10 11:51:54 +08:00
commit
e5643ba62b
253
parseany.go
253
parseany.go
@ -11,6 +11,18 @@ import (
|
||||
type DateState int
|
||||
|
||||
const (
|
||||
// C = Comma
|
||||
// O = Colon
|
||||
// E = Period/Dot
|
||||
// A = Alpha
|
||||
// N = Digits/Numeric
|
||||
// S = Slash /
|
||||
// P = Plus +
|
||||
// m = Minus, Dash, -
|
||||
// T = T
|
||||
// Z = Z
|
||||
// M = AM/PM
|
||||
// W = Whitespace
|
||||
ST_START DateState = iota
|
||||
ST_DIGIT
|
||||
ST_DIGITDASH
|
||||
@ -37,6 +49,11 @@ const (
|
||||
ST_ALPHAWS
|
||||
ST_ALPHAWSCOMMA
|
||||
ST_ALPHAWSALPHA
|
||||
ST_ALPHAWSALPHACOLON
|
||||
ST_ALPHAWSALPHACOLONOFFSET
|
||||
ST_ALPHAWSALPHACOLONALPHA
|
||||
ST_ALPHAWSALPHACOLONALPHAOFFSET
|
||||
ST_ALPHAWSALPHACOLONALPHAOFFSETALPHA
|
||||
ST_ALPHACOMMA
|
||||
ST_ALPHACOMMADASH
|
||||
ST_ALPHACOMMADASHDASH
|
||||
@ -382,77 +399,44 @@ iterRunes:
|
||||
return t, nil
|
||||
}
|
||||
return time.Time{}, err
|
||||
case ST_ALPHAWSALPHA: // Starts Alpha, whitespace, alpha
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
case ST_ALPHAWSALPHA: // Alpha, whitespace, alpha
|
||||
// Mon Jan _2 15:04:05 2006
|
||||
// Mon Jan _2 15:04:05 MST 2006
|
||||
// Mon Jan 02 15:04:05 -0700 2006
|
||||
// Mon Jan _2 15:04:05 MST 2006
|
||||
// Mon Aug 10 15:44:11 UTC+0100 2015
|
||||
switch {
|
||||
case len(datestr) == len("Mon Jan _2 15:04:05 2006"):
|
||||
if t, err := time.Parse(time.ANSIC, datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case len(datestr) == len("Mon Jan _2 15:04:05 MST 2006"):
|
||||
if t, err := time.Parse(time.UnixDate, datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case len(datestr) == len("Mon Jan 02 15:04:05 -0700 2006"):
|
||||
if t, err := time.Parse(time.RubyDate, datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case len(datestr) == len("Mon Aug 10 15:44:11 UTC+0100 2015"):
|
||||
if t, err := time.Parse("Mon Jan 02 15:04:05 MST-0700 2006", datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case len(datestr) > len("Mon Jan 02 2006 15:04:05 MST-0700"):
|
||||
// What effing time stamp is this?
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
dateTmp := datestr[:33]
|
||||
if t, err := time.Parse("Mon Jan 02 2006 15:04:05 MST-0700", dateTmp); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
default:
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
if r == ':' {
|
||||
state = ST_ALPHAWSALPHACOLON
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLON: // Alpha, whitespace, alpha, :
|
||||
// Mon Jan _2 15:04:05 2006
|
||||
// Mon Jan 02 15:04:05 -0700 2006
|
||||
// Mon Jan _2 15:04:05 MST 2006
|
||||
// Mon Aug 10 15:44:11 UTC+0100 2015
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
if unicode.IsLetter(r) {
|
||||
state = ST_ALPHAWSALPHACOLONALPHA
|
||||
} else if r == '-' || r == '+' {
|
||||
state = ST_ALPHAWSALPHACOLONOFFSET
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLONALPHA: // Alpha, whitespace, alpha, :, alpha
|
||||
// Mon Jan _2 15:04:05 MST 2006
|
||||
// Mon Aug 10 15:44:11 UTC+0100 2015
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
if r == '+' {
|
||||
state = ST_ALPHAWSALPHACOLONALPHAOFFSET
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLONALPHAOFFSET: // Alpha, whitespace, alpha, : , alpha, offset, ?
|
||||
// Mon Aug 10 15:44:11 UTC+0100 2015
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
if unicode.IsLetter(r) {
|
||||
state = ST_ALPHAWSALPHACOLONALPHAOFFSETALPHA
|
||||
}
|
||||
default:
|
||||
break iterRunes
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
ST_DIGITDASHT
|
||||
ST_DIGITDASHTZ
|
||||
ST_DIGITDASHTZDIGIT
|
||||
ST_DIGITDASHTDASH
|
||||
|
||||
// ST_DIGITDASHT
|
||||
// 2006-01-02T15:04:05
|
||||
// ST_DIGITDASHTZ
|
||||
// 2006-01-02T15:04:05.999999999Z
|
||||
// 2006-01-02T15:04:05.99999999Z
|
||||
// 2006-01-02T15:04:05.9999999Z
|
||||
// 2006-01-02T15:04:05.999999Z
|
||||
// 2006-01-02T15:04:05.99999Z
|
||||
// 2006-01-02T15:04:05.9999Z
|
||||
// 2006-01-02T15:04:05.999Z
|
||||
// 2006-01-02T15:04:05.99Z
|
||||
// ST_DIGITDASHTZDIGIT
|
||||
// 2006-01-02T15:04:05.999999999Z07:00
|
||||
// 2006-01-02T15:04:05Z07:00
|
||||
// With another dash aka time-zone at end
|
||||
// ST_DIGITDASHTDASH
|
||||
// 2017-06-25T17:46:57.45706582-07:00
|
||||
*/
|
||||
switch state {
|
||||
case ST_DIGIT:
|
||||
// unixy timestamps ish
|
||||
@ -601,7 +585,6 @@ iterRunes:
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
|
||||
case ST_DIGITDASHWSDOT:
|
||||
// 2012-08-03 18:31:59.257000000
|
||||
// 2014-04-26 17:24:37.3186369
|
||||
@ -612,135 +595,83 @@ iterRunes:
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
|
||||
case ST_DIGITDASHWSDOTALPHA:
|
||||
// 2012-08-03 18:31:59.257000000 UTC
|
||||
// 2014-04-26 17:24:37.3186369 UTC
|
||||
// 2017-01-27 00:07:31.945167 UTC
|
||||
// 2016-03-14 00:00:00.000 UTC
|
||||
var t time.Time
|
||||
var err error
|
||||
|
||||
switch len(datestr) {
|
||||
case len("2012-08-03 18:31:59.123456789 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.12345678 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.1234567 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.123456 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.12345 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.1234 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.00 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00 UTC", datestr)
|
||||
case len("2014-04-26 05:24:37.0 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0 UTC", datestr)
|
||||
}
|
||||
t, err := time.Parse("2006-01-02 15:04:05 UTC", datestr)
|
||||
if err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
|
||||
case ST_DIGITDASHWSDOTPLUS:
|
||||
// 2012-08-03 18:31:59.257000000 +0000
|
||||
// 2014-04-26 17:24:37.3186369 +0000
|
||||
// 2017-01-27 00:07:31.945167 +0000
|
||||
// 2016-03-14 00:00:00.000 +0000
|
||||
var t time.Time
|
||||
var err error
|
||||
|
||||
switch len(datestr) {
|
||||
case len("2012-08-03 18:31:59.123456789 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.12345678 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.1234567 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.123456 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.12345 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.1234 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.000 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.00 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00 -0700", datestr)
|
||||
case len("2014-04-26 05:24:37.0 +0000"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0 -0700", datestr)
|
||||
}
|
||||
t, err := time.Parse("2006-01-02 15:04:05 -0700", datestr)
|
||||
if err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
|
||||
case ST_DIGITDASHWSDOTPLUSALPHA:
|
||||
// 2012-08-03 18:31:59.257000000 +0000 UTC
|
||||
// 2014-04-26 17:24:37.3186369 +0000 UTC
|
||||
// 2017-01-27 00:07:31.945167 +0000 UTC
|
||||
// 2016-03-14 00:00:00.000 +0000 UTC
|
||||
var t time.Time
|
||||
var err error
|
||||
|
||||
switch len(datestr) {
|
||||
case len("2015-06-25 01:25:37.123456789 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000000 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.12345678 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000000 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.1234567 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000000 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.123456 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000000 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.12345 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00000 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.1234 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0000 -0700 GMT", datestr)
|
||||
}
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.000 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.12 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.00 -0700 GMT", datestr)
|
||||
}
|
||||
case len("2015-09-30 18:48:56.1 +0000 UTC"):
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0 -0700 UTC", datestr)
|
||||
if err != nil {
|
||||
t, err = time.Parse("2006-01-02 15:04:05.0 -0700 GMT", datestr)
|
||||
}
|
||||
t, err := time.Parse("2006-01-02 15:04:05 -0700 UTC", datestr)
|
||||
if err == nil {
|
||||
return t, nil
|
||||
}
|
||||
t, err = time.Parse("2006-01-02 15:04:05 -0700 GMT", datestr)
|
||||
if err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
|
||||
case ST_ALPHAWSALPHACOLON:
|
||||
// Mon Jan _2 15:04:05 2006
|
||||
if t, err := time.Parse(time.ANSIC, datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLONOFFSET:
|
||||
// Mon Jan 02 15:04:05 -0700 2006
|
||||
if t, err := time.Parse(time.RubyDate, datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLONALPHA:
|
||||
// Mon Jan _2 15:04:05 MST 2006
|
||||
if t, err := time.Parse(time.UnixDate, datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLONALPHAOFFSET:
|
||||
// Mon Aug 10 15:44:11 UTC+0100 2015
|
||||
if t, err := time.Parse("Mon Jan 02 15:04:05 MST-0700 2006", datestr); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
case ST_ALPHAWSALPHACOLONALPHAOFFSETALPHA:
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
if len(datestr) > len("Mon Jan 02 2006 15:04:05 MST-0700") {
|
||||
// What effing time stamp is this?
|
||||
// Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)
|
||||
dateTmp := datestr[:33]
|
||||
if t, err := time.Parse("Mon Jan 02 2006 15:04:05 MST-0700", dateTmp); err == nil {
|
||||
return t, nil
|
||||
} else {
|
||||
return time.Time{}, err
|
||||
}
|
||||
}
|
||||
case ST_DIGITSLASH: // starts digit then slash 02/ (but nothing else)
|
||||
// 3/1/2014
|
||||
// 10/13/2014
|
||||
|
Loading…
Reference in New Issue
Block a user