mirror of
https://github.com/araddon/dateparse.git
synced 2024-11-10 11:51:54 +08:00
Merge branch 'master' into master
This commit is contained in:
commit
6848514672
31
README.md
31
README.md
@ -65,11 +65,11 @@ var examples = []string{
|
|||||||
"Mon, 02 Jan 2006 15:04:05 MST",
|
"Mon, 02 Jan 2006 15:04:05 MST",
|
||||||
"Tue, 11 Jul 2017 16:28:13 +0200 (CEST)",
|
"Tue, 11 Jul 2017 16:28:13 +0200 (CEST)",
|
||||||
"Mon, 02 Jan 2006 15:04:05 -0700",
|
"Mon, 02 Jan 2006 15:04:05 -0700",
|
||||||
"Thu, 4 Jan 2018 17:53:36 +0000",
|
|
||||||
"Mon 30 Sep 2018 09:09:09 PM UTC",
|
"Mon 30 Sep 2018 09:09:09 PM UTC",
|
||||||
"Mon Aug 10 15:44:11 UTC+0100 2015",
|
"Mon Aug 10 15:44:11 UTC+0100 2015",
|
||||||
"Thu, 4 Jan 2018 17:53:36 +0000",
|
"Thu, 4 Jan 2018 17:53:36 +0000",
|
||||||
"Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
|
"Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
|
||||||
|
"Sun, 3 Jan 2021 00:12:23 +0800 (GMT+08:00)",
|
||||||
"September 17, 2012 10:09am",
|
"September 17, 2012 10:09am",
|
||||||
"September 17, 2012 at 10:09am PST-08",
|
"September 17, 2012 at 10:09am PST-08",
|
||||||
"September 17, 2012, 10:10:09",
|
"September 17, 2012, 10:10:09",
|
||||||
@ -77,11 +77,15 @@ var examples = []string{
|
|||||||
"October 7th, 1970",
|
"October 7th, 1970",
|
||||||
"12 Feb 2006, 19:17",
|
"12 Feb 2006, 19:17",
|
||||||
"12 Feb 2006 19:17",
|
"12 Feb 2006 19:17",
|
||||||
|
"14 May 2019 19:11:40.164",
|
||||||
"7 oct 70",
|
"7 oct 70",
|
||||||
"7 oct 1970",
|
"7 oct 1970",
|
||||||
"03 February 2013",
|
"03 February 2013",
|
||||||
"1 July 2013",
|
"1 July 2013",
|
||||||
"2013-Feb-03",
|
"2013-Feb-03",
|
||||||
|
// dd/Mon/yyy alpha Months
|
||||||
|
"06/Jan/2008:15:04:05 -0700",
|
||||||
|
"06/Jan/2008 15:04:05 -0700",
|
||||||
// mm/dd/yy
|
// mm/dd/yy
|
||||||
"3/31/2014",
|
"3/31/2014",
|
||||||
"03/31/2014",
|
"03/31/2014",
|
||||||
@ -123,7 +127,10 @@ var examples = []string{
|
|||||||
"2006-01-02T15:04:05+0000",
|
"2006-01-02T15:04:05+0000",
|
||||||
"2009-08-12T22:15:09-07:00",
|
"2009-08-12T22:15:09-07:00",
|
||||||
"2009-08-12T22:15:09",
|
"2009-08-12T22:15:09",
|
||||||
|
"2009-08-12T22:15:09.988",
|
||||||
"2009-08-12T22:15:09Z",
|
"2009-08-12T22:15:09Z",
|
||||||
|
"2017-07-19T03:21:51:897+0100",
|
||||||
|
"2019-05-29T08:41-04", // no seconds, 2 digit TZ offset
|
||||||
// yyyy-mm-dd hh:mm:ss
|
// yyyy-mm-dd hh:mm:ss
|
||||||
"2014-04-26 17:24:37.3186369",
|
"2014-04-26 17:24:37.3186369",
|
||||||
"2012-08-03 18:31:59.257000000",
|
"2012-08-03 18:31:59.257000000",
|
||||||
@ -147,6 +154,8 @@ var examples = []string{
|
|||||||
"2014-04",
|
"2014-04",
|
||||||
"2014",
|
"2014",
|
||||||
"2014-05-11 08:20:13,787",
|
"2014-05-11 08:20:13,787",
|
||||||
|
// yyyy-mm-dd-07:00
|
||||||
|
"2020-07-20+08:00",
|
||||||
// mm.dd.yy
|
// mm.dd.yy
|
||||||
"3.31.2014",
|
"3.31.2014",
|
||||||
"03.31.2014",
|
"03.31.2014",
|
||||||
@ -156,6 +165,9 @@ var examples = []string{
|
|||||||
// yyyymmdd and similar
|
// yyyymmdd and similar
|
||||||
"20140601",
|
"20140601",
|
||||||
"20140722105203",
|
"20140722105203",
|
||||||
|
// yymmdd hh:mm:yy mysql log
|
||||||
|
// 080313 05:21:55 mysqld started
|
||||||
|
"171113 14:14:20",
|
||||||
// unix seconds, ms, micro, nano
|
// unix seconds, ms, micro, nano
|
||||||
"1332151919",
|
"1332151919",
|
||||||
"1384216367189",
|
"1384216367189",
|
||||||
@ -214,6 +226,7 @@ func main() {
|
|||||||
| Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC |
|
| Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC |
|
||||||
| Thu, 4 Jan 2018 17:53:36 +0000 | 2018-01-04 17:53:36 +0000 UTC |
|
| Thu, 4 Jan 2018 17:53:36 +0000 | 2018-01-04 17:53:36 +0000 UTC |
|
||||||
| Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT |
|
| Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT |
|
||||||
|
| Sun, 3 Jan 2021 00:12:23 +0800 (GMT+08:00) | 2021-01-03 00:12:23 +0800 +0800 |
|
||||||
| September 17, 2012 10:09am | 2012-09-17 10:09:00 +0000 UTC |
|
| September 17, 2012 10:09am | 2012-09-17 10:09:00 +0000 UTC |
|
||||||
| September 17, 2012 at 10:09am PST-08 | 2012-09-17 10:09:00 -0800 PST |
|
| September 17, 2012 at 10:09am PST-08 | 2012-09-17 10:09:00 -0800 PST |
|
||||||
| September 17, 2012, 10:10:09 | 2012-09-17 10:10:09 +0000 UTC |
|
| September 17, 2012, 10:10:09 | 2012-09-17 10:10:09 +0000 UTC |
|
||||||
@ -221,11 +234,14 @@ func main() {
|
|||||||
| October 7th, 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
| October 7th, 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
||||||
| 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
| 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
||||||
| 12 Feb 2006 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
| 12 Feb 2006 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
||||||
|
| 14 May 2019 19:11:40.164 | 2019-05-14 19:11:40.164 +0000 UTC |
|
||||||
| 7 oct 70 | 1970-10-07 00:00:00 +0000 UTC |
|
| 7 oct 70 | 1970-10-07 00:00:00 +0000 UTC |
|
||||||
| 7 oct 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
| 7 oct 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
||||||
| 03 February 2013 | 2013-02-03 00:00:00 +0000 UTC |
|
| 03 February 2013 | 2013-02-03 00:00:00 +0000 UTC |
|
||||||
| 1 July 2013 | 2013-07-01 00:00:00 +0000 UTC |
|
| 1 July 2013 | 2013-07-01 00:00:00 +0000 UTC |
|
||||||
| 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC |
|
| 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC |
|
||||||
|
| 06/Jan/2008:15:04:05 -0700 | 2008-01-06 15:04:05 -0700 -0700 |
|
||||||
|
| 06/Jan/2008 15:04:05 -0700 | 2008-01-06 15:04:05 -0700 -0700 |
|
||||||
| 3/31/2014 | 2014-03-31 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 |
|
| 03/31/2014 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
| 08/21/71 | 1971-08-21 00:00:00 +0000 UTC |
|
| 08/21/71 | 1971-08-21 00:00:00 +0000 UTC |
|
||||||
@ -250,11 +266,22 @@ func main() {
|
|||||||
| 2014/4/02 03:00:51 | 2014-04-02 03:00:51 +0000 UTC |
|
| 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 | 2012-03-19 10:11:59 +0000 UTC |
|
||||||
| 2012/03/19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC |
|
| 2012/03/19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC |
|
||||||
|
| 2014:3:31 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
|
| 2014:03:31 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
|
| 2014:4:8 22:05 | 2014-04-08 22:05:00 +0000 UTC |
|
||||||
|
| 2014:04:08 22:05 | 2014-04-08 22:05:00 +0000 UTC |
|
||||||
|
| 2014:04:2 03:00:51 | 2014-04-02 03:00:51 +0000 UTC |
|
||||||
|
| 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 |
|
||||||
| 2014年04月08日 | 2014-04-08 00:00:00 +0000 UTC |
|
| 2014年04月08日 | 2014-04-08 00:00:00 +0000 UTC |
|
||||||
| 2006-01-02T15:04:05+0000 | 2006-01-02 15:04:05 +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-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:09 | 2009-08-12 22:15:09 +0000 UTC |
|
||||||
|
| 2009-08-12T22:15:09.988 | 2009-08-12 22:15:09.988 +0000 UTC |
|
||||||
| 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC |
|
| 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC |
|
||||||
|
| 2017-07-19T03:21:51:897+0100 | 2017-07-19 03:21:51.897 +0100 +0100 |
|
||||||
|
| 2019-05-29T08:41-04 | 2019-05-29 08:41:00 -0400 -0400 |
|
||||||
| 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC |
|
| 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC |
|
||||||
| 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC |
|
| 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC |
|
||||||
| 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC |
|
| 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC |
|
||||||
@ -277,6 +304,7 @@ func main() {
|
|||||||
| 2014-04 | 2014-04-01 00:00:00 +0000 UTC |
|
| 2014-04 | 2014-04-01 00:00:00 +0000 UTC |
|
||||||
| 2014 | 2014-01-01 00:00:00 +0000 UTC |
|
| 2014 | 2014-01-01 00:00:00 +0000 UTC |
|
||||||
| 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC |
|
| 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC |
|
||||||
|
| 2020-07-20+08:00 | 2020-07-20 00:00:00 +0800 +0800 |
|
||||||
| 3.31.2014 | 2014-03-31 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 |
|
| 03.31.2014 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
| 08.21.71 | 1971-08-21 00:00:00 +0000 UTC |
|
| 08.21.71 | 1971-08-21 00:00:00 +0000 UTC |
|
||||||
@ -284,6 +312,7 @@ func main() {
|
|||||||
| 2014.03.30 | 2014-03-30 00:00:00 +0000 UTC |
|
| 2014.03.30 | 2014-03-30 00:00:00 +0000 UTC |
|
||||||
| 20140601 | 2014-06-01 00:00:00 +0000 UTC |
|
| 20140601 | 2014-06-01 00:00:00 +0000 UTC |
|
||||||
| 20140722105203 | 2014-07-22 10:52:03 +0000 UTC |
|
| 20140722105203 | 2014-07-22 10:52:03 +0000 UTC |
|
||||||
|
| 171113 14:14:20 | 2017-11-13 14:14:20 +0000 UTC |
|
||||||
| 1332151919 | 2012-03-19 10:11:59 +0000 UTC |
|
| 1332151919 | 2012-03-19 10:11:59 +0000 UTC |
|
||||||
| 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC |
|
| 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC |
|
||||||
| 1384216367111222 | 2013-11-12 00:32:47.111222 +0000 UTC |
|
| 1384216367111222 | 2013-11-12 00:32:47.111222 +0000 UTC |
|
||||||
|
@ -26,22 +26,23 @@ var examples = []string{
|
|||||||
"Mon Aug 10 15:44:11 UTC+0100 2015",
|
"Mon Aug 10 15:44:11 UTC+0100 2015",
|
||||||
"Thu, 4 Jan 2018 17:53:36 +0000",
|
"Thu, 4 Jan 2018 17:53:36 +0000",
|
||||||
"Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
|
"Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
|
||||||
|
"Sun, 3 Jan 2021 00:12:23 +0800 (GMT+08:00)",
|
||||||
"September 17, 2012 10:09am",
|
"September 17, 2012 10:09am",
|
||||||
"September 17, 2012 at 10:09am PST-08",
|
"September 17, 2012 at 10:09am PST-08",
|
||||||
"September 17, 2012, 10:10:09",
|
"September 17, 2012, 10:10:09",
|
||||||
"06/Jan/2008:15:04:05 -0700",
|
|
||||||
"06/Jan/2008 15:04:05 -0700",
|
|
||||||
"171113 14:14:20",
|
|
||||||
"14 May 2019 19:11:40.164",
|
|
||||||
"October 7, 1970",
|
"October 7, 1970",
|
||||||
"October 7th, 1970",
|
"October 7th, 1970",
|
||||||
"12 Feb 2006, 19:17",
|
"12 Feb 2006, 19:17",
|
||||||
"12 Feb 2006 19:17",
|
"12 Feb 2006 19:17",
|
||||||
|
"14 May 2019 19:11:40.164",
|
||||||
"7 oct 70",
|
"7 oct 70",
|
||||||
"7 oct 1970",
|
"7 oct 1970",
|
||||||
"03 February 2013",
|
"03 February 2013",
|
||||||
"1 July 2013",
|
"1 July 2013",
|
||||||
"2013-Feb-03",
|
"2013-Feb-03",
|
||||||
|
// dd/Mon/yyy alpha Months
|
||||||
|
"06/Jan/2008:15:04:05 -0700",
|
||||||
|
"06/Jan/2008 15:04:05 -0700",
|
||||||
// mm/dd/yy
|
// mm/dd/yy
|
||||||
"3/31/2014",
|
"3/31/2014",
|
||||||
"03/31/2014",
|
"03/31/2014",
|
||||||
@ -68,13 +69,25 @@ var examples = []string{
|
|||||||
"2014/4/02 03:00:51",
|
"2014/4/02 03:00:51",
|
||||||
"2012/03/19 10:11:59",
|
"2012/03/19 10:11:59",
|
||||||
"2012/03/19 10:11:59.3186369",
|
"2012/03/19 10:11:59.3186369",
|
||||||
|
// yyyy:mm:dd
|
||||||
|
"2014:3:31",
|
||||||
|
"2014:03:31",
|
||||||
|
"2014:4:8 22:05",
|
||||||
|
"2014:04:08 22:05",
|
||||||
|
"2014:04:2 03:00:51",
|
||||||
|
"2014:4:02 03:00:51",
|
||||||
|
"2012:03:19 10:11:59",
|
||||||
|
"2012:03:19 10:11:59.3186369",
|
||||||
// Chinese
|
// Chinese
|
||||||
"2014年04月08日",
|
"2014年04月08日",
|
||||||
// yyyy-mm-ddThh
|
// yyyy-mm-ddThh
|
||||||
"2006-01-02T15:04:05+0000",
|
"2006-01-02T15:04:05+0000",
|
||||||
"2009-08-12T22:15:09-07:00",
|
"2009-08-12T22:15:09-07:00",
|
||||||
"2009-08-12T22:15:09",
|
"2009-08-12T22:15:09",
|
||||||
|
"2009-08-12T22:15:09.988",
|
||||||
"2009-08-12T22:15:09Z",
|
"2009-08-12T22:15:09Z",
|
||||||
|
"2017-07-19T03:21:51:897+0100",
|
||||||
|
"2019-05-29T08:41-04", // no seconds, 2 digit TZ offset
|
||||||
// yyyy-mm-dd hh:mm:ss
|
// yyyy-mm-dd hh:mm:ss
|
||||||
"2014-04-26 17:24:37.3186369",
|
"2014-04-26 17:24:37.3186369",
|
||||||
"2012-08-03 18:31:59.257000000",
|
"2012-08-03 18:31:59.257000000",
|
||||||
@ -98,6 +111,8 @@ var examples = []string{
|
|||||||
"2014-04",
|
"2014-04",
|
||||||
"2014",
|
"2014",
|
||||||
"2014-05-11 08:20:13,787",
|
"2014-05-11 08:20:13,787",
|
||||||
|
// yyyy-mm-dd-07:00
|
||||||
|
"2020-07-20+08:00",
|
||||||
// mm.dd.yy
|
// mm.dd.yy
|
||||||
"3.31.2014",
|
"3.31.2014",
|
||||||
"03.31.2014",
|
"03.31.2014",
|
||||||
@ -107,6 +122,9 @@ var examples = []string{
|
|||||||
// yyyymmdd and similar
|
// yyyymmdd and similar
|
||||||
"20140601",
|
"20140601",
|
||||||
"20140722105203",
|
"20140722105203",
|
||||||
|
// yymmdd hh:mm:yy mysql log
|
||||||
|
// 080313 05:21:55 mysqld started
|
||||||
|
"171113 14:14:20",
|
||||||
// unix seconds, ms, micro, nano
|
// unix seconds, ms, micro, nano
|
||||||
"1332151919",
|
"1332151919",
|
||||||
"1384216367189",
|
"1384216367189",
|
||||||
@ -165,6 +183,7 @@ func main() {
|
|||||||
| Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC |
|
| Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC |
|
||||||
| Thu, 4 Jan 2018 17:53:36 +0000 | 2018-01-04 17:53:36 +0000 UTC |
|
| Thu, 4 Jan 2018 17:53:36 +0000 | 2018-01-04 17:53:36 +0000 UTC |
|
||||||
| Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT |
|
| Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT |
|
||||||
|
| Sun, 3 Jan 2021 00:12:23 +0800 (GMT+08:00) | 2021-01-03 00:12:23 +0800 +0800 |
|
||||||
| September 17, 2012 10:09am | 2012-09-17 10:09:00 +0000 UTC |
|
| September 17, 2012 10:09am | 2012-09-17 10:09:00 +0000 UTC |
|
||||||
| September 17, 2012 at 10:09am PST-08 | 2012-09-17 10:09:00 -0800 PST |
|
| September 17, 2012 at 10:09am PST-08 | 2012-09-17 10:09:00 -0800 PST |
|
||||||
| September 17, 2012, 10:10:09 | 2012-09-17 10:10:09 +0000 UTC |
|
| September 17, 2012, 10:10:09 | 2012-09-17 10:10:09 +0000 UTC |
|
||||||
@ -172,11 +191,14 @@ func main() {
|
|||||||
| October 7th, 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
| October 7th, 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
||||||
| 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
| 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
||||||
| 12 Feb 2006 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
| 12 Feb 2006 19:17 | 2006-02-12 19:17:00 +0000 UTC |
|
||||||
|
| 14 May 2019 19:11:40.164 | 2019-05-14 19:11:40.164 +0000 UTC |
|
||||||
| 7 oct 70 | 1970-10-07 00:00:00 +0000 UTC |
|
| 7 oct 70 | 1970-10-07 00:00:00 +0000 UTC |
|
||||||
| 7 oct 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
| 7 oct 1970 | 1970-10-07 00:00:00 +0000 UTC |
|
||||||
| 03 February 2013 | 2013-02-03 00:00:00 +0000 UTC |
|
| 03 February 2013 | 2013-02-03 00:00:00 +0000 UTC |
|
||||||
| 1 July 2013 | 2013-07-01 00:00:00 +0000 UTC |
|
| 1 July 2013 | 2013-07-01 00:00:00 +0000 UTC |
|
||||||
| 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC |
|
| 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC |
|
||||||
|
| 06/Jan/2008:15:04:05 -0700 | 2008-01-06 15:04:05 -0700 -0700 |
|
||||||
|
| 06/Jan/2008 15:04:05 -0700 | 2008-01-06 15:04:05 -0700 -0700 |
|
||||||
| 3/31/2014 | 2014-03-31 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 |
|
| 03/31/2014 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
| 08/21/71 | 1971-08-21 00:00:00 +0000 UTC |
|
| 08/21/71 | 1971-08-21 00:00:00 +0000 UTC |
|
||||||
@ -201,11 +223,22 @@ func main() {
|
|||||||
| 2014/4/02 03:00:51 | 2014-04-02 03:00:51 +0000 UTC |
|
| 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 | 2012-03-19 10:11:59 +0000 UTC |
|
||||||
| 2012/03/19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC |
|
| 2012/03/19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC |
|
||||||
|
| 2014:3:31 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
|
| 2014:03:31 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
|
| 2014:4:8 22:05 | 2014-04-08 22:05:00 +0000 UTC |
|
||||||
|
| 2014:04:08 22:05 | 2014-04-08 22:05:00 +0000 UTC |
|
||||||
|
| 2014:04:2 03:00:51 | 2014-04-02 03:00:51 +0000 UTC |
|
||||||
|
| 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 |
|
||||||
| 2014年04月08日 | 2014-04-08 00:00:00 +0000 UTC |
|
| 2014年04月08日 | 2014-04-08 00:00:00 +0000 UTC |
|
||||||
| 2006-01-02T15:04:05+0000 | 2006-01-02 15:04:05 +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-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:09 | 2009-08-12 22:15:09 +0000 UTC |
|
||||||
|
| 2009-08-12T22:15:09.988 | 2009-08-12 22:15:09.988 +0000 UTC |
|
||||||
| 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC |
|
| 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC |
|
||||||
|
| 2017-07-19T03:21:51:897+0100 | 2017-07-19 03:21:51.897 +0100 +0100 |
|
||||||
|
| 2019-05-29T08:41-04 | 2019-05-29 08:41:00 -0400 -0400 |
|
||||||
| 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC |
|
| 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC |
|
||||||
| 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC |
|
| 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC |
|
||||||
| 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC |
|
| 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC |
|
||||||
@ -228,6 +261,7 @@ func main() {
|
|||||||
| 2014-04 | 2014-04-01 00:00:00 +0000 UTC |
|
| 2014-04 | 2014-04-01 00:00:00 +0000 UTC |
|
||||||
| 2014 | 2014-01-01 00:00:00 +0000 UTC |
|
| 2014 | 2014-01-01 00:00:00 +0000 UTC |
|
||||||
| 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC |
|
| 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC |
|
||||||
|
| 2020-07-20+08:00 | 2020-07-20 00:00:00 +0800 +0800 |
|
||||||
| 3.31.2014 | 2014-03-31 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 |
|
| 03.31.2014 | 2014-03-31 00:00:00 +0000 UTC |
|
||||||
| 08.21.71 | 1971-08-21 00:00:00 +0000 UTC |
|
| 08.21.71 | 1971-08-21 00:00:00 +0000 UTC |
|
||||||
@ -235,6 +269,7 @@ func main() {
|
|||||||
| 2014.03.30 | 2014-03-30 00:00:00 +0000 UTC |
|
| 2014.03.30 | 2014-03-30 00:00:00 +0000 UTC |
|
||||||
| 20140601 | 2014-06-01 00:00:00 +0000 UTC |
|
| 20140601 | 2014-06-01 00:00:00 +0000 UTC |
|
||||||
| 20140722105203 | 2014-07-22 10:52:03 +0000 UTC |
|
| 20140722105203 | 2014-07-22 10:52:03 +0000 UTC |
|
||||||
|
| 171113 14:14:20 | 2017-11-13 14:14:20 +0000 UTC |
|
||||||
| 1332151919 | 2012-03-19 10:11:59 +0000 UTC |
|
| 1332151919 | 2012-03-19 10:11:59 +0000 UTC |
|
||||||
| 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC |
|
| 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC |
|
||||||
| 1384216367111222 | 2013-11-12 00:32:47.111222 +0000 UTC |
|
| 1384216367111222 | 2013-11-12 00:32:47.111222 +0000 UTC |
|
||||||
|
4
go.mod
4
go.mod
@ -3,7 +3,7 @@ module github.com/araddon/dateparse
|
|||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
github.com/mattn/go-runewidth v0.0.10 // indirect
|
||||||
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4
|
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4
|
||||||
github.com/stretchr/testify v1.6.1
|
github.com/stretchr/testify v1.7.0
|
||||||
)
|
)
|
||||||
|
11
go.sum
11
go.sum
@ -1,14 +1,17 @@
|
|||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg=
|
||||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
|
||||||
|
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4 h1:8qmTC5ByIXO3GP/IzBkxcZ/99VITvnIETDhdFz/om7A=
|
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4 h1:8qmTC5ByIXO3GP/IzBkxcZ/99VITvnIETDhdFz/om7A=
|
||||||
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
|
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
|
||||||
|
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
241
parseany.go
241
parseany.go
@ -61,32 +61,35 @@ const (
|
|||||||
dateYearDashDash
|
dateYearDashDash
|
||||||
dateYearDashDashWs // 5
|
dateYearDashDashWs // 5
|
||||||
dateYearDashDashT
|
dateYearDashDashT
|
||||||
|
dateYearDashDashOffset
|
||||||
dateDigitDash
|
dateDigitDash
|
||||||
dateDigitDashAlpha
|
dateDigitDashAlpha
|
||||||
dateDigitDashAlphaDash
|
dateDigitDashAlphaDash // 10
|
||||||
dateDigitDot // 10
|
dateDigitDot
|
||||||
dateDigitDotDot
|
dateDigitDotDot
|
||||||
dateDigitSlash
|
dateDigitSlash
|
||||||
|
dateDigitYearSlash
|
||||||
|
dateDigitSlashAlpha // 15
|
||||||
dateDigitColon
|
dateDigitColon
|
||||||
dateDigitChineseYear
|
dateDigitChineseYear
|
||||||
dateDigitChineseYearWs // 15
|
dateDigitChineseYearWs
|
||||||
dateDigitWs
|
dateDigitWs
|
||||||
dateDigitWsMoYear
|
dateDigitWsMoYear // 20
|
||||||
dateDigitWsMolong
|
dateDigitWsMolong
|
||||||
dateAlpha
|
dateAlpha
|
||||||
dateAlphaWs // 20
|
dateAlphaWs
|
||||||
dateAlphaWsDigit
|
dateAlphaWsDigit
|
||||||
dateAlphaWsDigitMore
|
dateAlphaWsDigitMore // 25
|
||||||
dateAlphaWsDigitMoreWs
|
dateAlphaWsDigitMoreWs
|
||||||
dateAlphaWsDigitMoreWsYear
|
dateAlphaWsDigitMoreWsYear
|
||||||
dateAlphaWsMonth // 25
|
dateAlphaWsMonth
|
||||||
dateAlphaWsDigitYearmaybe
|
dateAlphaWsDigitYearmaybe
|
||||||
dateAlphaWsMonthMore
|
dateAlphaWsMonthMore
|
||||||
dateAlphaWsMonthSuffix
|
dateAlphaWsMonthSuffix
|
||||||
dateAlphaWsMore
|
dateAlphaWsMore
|
||||||
dateAlphaWsAtTime // 30
|
dateAlphaWsAtTime
|
||||||
dateAlphaWsAlpha
|
dateAlphaWsAlpha
|
||||||
dateAlphaWsAlphaYearmaybe
|
dateAlphaWsAlphaYearmaybe // 35
|
||||||
dateAlphaPeriodWsDigit
|
dateAlphaPeriodWsDigit
|
||||||
dateWeekdayComma
|
dateWeekdayComma
|
||||||
dateWeekdayAbbrevComma
|
dateWeekdayAbbrevComma
|
||||||
@ -268,7 +271,7 @@ iterRunes:
|
|||||||
i += (bytesConsumed - 1)
|
i += (bytesConsumed - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
//gou.Debugf("i=%d r=%s state=%d %s", i, string(r), p.stateDate, datestr)
|
// gou.Debugf("i=%d r=%s state=%d %s", i, string(r), p.stateDate, datestr)
|
||||||
switch p.stateDate {
|
switch p.stateDate {
|
||||||
case dateStart:
|
case dateStart:
|
||||||
if unicode.IsDigit(r) {
|
if unicode.IsDigit(r) {
|
||||||
@ -301,13 +304,32 @@ iterRunes:
|
|||||||
// 2014/02/24
|
// 2014/02/24
|
||||||
p.stateDate = dateDigitSlash
|
p.stateDate = dateDigitSlash
|
||||||
if i == 4 {
|
if i == 4 {
|
||||||
p.yearlen = i
|
// 2014/02/24 - Year first /
|
||||||
|
p.yearlen = i // since it was start of datestr, i=len
|
||||||
p.moi = i + 1
|
p.moi = i + 1
|
||||||
p.setYear()
|
p.setYear()
|
||||||
|
p.stateDate = dateDigitYearSlash
|
||||||
} else {
|
} else {
|
||||||
|
// Either Ambiguous dd/mm vs mm/dd OR dd/month/yy
|
||||||
|
// 08/May/2005
|
||||||
|
// 03/31/2005
|
||||||
|
// 31/03/2005
|
||||||
|
if i+2 < len(p.datestr) && unicode.IsLetter(rune(datestr[i+1])) {
|
||||||
|
// 08/May/2005
|
||||||
|
p.stateDate = dateDigitSlashAlpha
|
||||||
|
p.moi = i + 1
|
||||||
|
p.daylen = 2
|
||||||
|
p.dayi = 0
|
||||||
|
p.setDay()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Ambiguous dd/mm vs mm/dd the bane of date-parsing
|
||||||
|
// 03/31/2005
|
||||||
|
// 31/03/2005
|
||||||
p.ambiguousMD = true
|
p.ambiguousMD = true
|
||||||
if p.preferMonthFirst {
|
if p.preferMonthFirst {
|
||||||
if p.molen == 0 {
|
if p.molen == 0 {
|
||||||
|
// 03/31/2005
|
||||||
p.molen = i
|
p.molen = i
|
||||||
p.setMonth()
|
p.setMonth()
|
||||||
p.dayi = i + 1
|
p.dayi = i + 1
|
||||||
@ -319,6 +341,7 @@ iterRunes:
|
|||||||
p.moi = i + 1
|
p.moi = i + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case ':':
|
case ':':
|
||||||
@ -390,6 +413,7 @@ iterRunes:
|
|||||||
case dateYearDash:
|
case dateYearDash:
|
||||||
// dateYearDashDashT
|
// dateYearDashDashT
|
||||||
// 2006-01-02T15:04:05Z07:00
|
// 2006-01-02T15:04:05Z07:00
|
||||||
|
// 2020-08-17T17:00:00:000+0100
|
||||||
// dateYearDashDashWs
|
// dateYearDashDashWs
|
||||||
// 2013-04-01 22:43:22
|
// 2013-04-01 22:43:22
|
||||||
// dateYearDashAlphaDash
|
// dateYearDashAlphaDash
|
||||||
@ -411,7 +435,14 @@ iterRunes:
|
|||||||
// 2006-01-02T15:04:05Z07:00
|
// 2006-01-02T15:04:05Z07:00
|
||||||
// dateYearDashDashWs
|
// dateYearDashDashWs
|
||||||
// 2013-04-01 22:43:22
|
// 2013-04-01 22:43:22
|
||||||
|
// dateYearDashDashOffset
|
||||||
|
// 2020-07-20+00:00
|
||||||
switch r {
|
switch r {
|
||||||
|
case '+', '-':
|
||||||
|
p.offseti = i
|
||||||
|
p.daylen = i - p.dayi
|
||||||
|
p.stateDate = dateYearDashDashOffset
|
||||||
|
p.setDay()
|
||||||
case ' ':
|
case ' ':
|
||||||
p.daylen = i - p.dayi
|
p.daylen = i - p.dayi
|
||||||
p.stateDate = dateYearDashDashWs
|
p.stateDate = dateYearDashDashWs
|
||||||
@ -425,6 +456,21 @@ iterRunes:
|
|||||||
p.setDay()
|
p.setDay()
|
||||||
break iterRunes
|
break iterRunes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case dateYearDashDashT:
|
||||||
|
// dateYearDashDashT
|
||||||
|
// 2006-01-02T15:04:05Z07:00
|
||||||
|
// 2020-08-17T17:00:00:000+0100
|
||||||
|
|
||||||
|
case dateYearDashDashOffset:
|
||||||
|
// 2020-07-20+00:00
|
||||||
|
switch r {
|
||||||
|
case ':':
|
||||||
|
p.set(p.offseti, "-07:00")
|
||||||
|
// case ' ':
|
||||||
|
// return nil, unknownErr(datestr)
|
||||||
|
}
|
||||||
|
|
||||||
case dateYearDashAlphaDash:
|
case dateYearDashAlphaDash:
|
||||||
// 2013-Feb-03
|
// 2013-Feb-03
|
||||||
switch r {
|
switch r {
|
||||||
@ -452,18 +498,12 @@ iterRunes:
|
|||||||
p.set(p.moi, "Jan")
|
p.set(p.moi, "Jan")
|
||||||
p.yeari = i + 1
|
p.yeari = i + 1
|
||||||
p.stateDate = dateDigitDashAlphaDash
|
p.stateDate = dateDigitDashAlphaDash
|
||||||
case '/':
|
|
||||||
p.set(0, "02")
|
|
||||||
p.molen = i - p.moi
|
|
||||||
p.set(p.moi, "Jan")
|
|
||||||
p.yeari = i + 1
|
|
||||||
p.stateDate = dateDigitSlash
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case dateDigitDashAlphaDash:
|
case dateDigitDashAlphaDash:
|
||||||
// 13-Feb-03 ambiguous
|
// 13-Feb-03 ambiguous
|
||||||
// 28-Feb-03 ambiguous
|
// 28-Feb-03 ambiguous
|
||||||
// 29-Jun-2016
|
// 29-Jun-2016 dd-month(alpha)-yyyy
|
||||||
switch r {
|
switch r {
|
||||||
case ' ':
|
case ' ':
|
||||||
// we need to find if this was 4 digits, aka year
|
// we need to find if this was 4 digits, aka year
|
||||||
@ -522,8 +562,49 @@ iterRunes:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case dateDigitSlash:
|
case dateDigitYearSlash:
|
||||||
// 2014/07/10 06:55:38.156283
|
// 2014/07/10 06:55:38.156283
|
||||||
|
// I honestly don't know if this format ever shows up as yyyy/
|
||||||
|
|
||||||
|
switch r {
|
||||||
|
case ' ', ':':
|
||||||
|
p.stateTime = timeStart
|
||||||
|
if p.daylen == 0 {
|
||||||
|
p.daylen = i - p.dayi
|
||||||
|
p.setDay()
|
||||||
|
}
|
||||||
|
break iterRunes
|
||||||
|
case '/':
|
||||||
|
if p.molen == 0 {
|
||||||
|
p.molen = i - p.moi
|
||||||
|
p.setMonth()
|
||||||
|
p.dayi = i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case dateDigitSlashAlpha:
|
||||||
|
// 06/May/2008
|
||||||
|
|
||||||
|
switch r {
|
||||||
|
case '/':
|
||||||
|
// |
|
||||||
|
// 06/May/2008
|
||||||
|
if p.molen == 0 {
|
||||||
|
p.set(p.moi, "Jan")
|
||||||
|
p.yeari = i + 1
|
||||||
|
}
|
||||||
|
// We aren't breaking because we are going to re-use this case
|
||||||
|
// to find where the date starts, and possible time begins
|
||||||
|
case ' ', ':':
|
||||||
|
p.stateTime = timeStart
|
||||||
|
if p.yearlen == 0 {
|
||||||
|
p.yearlen = i - p.yeari
|
||||||
|
p.setYear()
|
||||||
|
}
|
||||||
|
break iterRunes
|
||||||
|
}
|
||||||
|
|
||||||
|
case dateDigitSlash:
|
||||||
// 03/19/2012 10:11:59
|
// 03/19/2012 10:11:59
|
||||||
// 04/2/2014 03:00:37
|
// 04/2/2014 03:00:37
|
||||||
// 3/1/2012 10:11:59
|
// 3/1/2012 10:11:59
|
||||||
@ -534,35 +615,9 @@ iterRunes:
|
|||||||
// 1/2/06
|
// 1/2/06
|
||||||
|
|
||||||
switch r {
|
switch r {
|
||||||
case ' ':
|
|
||||||
p.stateTime = timeStart
|
|
||||||
if p.yearlen == 0 {
|
|
||||||
p.yearlen = i - p.yeari
|
|
||||||
p.setYear()
|
|
||||||
} else if p.daylen == 0 {
|
|
||||||
p.daylen = i - p.dayi
|
|
||||||
p.setDay()
|
|
||||||
}
|
|
||||||
break iterRunes
|
|
||||||
case ':':
|
|
||||||
p.stateTime = timeStart
|
|
||||||
if p.yearlen == 0 {
|
|
||||||
p.yearlen = i - p.yeari
|
|
||||||
p.setYear()
|
|
||||||
} else if p.daylen == 0 {
|
|
||||||
p.daylen = i - p.dayi
|
|
||||||
p.setDay()
|
|
||||||
}
|
|
||||||
break iterRunes
|
|
||||||
case '/':
|
case '/':
|
||||||
if p.yearlen > 0 {
|
// This is the 2nd / so now we should know start pts of all of the dd, mm, yy
|
||||||
// 2014/07/10 06:55:38.156283
|
if p.preferMonthFirst {
|
||||||
if p.molen == 0 {
|
|
||||||
p.molen = i - p.moi
|
|
||||||
p.setMonth()
|
|
||||||
p.dayi = i + 1
|
|
||||||
}
|
|
||||||
} else if p.preferMonthFirst {
|
|
||||||
if p.daylen == 0 {
|
if p.daylen == 0 {
|
||||||
p.daylen = i - p.dayi
|
p.daylen = i - p.dayi
|
||||||
p.setDay()
|
p.setDay()
|
||||||
@ -575,11 +630,15 @@ iterRunes:
|
|||||||
p.yeari = i + 1
|
p.yeari = i + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
// Note no break, we are going to pass by and re-enter this dateDigitSlash
|
||||||
if unicode.IsLetter(r) {
|
// and look for ending (space) or not (just date)
|
||||||
p.moi = i
|
case ' ':
|
||||||
p.stateDate = dateDigitDashAlpha
|
p.stateTime = timeStart
|
||||||
|
if p.yearlen == 0 {
|
||||||
|
p.yearlen = i - p.yeari
|
||||||
|
p.setYear()
|
||||||
}
|
}
|
||||||
|
break iterRunes
|
||||||
}
|
}
|
||||||
|
|
||||||
case dateDigitColon:
|
case dateDigitColon:
|
||||||
@ -779,8 +838,7 @@ iterRunes:
|
|||||||
|
|
||||||
case r == ',':
|
case r == ',':
|
||||||
// Mon, 02 Jan 2006
|
// Mon, 02 Jan 2006
|
||||||
// p.moi = 0
|
|
||||||
// p.molen = i
|
|
||||||
if i == 3 {
|
if i == 3 {
|
||||||
p.stateDate = dateWeekdayAbbrevComma
|
p.stateDate = dateWeekdayAbbrevComma
|
||||||
p.set(0, "Mon")
|
p.set(0, "Mon")
|
||||||
@ -1100,7 +1158,7 @@ iterRunes:
|
|||||||
for ; i < len(datestr); i++ {
|
for ; i < len(datestr); i++ {
|
||||||
r := rune(datestr[i])
|
r := rune(datestr[i])
|
||||||
|
|
||||||
//gou.Debugf("%d %s %d iterTimeRunes %s %s", i, string(r), p.stateTime, p.ds(), p.ts())
|
// gou.Debugf("i=%d r=%s state=%d iterTimeRunes %s %s", i, string(r), p.stateTime, p.ds(), p.ts())
|
||||||
|
|
||||||
switch p.stateTime {
|
switch p.stateTime {
|
||||||
case timeStart:
|
case timeStart:
|
||||||
@ -1157,8 +1215,13 @@ iterRunes:
|
|||||||
// 22:18+0530
|
// 22:18+0530
|
||||||
p.minlen = i - p.mini
|
p.minlen = i - p.mini
|
||||||
} else {
|
} else {
|
||||||
|
if p.seclen == 0 {
|
||||||
p.seclen = i - p.seci
|
p.seclen = i - p.seci
|
||||||
}
|
}
|
||||||
|
if p.msi > 0 && p.mslen == 0 {
|
||||||
|
p.mslen = i - p.msi
|
||||||
|
}
|
||||||
|
}
|
||||||
p.offseti = i
|
p.offseti = i
|
||||||
case '.':
|
case '.':
|
||||||
p.stateTime = timePeriod
|
p.stateTime = timePeriod
|
||||||
@ -1215,6 +1278,19 @@ iterRunes:
|
|||||||
} else if p.seci == 0 {
|
} else if p.seci == 0 {
|
||||||
p.seci = i + 1
|
p.seci = i + 1
|
||||||
p.minlen = i - p.mini
|
p.minlen = i - p.mini
|
||||||
|
} else if p.seci > 0 {
|
||||||
|
// 18:31:59:257 ms uses colon, wtf
|
||||||
|
p.seclen = i - p.seci
|
||||||
|
p.set(p.seci, "05")
|
||||||
|
p.msi = i + 1
|
||||||
|
|
||||||
|
// gross, gross, gross. manipulating the datestr is horrible.
|
||||||
|
// https://github.com/araddon/dateparse/issues/117
|
||||||
|
// Could not get the parsing to work using golang time.Parse() without
|
||||||
|
// replacing that colon with period.
|
||||||
|
p.set(i, ".")
|
||||||
|
datestr = datestr[0:i] + "." + datestr[i+1:]
|
||||||
|
p.datestr = datestr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case timeOffset:
|
case timeOffset:
|
||||||
@ -1262,7 +1338,6 @@ iterRunes:
|
|||||||
// 17:57:51 MST 2009
|
// 17:57:51 MST 2009
|
||||||
p.tzi = i
|
p.tzi = i
|
||||||
p.stateTime = timeWsAlpha
|
p.stateTime = timeWsAlpha
|
||||||
//break iterTimeRunes
|
|
||||||
} else if unicode.IsDigit(r) {
|
} else if unicode.IsDigit(r) {
|
||||||
// 00:12:00 2008
|
// 00:12:00 2008
|
||||||
p.stateTime = timeWsYear
|
p.stateTime = timeWsYear
|
||||||
@ -1292,6 +1367,7 @@ iterRunes:
|
|||||||
p.offseti = i
|
p.offseti = i
|
||||||
case ' ':
|
case ' ':
|
||||||
// 17:57:51 MST 2009
|
// 17:57:51 MST 2009
|
||||||
|
// 17:57:51 MST
|
||||||
p.tzlen = i - p.tzi
|
p.tzlen = i - p.tzi
|
||||||
if p.tzlen == 4 {
|
if p.tzlen == 4 {
|
||||||
p.set(p.tzi, " MST")
|
p.set(p.tzi, " MST")
|
||||||
@ -1394,7 +1470,7 @@ iterRunes:
|
|||||||
p.trimExtra()
|
p.trimExtra()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case '+', '-':
|
case '+', '-', '(':
|
||||||
// This really doesn't seem valid, but for some reason when round-tripping a go date
|
// This really doesn't seem valid, but for some reason when round-tripping a go date
|
||||||
// their is an extra +03 printed out. seems like go bug to me, but, parsing anyway.
|
// their is an extra +03 printed out. seems like go bug to me, but, parsing anyway.
|
||||||
// 00:00:00 +0300 +03
|
// 00:00:00 +0300 +03
|
||||||
@ -1411,6 +1487,7 @@ iterRunes:
|
|||||||
p.setYear()
|
p.setYear()
|
||||||
}
|
}
|
||||||
case unicode.IsLetter(r):
|
case unicode.IsLetter(r):
|
||||||
|
// 15:04:05 -0700 MST
|
||||||
if p.tzi == 0 {
|
if p.tzi == 0 {
|
||||||
p.tzi = i
|
p.tzi = i
|
||||||
}
|
}
|
||||||
@ -1596,6 +1673,17 @@ iterRunes:
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch p.stateTime {
|
switch p.stateTime {
|
||||||
|
case timeWsAlpha:
|
||||||
|
switch len(p.datestr) - p.tzi {
|
||||||
|
case 3:
|
||||||
|
// 13:31:51.999 +01:00 CET
|
||||||
|
p.set(p.tzi, "MST")
|
||||||
|
case 4:
|
||||||
|
p.set(p.tzi, "MST")
|
||||||
|
p.extra = len(p.datestr) - 1
|
||||||
|
p.trimExtra()
|
||||||
|
}
|
||||||
|
|
||||||
case timeWsAlphaWs:
|
case timeWsAlphaWs:
|
||||||
p.yearlen = i - p.yeari
|
p.yearlen = i - p.yeari
|
||||||
p.setYear()
|
p.setYear()
|
||||||
@ -1615,13 +1703,34 @@ iterRunes:
|
|||||||
case timePeriod:
|
case timePeriod:
|
||||||
p.mslen = i - p.msi
|
p.mslen = i - p.msi
|
||||||
case timeOffset:
|
case timeOffset:
|
||||||
|
|
||||||
|
switch len(p.datestr) - p.offseti {
|
||||||
|
case 0, 1, 2, 4:
|
||||||
|
return p, fmt.Errorf("TZ offset not recognized %q near %q (must be 2 or 4 digits optional colon)", datestr, string(datestr[p.offseti:]))
|
||||||
|
case 3:
|
||||||
|
// 19:55:00+01
|
||||||
|
p.set(p.offseti, "-07")
|
||||||
|
case 5:
|
||||||
// 19:55:00+0100
|
// 19:55:00+0100
|
||||||
p.set(p.offseti, "-0700")
|
p.set(p.offseti, "-0700")
|
||||||
|
}
|
||||||
|
|
||||||
case timeWsOffset:
|
case timeWsOffset:
|
||||||
p.set(p.offseti, "-0700")
|
p.set(p.offseti, "-0700")
|
||||||
case timeWsOffsetWs:
|
case timeWsOffsetWs:
|
||||||
// 17:57:51 -0700 2009
|
// 17:57:51 -0700 2009
|
||||||
// 00:12:00 +0000 UTC
|
// 00:12:00 +0000 UTC
|
||||||
|
if p.tzi > 0 {
|
||||||
|
switch len(p.datestr) - p.tzi {
|
||||||
|
case 3:
|
||||||
|
// 13:31:51.999 +01:00 CET
|
||||||
|
p.set(p.tzi, "MST")
|
||||||
|
case 4:
|
||||||
|
// 13:31:51.999 +01:00 CEST
|
||||||
|
p.set(p.tzi, "MST ")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
case timeWsOffsetColon:
|
case timeWsOffsetColon:
|
||||||
// 17:57:51 -07:00
|
// 17:57:51 -07:00
|
||||||
p.set(p.offseti, "-07:00")
|
p.set(p.offseti, "-07:00")
|
||||||
@ -1714,6 +1823,16 @@ iterRunes:
|
|||||||
// 2006-01-2
|
// 2006-01-2
|
||||||
return p, nil
|
return p, nil
|
||||||
|
|
||||||
|
case dateYearDashDashOffset:
|
||||||
|
/// 2020-07-20+00:00
|
||||||
|
switch len(p.datestr) - p.offseti {
|
||||||
|
case 5:
|
||||||
|
p.set(p.offseti, "-0700")
|
||||||
|
case 6:
|
||||||
|
p.set(p.offseti, "-07:00")
|
||||||
|
}
|
||||||
|
return p, nil
|
||||||
|
|
||||||
case dateYearDashAlphaDash:
|
case dateYearDashAlphaDash:
|
||||||
// 2013-Feb-03
|
// 2013-Feb-03
|
||||||
// 2013-Feb-3
|
// 2013-Feb-3
|
||||||
@ -1821,6 +1940,13 @@ iterRunes:
|
|||||||
// 3/1/2014
|
// 3/1/2014
|
||||||
// 10/13/2014
|
// 10/13/2014
|
||||||
// 01/02/2006
|
// 01/02/2006
|
||||||
|
return p, nil
|
||||||
|
|
||||||
|
case dateDigitSlashAlpha:
|
||||||
|
// 03/Jun/2014
|
||||||
|
return p, nil
|
||||||
|
|
||||||
|
case dateDigitYearSlash:
|
||||||
// 2014/10/13
|
// 2014/10/13
|
||||||
return p, nil
|
return p, nil
|
||||||
|
|
||||||
@ -2068,10 +2194,11 @@ func (p *parser) parse() (time.Time, error) {
|
|||||||
p.datestr = p.datestr[p.skip:]
|
p.datestr = p.datestr[p.skip:]
|
||||||
}
|
}
|
||||||
|
|
||||||
//gou.Debugf("parse %q AS %q", p.datestr, string(p.format))
|
|
||||||
if p.loc == nil {
|
if p.loc == nil {
|
||||||
|
// gou.Debugf("parse layout=%q input=%q \ntx, err := time.Parse(%q, %q)", string(p.format), p.datestr, string(p.format), p.datestr)
|
||||||
return time.Parse(string(p.format), p.datestr)
|
return time.Parse(string(p.format), p.datestr)
|
||||||
}
|
}
|
||||||
|
//gou.Debugf("parse layout=%q input=%q \ntx, err := time.ParseInLocation(%q, %q, %v)", string(p.format), p.datestr, string(p.format), p.datestr, p.loc)
|
||||||
return time.ParseInLocation(string(p.format), p.datestr, p.loc)
|
return time.ParseInLocation(string(p.format), p.datestr, p.loc)
|
||||||
}
|
}
|
||||||
func isDay(alpha string) bool {
|
func isDay(alpha string) bool {
|
||||||
|
@ -11,8 +11,8 @@ import (
|
|||||||
func TestOne(t *testing.T) {
|
func TestOne(t *testing.T) {
|
||||||
time.Local = time.UTC
|
time.Local = time.UTC
|
||||||
var ts time.Time
|
var ts time.Time
|
||||||
ts = MustParse("Mon 30 Sep 2018 09:09:09 PM UTC")
|
ts = MustParse("2020-07-20+08:00")
|
||||||
assert.Equal(t, "2018-09-30 21:09:09 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC)))
|
assert.Equal(t, "2020-07-19 16:00:00 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC)))
|
||||||
}
|
}
|
||||||
|
|
||||||
type dateTest struct {
|
type dateTest struct {
|
||||||
@ -107,9 +107,10 @@ var testInputs = []dateTest{
|
|||||||
{in: "June 2nd 2012", out: "2012-06-02 00:00:00 +0000 UTC"},
|
{in: "June 2nd 2012", out: "2012-06-02 00:00:00 +0000 UTC"},
|
||||||
{in: "June 22nd, 2012", out: "2012-06-22 00:00:00 +0000 UTC"},
|
{in: "June 22nd, 2012", out: "2012-06-22 00:00:00 +0000 UTC"},
|
||||||
{in: "June 22nd 2012", out: "2012-06-22 00:00:00 +0000 UTC"},
|
{in: "June 22nd 2012", out: "2012-06-22 00:00:00 +0000 UTC"},
|
||||||
// ?
|
// RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
|
||||||
{in: "Fri, 03 Jul 2015 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03 Jul 2015 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 03 Jul 2015 08:08:08 PST", out: "2015-07-03 15:08:08 +0000 UTC", loc: "America/Los_Angeles"},
|
//{in: "Fri, 03 Jul 2015 08:08:08 CET", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
|
{in: "Fri, 03 Jul 2015 08:08:08 PST", out: "2015-07-03 16:08:08 +0000 UTC", loc: "America/Los_Angeles"},
|
||||||
{in: "Fri, 03 Jul 2015 08:08:08 PST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03 Jul 2015 08:08:08 PST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 3 Jul 2015 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 3 Jul 2015 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 03 Jul 2015 8:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03 Jul 2015 8:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
@ -126,11 +127,13 @@ var testInputs = []dateTest{
|
|||||||
{in: "Tue, 11 Jul 2017 04:08:03 +0200 (CEST)", out: "2017-07-11 02:08:03 +0000 UTC", loc: "Europe/Berlin"},
|
{in: "Tue, 11 Jul 2017 04:08:03 +0200 (CEST)", out: "2017-07-11 02:08:03 +0000 UTC", loc: "Europe/Berlin"},
|
||||||
// day, dd-Mon-yy hh:mm:zz TZ
|
// day, dd-Mon-yy hh:mm:zz TZ
|
||||||
{in: "Fri, 03-Jul-15 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03-Jul-15 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 03-Jul-15 08:08:08 PST", out: "2015-07-03 15:08:08 +0000 UTC", loc: "America/Los_Angeles"},
|
{in: "Fri, 03-Jul-15 08:08:08 PST", out: "2015-07-03 16:08:08 +0000 UTC", loc: "America/Los_Angeles"},
|
||||||
{in: "Fri, 03-Jul 2015 08:08:08 PST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03-Jul 2015 08:08:08 PST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 3-Jul-15 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 3-Jul-15 08:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 03-Jul-15 8:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03-Jul-15 8:08:08 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
{in: "Fri, 03-Jul-15 8:8:8 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
{in: "Fri, 03-Jul-15 8:8:8 MST", out: "2015-07-03 08:08:08 +0000 UTC"},
|
||||||
|
// day, dd-Mon-yy hh:mm:zz TZ (text) https://github.com/araddon/dateparse/issues/116
|
||||||
|
{in: "Sun, 3 Jan 2021 00:12:23 +0800 (GMT+08:00)", out: "2021-01-02 16:12:23 +0000 UTC"},
|
||||||
// RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
|
// RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
|
||||||
{in: "Wednesday, 07-May-09 08:00:43 MST", out: "2009-05-07 08:00:43 +0000 UTC"},
|
{in: "Wednesday, 07-May-09 08:00:43 MST", out: "2009-05-07 08:00:43 +0000 UTC"},
|
||||||
{in: "Wednesday, 28-Feb-18 09:01:00 MST", out: "2018-02-28 09:01:00 +0000 UTC"},
|
{in: "Wednesday, 28-Feb-18 09:01:00 MST", out: "2018-02-28 09:01:00 +0000 UTC"},
|
||||||
@ -222,10 +225,20 @@ var testInputs = []dateTest{
|
|||||||
{in: "2014/4/2 04:08:09 AM", out: "2014-04-02 04:08:09 +0000 UTC"},
|
{in: "2014/4/2 04:08:09 AM", out: "2014-04-02 04:08:09 +0000 UTC"},
|
||||||
{in: "2014/04/02 04:08:09.123 AM", out: "2014-04-02 04:08:09.123 +0000 UTC"},
|
{in: "2014/04/02 04:08:09.123 AM", out: "2014-04-02 04:08:09.123 +0000 UTC"},
|
||||||
{in: "2014/04/02 04:08:09.123 PM", out: "2014-04-02 16:08:09.123 +0000 UTC"},
|
{in: "2014/04/02 04:08:09.123 PM", out: "2014-04-02 16:08:09.123 +0000 UTC"},
|
||||||
|
// dd/mon/yyyy:hh:mm:ss tz nginx-log? https://github.com/araddon/dateparse/issues/118
|
||||||
|
// 112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"
|
||||||
|
{in: "06/May/2008:08:11:17 -0700", out: "2008-05-06 15:11:17 +0000 UTC"},
|
||||||
|
{in: "30/May/2008:08:11:17 -0700", out: "2008-05-30 15:11:17 +0000 UTC"},
|
||||||
|
// dd/mon/yyy hh:mm:ss tz
|
||||||
|
{in: "06/May/2008:08:11:17 -0700", out: "2008-05-06 15:11:17 +0000 UTC"},
|
||||||
|
{in: "30/May/2008:08:11:17 -0700", out: "2008-05-30 15:11:17 +0000 UTC"},
|
||||||
// yyyy-mm-dd
|
// yyyy-mm-dd
|
||||||
{in: "2014-04-02", out: "2014-04-02 00:00:00 +0000 UTC"},
|
{in: "2014-04-02", out: "2014-04-02 00:00:00 +0000 UTC"},
|
||||||
{in: "2014-03-31", out: "2014-03-31 00:00:00 +0000 UTC"},
|
{in: "2014-03-31", out: "2014-03-31 00:00:00 +0000 UTC"},
|
||||||
{in: "2014-4-2", out: "2014-04-02 00:00:00 +0000 UTC"},
|
{in: "2014-4-2", out: "2014-04-02 00:00:00 +0000 UTC"},
|
||||||
|
// yyyy-mm-dd-07:00
|
||||||
|
{in: "2020-07-20+08:00", out: "2020-07-19 16:00:00 +0000 UTC"},
|
||||||
|
{in: "2020-07-20+0800", out: "2020-07-19 16:00:00 +0000 UTC"},
|
||||||
// dd-mmm-yy
|
// dd-mmm-yy
|
||||||
{in: "28-Feb-02", out: "2002-02-28 00:00:00 +0000 UTC"},
|
{in: "28-Feb-02", out: "2002-02-28 00:00:00 +0000 UTC"},
|
||||||
{in: "15-Jan-18", out: "2018-01-15 00:00:00 +0000 UTC"},
|
{in: "15-Jan-18", out: "2018-01-15 00:00:00 +0000 UTC"},
|
||||||
@ -317,7 +330,7 @@ var testInputs = []dateTest{
|
|||||||
{in: "2014-04-26 17:24:37.1 UTC", out: "2014-04-26 17:24:37.1 +0000 UTC"},
|
{in: "2014-04-26 17:24:37.1 UTC", out: "2014-04-26 17:24:37.1 +0000 UTC"},
|
||||||
// This one is pretty special, it is TIMEZONE based but starts with P to emulate collions with PM
|
// This one is pretty special, it is TIMEZONE based but starts with P to emulate collions with PM
|
||||||
{in: "2014-04-26 05:24:37 PST", out: "2014-04-26 05:24:37 +0000 UTC"},
|
{in: "2014-04-26 05:24:37 PST", out: "2014-04-26 05:24:37 +0000 UTC"},
|
||||||
{in: "2014-04-26 05:24:37 PST", out: "2014-04-26 12:24:37 +0000 UTC", loc: "America/Los_Angeles"},
|
{in: "2014-04-26 05:24:37 PST", out: "2014-04-26 13:24:37 +0000 UTC", loc: "America/Los_Angeles"},
|
||||||
// yyyy-mm-dd hh:mm:ss+00:00
|
// yyyy-mm-dd hh:mm:ss+00:00
|
||||||
{in: "2012-08-03 18:31:59+00:00", out: "2012-08-03 18:31:59 +0000 UTC"},
|
{in: "2012-08-03 18:31:59+00:00", out: "2012-08-03 18:31:59 +0000 UTC"},
|
||||||
{in: "2017-07-19 03:21:51+00:00", out: "2017-07-19 03:21:51 +0000 UTC"},
|
{in: "2017-07-19 03:21:51+00:00", out: "2017-07-19 03:21:51 +0000 UTC"},
|
||||||
@ -355,6 +368,8 @@ var testInputs = []dateTest{
|
|||||||
{in: "2009-08-12T22:15:09.123-07:00", out: "2009-08-13 05:15:09.123 +0000 UTC"},
|
{in: "2009-08-12T22:15:09.123-07:00", out: "2009-08-13 05:15:09.123 +0000 UTC"},
|
||||||
{in: "2016-06-21T19:55:00+01:00", out: "2016-06-21 18:55:00 +0000 UTC"},
|
{in: "2016-06-21T19:55:00+01:00", out: "2016-06-21 18:55:00 +0000 UTC"},
|
||||||
{in: "2016-06-21T19:55:00.799+01:00", out: "2016-06-21 18:55:00.799 +0000 UTC"},
|
{in: "2016-06-21T19:55:00.799+01:00", out: "2016-06-21 18:55:00.799 +0000 UTC"},
|
||||||
|
// yyyy-mm-ddThh:mm:ss-07 TZ truncated to 2 digits instead of 4
|
||||||
|
{in: "2019-05-29T08:41-04", out: "2019-05-29 12:41:00 +0000 UTC"},
|
||||||
// yyyy-mm-ddThh:mm:ss-0700
|
// yyyy-mm-ddThh:mm:ss-0700
|
||||||
{in: "2009-08-12T22:15:09-0700", out: "2009-08-13 05:15:09 +0000 UTC"},
|
{in: "2009-08-12T22:15:09-0700", out: "2009-08-13 05:15:09 +0000 UTC"},
|
||||||
{in: "2009-08-12T22:15:09-0300", out: "2009-08-13 01:15:09 +0000 UTC"},
|
{in: "2009-08-12T22:15:09-0300", out: "2009-08-13 01:15:09 +0000 UTC"},
|
||||||
@ -367,6 +382,9 @@ var testInputs = []dateTest{
|
|||||||
{in: "2016-06-21T19:55:00.799+0100", out: "2016-06-21 18:55:00.799 +0000 UTC"},
|
{in: "2016-06-21T19:55:00.799+0100", out: "2016-06-21 18:55:00.799 +0000 UTC"},
|
||||||
{in: "2016-06-21T19:55+0100", out: "2016-06-21 18:55:00 +0000 UTC"},
|
{in: "2016-06-21T19:55+0100", out: "2016-06-21 18:55:00 +0000 UTC"},
|
||||||
{in: "2016-06-21T19:55+0130", out: "2016-06-21 18:25:00 +0000 UTC"},
|
{in: "2016-06-21T19:55+0130", out: "2016-06-21 18:25:00 +0000 UTC"},
|
||||||
|
// yyyy-mm-ddThh:mm:ss:000+0000 - weird format with additional colon in front of milliseconds
|
||||||
|
{in: "2012-08-17T18:31:59:257+0100", out: "2012-08-17 17:31:59.257 +0000 UTC"}, // https://github.com/araddon/dateparse/issues/117
|
||||||
|
|
||||||
// yyyy-mm-ddThh:mm:ssZ
|
// yyyy-mm-ddThh:mm:ssZ
|
||||||
{in: "2009-08-12T22:15Z", out: "2009-08-12 22:15:00 +0000 UTC"},
|
{in: "2009-08-12T22:15Z", out: "2009-08-12 22:15:00 +0000 UTC"},
|
||||||
{in: "2009-08-12T22:15:09Z", out: "2009-08-12 22:15:09 +0000 UTC"},
|
{in: "2009-08-12T22:15:09Z", out: "2009-08-12 22:15:09 +0000 UTC"},
|
||||||
@ -388,6 +406,10 @@ var testInputs = []dateTest{
|
|||||||
{in: "2014", out: "2014-01-01 00:00:00 +0000 UTC"},
|
{in: "2014", out: "2014-01-01 00:00:00 +0000 UTC"},
|
||||||
{in: "20140601", out: "2014-06-01 00:00:00 +0000 UTC"},
|
{in: "20140601", out: "2014-06-01 00:00:00 +0000 UTC"},
|
||||||
{in: "20140722105203", out: "2014-07-22 10:52:03 +0000 UTC"},
|
{in: "20140722105203", out: "2014-07-22 10:52:03 +0000 UTC"},
|
||||||
|
// yymmdd hh:mm:yy mysql log https://github.com/araddon/dateparse/issues/119
|
||||||
|
// 080313 05:21:55 mysqld started
|
||||||
|
// 080313 5:21:55 InnoDB: Started; log sequence number 0 43655
|
||||||
|
{in: "171113 14:14:20", out: "2017-11-13 14:14:20 +0000 UTC"},
|
||||||
|
|
||||||
// all digits: unix secs, ms etc
|
// all digits: unix secs, ms etc
|
||||||
{in: "1332151919", out: "2012-03-19 10:11:59 +0000 UTC"},
|
{in: "1332151919", out: "2012-03-19 10:11:59 +0000 UTC"},
|
||||||
@ -537,6 +559,47 @@ var testParseFormat = []dateTest{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestParseLayout(t *testing.T) {
|
func TestParseLayout(t *testing.T) {
|
||||||
|
|
||||||
|
time.Local = time.UTC
|
||||||
|
// These tests are verifying that the layout returned by ParseFormat
|
||||||
|
// are correct. Above tests correct parsing, this tests correct
|
||||||
|
// re-usable formatting string
|
||||||
|
var testParseFormat = []dateTest{
|
||||||
|
// errors
|
||||||
|
{in: "3", err: true},
|
||||||
|
{in: `{"hello"}`, err: true},
|
||||||
|
{in: "2009-15-12T22:15Z", err: true},
|
||||||
|
{in: "5,000-9,999", err: true},
|
||||||
|
// This 3 digit TZ offset (should be 2 or 4? is 3 a thing?)
|
||||||
|
{in: "2019-05-29T08:41-047", err: true},
|
||||||
|
//
|
||||||
|
{in: "06/May/2008 15:04:05 -0700", out: "02/Jan/2006 15:04:05 -0700"},
|
||||||
|
{in: "06/May/2008:15:04:05 -0700", out: "02/Jan/2006:15:04:05 -0700"},
|
||||||
|
{in: "14 May 2019 19:11:40.164", out: "02 Jan 2006 15:04:05.000"},
|
||||||
|
{in: "171113 14:14:20", out: "060102 15:04:05"},
|
||||||
|
|
||||||
|
{in: "oct 7, 1970", out: "Jan 2, 2006"},
|
||||||
|
{in: "sept. 7, 1970", out: "Jan. 2, 2006"},
|
||||||
|
{in: "May 05, 2015, 05:05:07", out: "Jan 02, 2006, 15:04:05"},
|
||||||
|
// 03 February 2013
|
||||||
|
{in: "03 February 2013", out: "02 January 2006"},
|
||||||
|
// 13:31:51.999 -07:00 MST
|
||||||
|
// yyyy-mm-dd hh:mm:ss +00:00
|
||||||
|
{in: "2012-08-03 18:31:59 +00:00", out: "2006-01-02 15:04:05 -07:00"},
|
||||||
|
// yyyy-mm-dd hh:mm:ss +0000 TZ
|
||||||
|
// Golang Native Format = "2006-01-02 15:04:05.999999999 -0700 MST"
|
||||||
|
{in: "2012-08-03 18:31:59 +0000 UTC", out: "2006-01-02 15:04:05 -0700 MST"},
|
||||||
|
// yyyy-mm-dd hh:mm:ss TZ
|
||||||
|
{in: "2012-08-03 18:31:59 UTC", out: "2006-01-02 15:04:05 MST"},
|
||||||
|
{in: "2012-08-03 18:31:59 CEST", out: "2006-01-02 15:04:05 MST"},
|
||||||
|
// yyyy-mm-ddThh:mm:ss-07:00
|
||||||
|
{in: "2009-08-12T22:15:09-07:00", out: "2006-01-02T15:04:05-07:00"},
|
||||||
|
// yyyy-mm-ddThh:mm:ss-0700
|
||||||
|
{in: "2009-08-12T22:15:09-0700", out: "2006-01-02T15:04:05-0700"},
|
||||||
|
// yyyy-mm-ddThh:mm:ssZ
|
||||||
|
{in: "2009-08-12T22:15Z", out: "2006-01-02T15:04Z"},
|
||||||
|
}
|
||||||
|
|
||||||
for _, th := range testParseFormat {
|
for _, th := range testParseFormat {
|
||||||
l, err := ParseFormat(th.in)
|
l, err := ParseFormat(th.in)
|
||||||
if th.err {
|
if th.err {
|
||||||
|
Loading…
Reference in New Issue
Block a user