2014-04-21 10:56:17 +08:00
package dateparse
import (
2014-04-25 08:51:56 +08:00
"fmt"
2014-04-21 10:56:17 +08:00
"testing"
"time"
2017-07-14 10:57:15 +08:00
"github.com/stretchr/testify/assert"
2014-04-21 10:56:17 +08:00
)
2018-02-28 12:05:14 +08:00
func TestOne ( t * testing . T ) {
time . Local = time . UTC
2023-02-15 13:20:46 +08:00
var ts = MustParse ( "2020-07-20+08:00" )
2021-02-07 08:14:29 +08:00
assert . Equal ( t , "2020-07-19 16:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
2018-02-28 12:05:14 +08:00
}
2018-03-11 05:43:16 +08:00
type dateTest struct {
2023-12-12 14:45:58 +08:00
in , out , loc , zname string
err bool
2023-12-12 14:46:44 +08:00
preferDayFirst bool
retryAmbiguous bool
2018-03-11 05:43:16 +08:00
}
var testInputs = [ ] dateTest {
{ in : "oct 7, 1970" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
{ in : "oct 7, '70" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
2018-03-12 05:08:21 +08:00
{ in : "Oct 7, '70" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
2018-06-09 09:01:07 +08:00
{ in : "Oct. 7, '70" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
{ in : "oct. 7, '70" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
{ in : "oct. 7, 1970" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
2018-07-11 09:51:27 +08:00
{ in : "Sept. 7, '70" , out : "1970-09-07 00:00:00 +0000 UTC" } ,
{ in : "sept. 7, 1970" , out : "1970-09-07 00:00:00 +0000 UTC" } ,
2018-03-12 05:08:21 +08:00
{ in : "Feb 8, 2009 5:57:51 AM" , out : "2009-02-08 05:57:51 +0000 UTC" } ,
{ in : "May 8, 2009 5:57:51 PM" , out : "2009-05-08 17:57:51 +0000 UTC" } ,
{ in : "May 8, 2009 5:57:1 PM" , out : "2009-05-08 17:57:01 +0000 UTC" } ,
{ in : "May 8, 2009 5:7:51 PM" , out : "2009-05-08 17:07:51 +0000 UTC" } ,
2018-11-23 05:54:48 +08:00
{ in : "May 8, 2009, 5:7:51 PM" , out : "2009-05-08 17:07:51 +0000 UTC" } ,
2018-03-11 05:43:16 +08:00
{ in : "7 oct 70" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
{ in : "7 oct 1970" , out : "1970-10-07 00:00:00 +0000 UTC" } ,
2018-10-21 03:01:51 +08:00
{ in : "7 May 1970" , out : "1970-05-07 00:00:00 +0000 UTC" } ,
{ in : "7 Sep 1970" , out : "1970-09-07 00:00:00 +0000 UTC" } ,
{ in : "7 June 1970" , out : "1970-06-07 00:00:00 +0000 UTC" } ,
{ in : "7 September 1970" , out : "1970-09-07 00:00:00 +0000 UTC" } ,
2018-03-12 05:08:21 +08:00
// ANSIC = "Mon Jan _2 15:04:05 2006"
{ in : "Mon Jan 2 15:04:05 2006" , out : "2006-01-02 15:04:05 +0000 UTC" } ,
{ in : "Thu May 8 17:57:51 2009" , out : "2009-05-08 17:57:51 +0000 UTC" } ,
{ in : "Thu May 8 17:57:51 2009" , out : "2009-05-08 17:57:51 +0000 UTC" } ,
2020-10-01 03:17:37 +08:00
// ANSIC_GLIBC = "Mon 02 Jan 2006 03:04:05 PM UTC"
2023-12-12 14:45:58 +08:00
{ in : "Mon 02 Jan 2006 03:04:05 PM UTC" , out : "2006-01-02 15:04:05 +0000 UTC" , zname : "UTC" } ,
{ in : "Mon 02 Jan 2006 03:04:05 PM CEST" , out : "2006-01-02 15:04:05 +0000 UTC" , zname : "CEST" } ,
{ in : "Mon 30 Sep 2018 09:09:09 PM UTC" , out : "2018-09-30 21:09:09 +0000 UTC" , zname : "UTC" } ,
{ in : "Mon 30 Sep 2018 09:09:09 PM CEST" , out : "2018-09-30 21:09:09 +0000 UTC" , zname : "CEST" } ,
2018-03-12 05:08:21 +08:00
// RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
{ in : "Mon Jan 02 15:04:05 -0700 2006" , out : "2006-01-02 22:04:05 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "Thu May 08 11:57:51 -0700 2009" , out : "2009-05-08 18:57:51 +0000 UTC" } ,
2018-03-12 05:08:21 +08:00
// UnixDate = "Mon Jan _2 15:04:05 MST 2006"
2023-12-12 14:45:58 +08:00
{ in : "Mon Jan 2 15:04:05 MST 2006" , out : "2006-01-02 15:04:05 +0000 UTC" , zname : "MST" } ,
{ in : "Thu May 8 17:57:51 MST 2009" , out : "2009-05-08 17:57:51 +0000 UTC" , zname : "MST" } ,
{ in : "Thu May 8 17:57:51 PST 2009" , out : "2009-05-08 17:57:51 +0000 UTC" , zname : "PST" } ,
{ in : "Thu May 08 17:57:51 PST 2009" , out : "2009-05-08 17:57:51 +0000 UTC" , zname : "PST" } ,
{ in : "Thu May 08 17:57:51 CEST 2009" , out : "2009-05-08 17:57:51 +0000 UTC" , zname : "CEST" } ,
{ in : "Thu May 08 17:57:51 CEST 2009" , out : "2009-05-08 15:57:51 +0000 UTC" , loc : "Europe/Berlin" } ,
{ in : "Thu May 08 05:05:07 PST 2009" , out : "2009-05-08 05:05:07 +0000 UTC" , zname : "PST" } ,
{ in : "Thu May 08 5:5:7 PST 2009" , out : "2009-05-08 05:05:07 +0000 UTC" , zname : "PST" } ,
2018-11-23 05:54:48 +08:00
// Day Month dd time
2023-12-12 14:45:58 +08:00
{ in : "Mon Aug 10 15:44:11 UTC+0000 2015" , out : "2015-08-10 15:44:11 +0000 UTC" , zname : "UTC" } ,
{ in : "Mon Aug 10 15:44:11 PST-0700 2015" , out : "2015-08-10 22:44:11 +0000 UTC" , zname : "PST" } ,
{ in : "Mon Aug 10 15:44:11 CEST+0200 2015" , out : "2015-08-10 13:44:11 +0000 UTC" , zname : "CEST" } ,
{ in : "Mon Aug 1 15:44:11 CEST+0200 2015" , out : "2015-08-01 13:44:11 +0000 UTC" , zname : "CEST" } ,
{ in : "Mon Aug 1 5:44:11 CEST+0200 2015" , out : "2015-08-01 03:44:11 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
// ??
{ in : "Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)" , out : "2015-07-03 17:04:07 +0000 UTC" } ,
{ in : "Fri Jul 3 2015 06:04:07 GMT+0100 (GMT Daylight Time)" , out : "2015-07-03 05:04:07 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "Fri Jul 3 2015 06:04:07 PST-0700 (Pacific Daylight Time)" , out : "2015-07-03 13:04:07 +0000 UTC" , zname : "PST" } ,
{ in : "Fri Jul 3 2015 06:04:07 CEST-0700 (Central European Summer Time)" , out : "2015-07-03 13:04:07 +0000 UTC" , zname : "CEST" } ,
2018-11-23 05:54:48 +08:00
// Month dd, yyyy at time
2023-12-12 14:45:58 +08:00
{ in : "January 17, 2012 at 18:17:16" , out : "2012-01-17 18:17:16 +0000 UTC" } ,
{ in : "February 17, 2012 at 18:17:16" , out : "2012-02-17 18:17:16 +0000 UTC" } ,
{ in : "march 17, 2012 at 18:17:16" , out : "2012-03-17 18:17:16 +0000 UTC" } ,
{ in : "APRIL 17, 2012 at 18:17:16" , out : "2012-04-17 18:17:16 +0000 UTC" } ,
{ in : "May 17, 2012 at 18:17:16" , out : "2012-05-17 18:17:16 +0000 UTC" } ,
{ in : "June 17, 2012 at 18:17:16" , out : "2012-06-17 18:17:16 +0000 UTC" } ,
{ in : "July 17, 2012 at 18:17:16" , out : "2012-07-17 18:17:16 +0000 UTC" } ,
{ in : "august 17, 2012 at 18:17:16" , out : "2012-08-17 18:17:16 +0000 UTC" } ,
{ in : "September 17, 2012 at 18:17:16" , out : "2012-09-17 18:17:16 +0000 UTC" } ,
{ in : "OCTober 17, 2012 at 18:17:16" , out : "2012-10-17 18:17:16 +0000 UTC" } ,
{ in : "noVEMBER 17, 2012 at 18:17:16" , out : "2012-11-17 18:17:16 +0000 UTC" } ,
{ in : "December 17, 2012 at 18:17:16" , out : "2012-12-17 18:17:16 +0000 UTC" } ,
{ in : "September 17, 2012 at 5:00pm UTC-05" , out : "2012-09-17 17:00:00 +0000 UTC" , zname : "UTC" } ,
{ in : "September 17, 2012 at 10:09am PST-08" , out : "2012-09-17 18:09:00 +0000 UTC" , zname : "PST" } ,
{ in : "September 17, 2012 at 10:09am CEST+02" , out : "2012-09-17 08:09:00 +0000 UTC" , zname : "CEST" } ,
2018-11-23 05:54:48 +08:00
{ in : "September 17, 2012, 10:10:09" , out : "2012-09-17 10:10:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "May 17, 2012 at 10:09am PST-08" , out : "2012-05-17 18:09:00 +0000 UTC" , zname : "PST" } ,
{ in : "May 17, 2012 AT 10:09am PST-08" , out : "2012-05-17 18:09:00 +0000 UTC" , zname : "PST" } ,
{ in : "May 17, 2012 AT 10:09am CEST+02" , out : "2012-05-17 08:09:00 +0000 UTC" , zname : "CEST" } ,
2018-11-23 05:54:48 +08:00
// Month dd, yyyy time
2023-12-12 14:45:58 +08:00
{ in : "September 17, 2012 5:00pm UTC-05" , out : "2012-09-17 17:00:00 +0000 UTC" , zname : "UTC" } ,
{ in : "September 17, 2012 10:09am PST-08" , out : "2012-09-17 18:09:00 +0000 UTC" , zname : "PST" } ,
{ in : "September 17, 2012 10:09am CEST+02" , out : "2012-09-17 08:09:00 +0000 UTC" , zname : "CEST" } ,
2018-11-23 05:54:48 +08:00
{ in : "September 17, 2012 09:01:00" , out : "2012-09-17 09:01:00 +0000 UTC" } ,
// Month dd yyyy time
2023-12-12 14:45:58 +08:00
{ in : "September 17 2012 5:00pm UTC-05" , out : "2012-09-17 17:00:00 +0000 UTC" , zname : "UTC" } ,
{ in : "September 17 2012 5:00pm UTC-0500" , out : "2012-09-17 17:00:00 +0000 UTC" , zname : "UTC" } ,
{ in : "September 17 2012 10:09am PST-08" , out : "2012-09-17 18:09:00 +0000 UTC" , zname : "PST" } ,
{ in : "September 17 2012 10:09am CEST+02" , out : "2012-09-17 08:09:00 +0000 UTC" , zname : "CEST" } ,
{ in : "September 17 2012 5:00PM UTC-05" , out : "2012-09-17 17:00:00 +0000 UTC" , zname : "UTC" } ,
{ in : "September 17 2012 10:09AM PST-08" , out : "2012-09-17 18:09:00 +0000 UTC" , zname : "PST" } ,
{ in : "September 17 2012 10:09AM CEST+02" , out : "2012-09-17 08:09:00 +0000 UTC" , zname : "CEST" } ,
2018-11-23 05:54:48 +08:00
{ in : "September 17 2012 09:01:00" , out : "2012-09-17 09:01:00 +0000 UTC" } ,
{ in : "May 17, 2012 10:10:09" , out : "2012-05-17 10:10:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "July 30 2022 08:33:53 AM PST" , out : "2022-07-30 08:33:53 +0000 UTC" , zname : "PST" } ,
{ in : "July 30 2022 08:33:53 AM CEST" , out : "2022-07-30 08:33:53 +0000 UTC" , zname : "CEST" } ,
{ in : "July 30 2022 08:33:53 PM PST" , out : "2022-07-30 20:33:53 +0000 UTC" , zname : "PST" } ,
{ in : "July 30 2022 08:33:53 PM CEST" , out : "2022-07-30 20:33:53 +0000 UTC" , zname : "CEST" } ,
2018-06-06 09:01:57 +08:00
// Month dd, yyyy
2018-05-24 12:11:15 +08:00
{ in : "September 17, 2012" , out : "2012-09-17 00:00:00 +0000 UTC" } ,
{ in : "May 7, 2012" , out : "2012-05-07 00:00:00 +0000 UTC" } ,
2018-06-06 09:01:57 +08:00
{ in : "June 7, 2012" , out : "2012-06-07 00:00:00 +0000 UTC" } ,
2018-11-23 05:54:48 +08:00
{ in : "June 7 2012" , out : "2012-06-07 00:00:00 +0000 UTC" } ,
2018-11-24 01:12:28 +08:00
// Month dd[th,nd,st,rd] yyyy
2018-11-23 05:54:48 +08:00
{ in : "September 17th, 2012" , out : "2012-09-17 00:00:00 +0000 UTC" } ,
{ in : "September 17th 2012" , out : "2012-09-17 00:00:00 +0000 UTC" } ,
{ in : "September 7th, 2012" , out : "2012-09-07 00:00:00 +0000 UTC" } ,
{ in : "September 7th 2012" , out : "2012-09-07 00:00:00 +0000 UTC" } ,
2019-04-26 07:42:47 +08:00
{ in : "September 7tH 2012" , out : "2012-09-07 00:00:00 +0000 UTC" } ,
2018-11-23 05:54:48 +08:00
{ in : "May 1st 2012" , out : "2012-05-01 00:00:00 +0000 UTC" } ,
{ in : "May 1st, 2012" , out : "2012-05-01 00:00:00 +0000 UTC" } ,
{ in : "May 21st 2012" , out : "2012-05-21 00:00:00 +0000 UTC" } ,
{ in : "May 21st, 2012" , out : "2012-05-21 00:00:00 +0000 UTC" } ,
2018-11-24 01:12:28 +08:00
{ in : "May 23rd 2012" , out : "2012-05-23 00:00:00 +0000 UTC" } ,
{ in : "May 23rd, 2012" , out : "2012-05-23 00:00:00 +0000 UTC" } ,
2018-11-23 05:54:48 +08:00
{ 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" } ,
2023-12-13 11:18:58 +08:00
// Incorporate PR https://github.com/araddon/dateparse/pull/128 to fix https://github.com/araddon/dateparse/issues/127
// dd[th,nd,st,rd] Month yyyy
{ in : "1st September 2012" , out : "2012-09-01 00:00:00 +0000 UTC" } ,
{ in : "2nd September 2012" , out : "2012-09-02 00:00:00 +0000 UTC" } ,
{ in : "3rd September 2012" , out : "2012-09-03 00:00:00 +0000 UTC" } ,
{ in : "4th September 2012" , out : "2012-09-04 00:00:00 +0000 UTC" } ,
{ in : "2nd January 2018" , out : "2018-01-02 00:00:00 +0000 UTC" } ,
{ in : "3nd Feb 2018 13:58:24" , out : "2018-02-03 13:58:24 +0000 UTC" } ,
2021-02-07 07:23:24 +08:00
// RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
2023-12-12 14:45:58 +08:00
{ in : "Fri, 03 Jul 2015 08:08:08 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 03 Jul 2015 08:08:08 CET" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CET" } ,
2021-02-07 07:23:24 +08:00
{ in : "Fri, 03 Jul 2015 08:08:08 PST" , out : "2015-07-03 16:08:08 +0000 UTC" , loc : "America/Los_Angeles" } ,
2023-12-12 14:45:58 +08:00
{ in : "Fri, 03 Jul 2015 08:08:08 PST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "PST" } ,
{ in : "Fri, 03 Jul 2015 08:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
{ in : "Fri, 3 Jul 2015 08:08:08 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 3 Jul 2015 08:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
{ in : "Fri, 03 Jul 2015 8:08:08 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 03 Jul 2015 8:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
{ in : "Fri, 03 Jul 2015 8:8:8 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 03 Jul 2015 8:8:8 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
// ?
{ in : "Thu, 03 Jul 2017 08:08:04 +0100" , out : "2017-07-03 07:08:04 +0000 UTC" } ,
{ in : "Thu, 03 Jul 2017 08:08:04 -0100" , out : "2017-07-03 09:08:04 +0000 UTC" } ,
{ in : "Thu, 3 Jul 2017 08:08:04 +0100" , out : "2017-07-03 07:08:04 +0000 UTC" } ,
{ in : "Thu, 03 Jul 2017 8:08:04 +0100" , out : "2017-07-03 07:08:04 +0000 UTC" } ,
{ in : "Thu, 03 Jul 2017 8:8:4 +0100" , out : "2017-07-03 07:08:04 +0000 UTC" } ,
//
{ in : "Tue, 11 Jul 2017 04:08:03 +0200 (CEST)" , out : "2017-07-11 02:08:03 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "Tue, 5 Jul 2017 04:08:03 -0700 (MST)" , out : "2017-07-05 11:08:03 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ 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
2023-12-12 14:45:58 +08:00
{ in : "Fri, 03-Jul-15 08:08:08 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 03-Jul-15 08:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
2021-02-07 07:23:24 +08:00
{ in : "Fri, 03-Jul-15 08:08:08 PST" , out : "2015-07-03 16:08:08 +0000 UTC" , loc : "America/Los_Angeles" } ,
2023-12-12 14:45:58 +08:00
{ in : "Fri, 03-Jul 2015 08:08:08 PST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "PST" } ,
{ in : "Fri, 03-Jul 2015 08:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
{ in : "Fri, 3-Jul-15 08:08:08 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 3-Jul-15 08:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
{ in : "Fri, 03-Jul-15 8:08:08 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 03-Jul-15 8:08:08 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
{ in : "Fri, 03-Jul-15 8:8:8 MST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "MST" } ,
{ in : "Fri, 03-Jul-15 8:8:8 CEST" , out : "2015-07-03 08:08:08 +0000 UTC" , zname : "CEST" } ,
2021-02-06 05:44:33 +08:00
// 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" } ,
2018-03-12 08:39:59 +08:00
// RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
2023-12-12 14:45:58 +08:00
{ in : "Wednesday, 07-May-09 08:00:43 MST" , out : "2009-05-07 08:00:43 +0000 UTC" , zname : "MST" } ,
{ in : "Wednesday, 07-May-09 08:00:43 CEST" , out : "2009-05-07 08:00:43 +0000 UTC" , zname : "CEST" } ,
{ in : "Wednesday, 28-Feb-18 09:01:00 MST" , out : "2018-02-28 09:01:00 +0000 UTC" , zname : "MST" } ,
2018-03-12 08:39:59 +08:00
{ in : "Wednesday, 28-Feb-18 09:01:00 MST" , out : "2018-02-28 16:01:00 +0000 UTC" , loc : "America/Denver" } ,
2023-12-12 14:45:58 +08:00
{ in : "Wednesday, 28-Feb-18 09:01:00 CEST" , out : "2018-02-28 09:01:00 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
// with offset then with variations on non-zero filled stuff
{ in : "Monday, 02 Jan 2006 15:04:05 +0100" , out : "2006-01-02 14:04:05 +0000 UTC" } ,
{ in : "Wednesday, 28 Feb 2018 09:01:00 -0300" , out : "2018-02-28 12:01:00 +0000 UTC" } ,
{ in : "Wednesday, 2 Feb 2018 09:01:00 -0300" , out : "2018-02-02 12:01:00 +0000 UTC" } ,
{ in : "Wednesday, 2 Feb 2018 9:01:00 -0300" , out : "2018-02-02 12:01:00 +0000 UTC" } ,
{ in : "Wednesday, 2 Feb 2018 09:1:00 -0300" , out : "2018-02-02 12:01:00 +0000 UTC" } ,
2018-10-10 11:50:09 +08:00
// dd mon yyyy 12 Feb 2006, 19:17:08
2018-03-12 08:39:59 +08:00
{ in : "07 Feb 2004, 09:07" , out : "2004-02-07 09:07:00 +0000 UTC" } ,
{ in : "07 Feb 2004, 09:07:07" , out : "2004-02-07 09:07:07 +0000 UTC" } ,
{ in : "7 Feb 2004, 09:07:07" , out : "2004-02-07 09:07:07 +0000 UTC" } ,
{ in : "07 Feb 2004, 9:7:7" , out : "2004-02-07 09:07:07 +0000 UTC" } ,
2018-10-10 11:50:09 +08:00
// dd Mon yyyy hh:mm:ss
2018-03-12 10:00:26 +08:00
{ in : "07 Feb 2004 09:07:08" , out : "2004-02-07 09:07:08 +0000 UTC" } ,
{ in : "07 Feb 2004 09:07" , out : "2004-02-07 09:07:00 +0000 UTC" } ,
{ in : "7 Feb 2004 9:7:8" , out : "2004-02-07 09:07:08 +0000 UTC" } ,
{ in : "07 Feb 2004 09:07:08.123" , out : "2004-02-07 09:07:08.123 +0000 UTC" } ,
2018-10-10 11:50:09 +08:00
// dd-mon-yyyy 12 Feb 2006, 19:17:08 GMT
2023-12-12 14:45:58 +08:00
{ in : "07 Feb 2004, 09:07:07 GMT" , out : "2004-02-07 09:07:07 +0000 UTC" , zname : "GMT" } ,
{ in : "07 Feb 2004, 09:07:07 CEST" , out : "2004-02-07 09:07:07 +0000 UTC" , zname : "CEST" } ,
2018-10-10 11:50:09 +08:00
// dd-mon-yyyy 12 Feb 2006, 19:17:08 +0100
2018-03-12 08:39:59 +08:00
{ in : "07 Feb 2004, 09:07:07 +0100" , out : "2004-02-07 08:07:07 +0000 UTC" } ,
2018-10-10 11:50:09 +08:00
// dd-mon-yyyy 12-Feb-2006 19:17:08
{ in : "07-Feb-2004 09:07:07 +0100" , out : "2004-02-07 08:07:07 +0000 UTC" } ,
// dd-mon-yy 12-Feb-2006 19:17:08
{ in : "07-Feb-04 09:07:07 +0100" , out : "2004-02-07 08:07:07 +0000 UTC" } ,
// yyyy-mon-dd 2013-Feb-03
2018-03-12 08:39:59 +08:00
{ in : "2013-Feb-03" , out : "2013-02-03 00:00:00 +0000 UTC" } ,
// 03 February 2013
{ in : "03 February 2013" , out : "2013-02-03 00:00:00 +0000 UTC" } ,
{ in : "3 February 2013" , out : "2013-02-03 00:00:00 +0000 UTC" } ,
// Chinese 2014年04月18日
{ in : "2014年04月08日" , out : "2014-04-08 00:00:00 +0000 UTC" } ,
{ in : "2014年04月08日 19:17:22" , out : "2014-04-08 19:17:22 +0000 UTC" } ,
// mm/dd/yyyy
{ in : "03/31/2014" , out : "2014-03-31 00:00:00 +0000 UTC" } ,
{ in : "3/31/2014" , out : "2014-03-31 00:00:00 +0000 UTC" } ,
{ in : "3/5/2014" , out : "2014-03-05 00:00:00 +0000 UTC" } ,
// mm/dd/yy
{ in : "08/08/71" , out : "1971-08-08 00:00:00 +0000 UTC" } ,
{ in : "8/8/71" , out : "1971-08-08 00:00:00 +0000 UTC" } ,
// mm/dd/yy hh:mm:ss
{ in : "04/02/2014 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "4/2/2014 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "04/02/2014 4:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "04/02/2014 4:8:9" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "04/02/2014 04:08" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "04/02/2014 4:8" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "04/02/2014 04:08:09.123" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
{ in : "04/02/2014 04:08:09.12312" , out : "2014-04-02 04:08:09.12312 +0000 UTC" } ,
{ in : "04/02/2014 04:08:09.123123" , out : "2014-04-02 04:08:09.123123 +0000 UTC" } ,
2020-06-18 04:55:25 +08:00
// mm:dd:yy hh:mm:ss
{ in : "04:02:2014 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "4:2:2014 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "04:02:2014 4:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "04:02:2014 4:8:9" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "04:02:2014 04:08" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "04:02:2014 4:8" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "04:02:2014 04:08:09.123" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
{ in : "04:02:2014 04:08:09.12312" , out : "2014-04-02 04:08:09.12312 +0000 UTC" } ,
{ in : "04:02:2014 04:08:09.123123" , out : "2014-04-02 04:08:09.123123 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
// mm/dd/yy hh:mm:ss AM
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08:09am" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 04:08:09 AM" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08:09AM PST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "04/02/2014 04:08:09 AM PST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "04/02/2014 04:08:09AM CEST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "CEST" } ,
{ in : "04/02/2014 04:08:09 AM CEST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "CEST" } ,
{ in : "04/02/2014 04:08:09pm" , out : "2014-04-02 16:08:09 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 04:08:09 PM" , out : "2014-04-02 16:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08:09PM PST" , out : "2014-04-02 16:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "04/02/2014 04:08:09 PM PST" , out : "2014-04-02 16:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "04/02/2014 04:08:09pm CEST" , out : "2014-04-02 16:08:09 +0000 UTC" , zname : "CEST" } ,
{ in : "04/02/2014 04:08:09 PM CEST" , out : "2014-04-02 16:08:09 +0000 UTC" , zname : "CEST" } ,
{ in : "04/02/2014 04:08am" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 04:08 AM" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08pm" , out : "2014-04-02 16:08:00 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 04:08 PM" , out : "2014-04-02 16:08:00 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 4:8AM" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 4:8 AM" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 4:8pm" , out : "2014-04-02 16:08:00 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 4:8 PM" , out : "2014-04-02 16:08:00 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08:09.123am" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 04:08:09.123 AM" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08:09.123PM" , out : "2014-04-02 16:08:09.123 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "04/02/2014 04:08:09.123 PM" , out : "2014-04-02 16:08:09.123 +0000 UTC" } ,
// yyyy/mm/dd
{ 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/4/2" , out : "2014-04-02 00:00:00 +0000 UTC" } ,
// yyyy/mm/dd hh:mm:ss AM
{ in : "2014/04/02 04:08" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "2014/03/31 04:08" , out : "2014-03-31 04:08:00 +0000 UTC" } ,
{ in : "2014/4/2 04:08" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "2014/04/02 4:8" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "2014/04/02 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "2014/03/31 04:08:09" , out : "2014-03-31 04:08:09 +0000 UTC" } ,
{ in : "2014/4/2 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "2014/04/02 04:08:09.123" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
{ in : "2014/04/02 04:08:09.123123" , out : "2014-04-02 04:08:09.123123 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014/04/02 04:08:09am" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014/04/02 04:08:09 AM" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014/03/31 04:08:09am" , out : "2014-03-31 04:08:09 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014/03/31 04:08:09 AM" , out : "2014-03-31 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014/4/2 04:08:09AM" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014/4/2 04:08:09 AM" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014/04/02 04:08:09.123am" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014/04/02 04:08:09.123 AM" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014/04/02 04:08:09.123am PST" , out : "2014-04-02 04:08:09.123 +0000 UTC" , zname : "PST" } ,
{ in : "2014/04/02 04:08:09.123 AM PST" , out : "2014-04-02 04:08:09.123 +0000 UTC" , zname : "PST" } ,
{ in : "2014/04/02 04:08:09.123AM CEST" , out : "2014-04-02 04:08:09.123 +0000 UTC" , zname : "CEST" } ,
{ in : "2014/04/02 04:08:09.123 AM CEST" , out : "2014-04-02 04:08:09.123 +0000 UTC" , zname : "CEST" } ,
{ in : "2014/04/02 04:08:09.123pm" , out : "2014-04-02 16:08:09.123 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014/04/02 04:08:09.123 PM" , out : "2014-04-02 16:08:09.123 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014/04/02 04:08:09.123PM PST" , out : "2014-04-02 16:08:09.123 +0000 UTC" , zname : "PST" } ,
{ in : "2014/04/02 04:08:09.123 PM PST" , out : "2014-04-02 16:08:09.123 +0000 UTC" , zname : "PST" } ,
{ in : "2014/04/02 04:08:09.123PM CEST" , out : "2014-04-02 16:08:09.123 +0000 UTC" , zname : "CEST" } ,
{ in : "2014/04/02 04:08:09.123 PM CEST" , out : "2014-04-02 16:08:09.123 +0000 UTC" , zname : "CEST" } ,
2021-02-06 05:44:33 +08:00
// 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" "-"
2021-02-06 05:11:38 +08:00
{ 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" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm-dd
{ 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-4-2" , out : "2014-04-02 00:00:00 +0000 UTC" } ,
2021-02-07 08:14:29 +08:00
// 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" } ,
2019-06-20 01:28:39 +08:00
// dd-mmm-yy
{ 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" } ,
2019-06-20 03:53:12 +08:00
{ in : "15-Jan-2017" , out : "2017-01-15 00:00:00 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm
{ in : "2014-04" , out : "2014-04-01 00:00:00 +0000 UTC" } ,
// yyyy-mm-dd hh:mm:ss AM
{ in : "2014-04-02 04:08" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "2014-03-31 04:08" , out : "2014-03-31 04:08:00 +0000 UTC" } ,
{ in : "2014-4-2 04:08" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "2014-04-02 4:8" , out : "2014-04-02 04:08:00 +0000 UTC" } ,
{ in : "2014-04-02 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "2014-03-31 04:08:09" , out : "2014-03-31 04:08:09 +0000 UTC" } ,
{ in : "2014-4-2 04:08:09" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
{ in : "2014-04-02 04:08:09.123" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
{ in : "2014-04-02 04:08:09.123123" , out : "2014-04-02 04:08:09.123123 +0000 UTC" } ,
{ in : "2014-04-02 04:08:09.12312312" , out : "2014-04-02 04:08:09.12312312 +0000 UTC" } ,
{ in : "2014-04-02 04:08:09 AM" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014-04-02 04:08:09 AM PST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "2014-04-02 04:08:09 AM CEST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014-03-31 04:08:09 AM" , out : "2014-03-31 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014-03-31 04:08:09 AM PST" , out : "2014-03-31 04:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "2014-03-31 04:08:09 AM CEST" , out : "2014-03-31 04:08:09 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014-04-26 05:24:37 PM" , out : "2014-04-26 17:24:37 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014-04-26 05:24:37 PM PST" , out : "2014-04-26 17:24:37 +0000 UTC" , zname : "PST" } ,
{ in : "2014-04-26 05:24:37 PM CEST" , out : "2014-04-26 17:24:37 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014-4-2 04:08:09 AM" , out : "2014-04-02 04:08:09 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014-4-2 04:08:09 AM PST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "PST" } ,
{ in : "2014-4-2 04:08:09 AM CEST" , out : "2014-04-02 04:08:09 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014-04-02 04:08:09.123 AM" , out : "2014-04-02 04:08:09.123 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014-04-02 04:08:09.123 AM PST" , out : "2014-04-02 04:08:09.123 +0000 UTC" , zname : "PST" } ,
{ in : "2014-04-02 04:08:09.123 AM CEST" , out : "2014-04-02 04:08:09.123 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
{ in : "2014-04-02 04:08:09.123 PM" , out : "2014-04-02 16:08:09.123 +0000 UTC" } ,
2023-12-12 14:45:58 +08:00
{ in : "2014-04-02 04:08:09.123 PM PST" , out : "2014-04-02 16:08:09.123 +0000 UTC" , zname : "PST" } ,
{ in : "2014-04-02 04:08:09.123 PM CEST" , out : "2014-04-02 16:08:09.123 +0000 UTC" , zname : "CEST" } ,
// https://github.com/araddon/dateparse/issues/150
{ in : "2023-01-04 12:01am" , out : "2023-01-04 00:01:00 +0000 UTC" } ,
{ in : "2023-01-04 12:01 AM" , out : "2023-01-04 00:01:00 +0000 UTC" } ,
{ in : "2023-01-04 12:01:59 AM" , out : "2023-01-04 00:01:59 +0000 UTC" } ,
{ in : "2023-01-04 12:01:59.765 AM" , out : "2023-01-04 00:01:59.765 +0000 UTC" } ,
// https://github.com/araddon/dateparse/issues/157
{ in : "Thu Jan 28 2021 15:28:21 GMT+0000 (Coordinated Universal Time)" , out : "2021-01-28 15:28:21 +0000 UTC" } ,
{ in : "Thu Jan 28 2021 15:28:21 GMT+0100 (Coordinated Universal Time)" , out : "2021-01-28 14:28:21 +0000 UTC" } ,
// https://github.com/araddon/dateparse/issues/130
{ in : "1985-04-12T23:20:50Z" , out : "1985-04-12 23:20:50 +0000 UTC" } ,
{ in : "1985-04-12T23:20:50.52Z" , out : "1985-04-12 23:20:50.52 +0000 UTC" } ,
// https://github.com/araddon/dateparse/issues/123
{ in : "2017-04-03 22:32:14.322 CET" , out : "2017-04-03 22:32:14.322 +0000 UTC" , zname : "CET" } ,
{ in : "2017-04-03 22:32:14 CET" , out : "2017-04-03 22:32:14 +0000 UTC" , zname : "CET" } ,
{ in : "Mon Dec 26 16:22:08 2016" , out : "2016-12-26 16:22:08 +0000 UTC" } ,
{ in : "Mon Dec 26 16:15:55.103786 2016" , out : "2016-12-26 16:15:55.103786 +0000 UTC" } ,
// https://github.com/araddon/dateparse/issues/109
{ in : "Sun, 07 Jun 2020 00:00:00 +0100" , out : "2020-06-06 23:00:00 +0000 UTC" } ,
// https://github.com/araddon/dateparse/issues/100#issuecomment-1118868154
{ in : "1 Apr 2022 23:59" , out : "2022-04-01 23:59:00 +0000 UTC" } ,
{ in : "1 JANuary 2022 23:59" , out : "2022-01-01 23:59:00 +0000 UTC" } ,
{ in : "1 february 2022 23:59" , out : "2022-02-01 23:59:00 +0000 UTC" } ,
{ in : "1 marCH 2022 23:59" , out : "2022-03-01 23:59:00 +0000 UTC" } ,
{ in : "1 April 2022 23:59" , out : "2022-04-01 23:59:00 +0000 UTC" } ,
{ in : "1 May 2022 23:59" , out : "2022-05-01 23:59:00 +0000 UTC" } ,
{ in : "1 JuNe 2022 23:59" , out : "2022-06-01 23:59:00 +0000 UTC" } ,
{ in : "1 JULY 2022 23:59" , out : "2022-07-01 23:59:00 +0000 UTC" } ,
{ in : "1 august 2022 23:59" , out : "2022-08-01 23:59:00 +0000 UTC" } ,
{ in : "1 September 2022 23:59" , out : "2022-09-01 23:59:00 +0000 UTC" } ,
{ in : "1 October 2022 23:59" , out : "2022-10-01 23:59:00 +0000 UTC" } ,
{ in : "1 November 2022 23:59" , out : "2022-11-01 23:59:00 +0000 UTC" } ,
{ in : "1 December 2022 23:59" , out : "2022-12-01 23:59:00 +0000 UTC" } ,
2023-12-13 08:42:09 +08:00
// https://github.com/araddon/dateparse/issues/149
{ in : "2018-09-30 21:09:13 PMDT" , out : "2018-09-30 21:09:13 +0000 UTC" , zname : "PMDT" } ,
{ in : "2018-09-30 08:09:13 PM PMDT" , out : "2018-09-30 20:09:13 +0000 UTC" , zname : "PMDT" } ,
{ in : "2018-09-30 08:09:13pm PMDT" , out : "2018-09-30 20:09:13 +0000 UTC" , zname : "PMDT" } ,
{ in : "2018-09-30 21:09:13.123 PMDT" , out : "2018-09-30 21:09:13.123 +0000 UTC" , zname : "PMDT" } ,
{ in : "2018-09-30 08:09:13.123 PM PMDT" , out : "2018-09-30 20:09:13.123 +0000 UTC" , zname : "PMDT" } ,
{ in : "2018-09-30 08:09:13.123pm PMDT" , out : "2018-09-30 20:09:13.123 +0000 UTC" , zname : "PMDT" } ,
{ in : "2018-09-30 21:09:13 AMT" , out : "2018-09-30 21:09:13 +0000 UTC" , zname : "AMT" } ,
{ in : "2018-09-30 08:09:13 AM AMT" , out : "2018-09-30 08:09:13 +0000 UTC" , zname : "AMT" } ,
{ in : "2018-09-30 08:09:13am AMT" , out : "2018-09-30 08:09:13 +0000 UTC" , zname : "AMT" } ,
{ in : "2018-09-30 21:09:13.123 AMT" , out : "2018-09-30 21:09:13.123 +0000 UTC" , zname : "AMT" } ,
{ in : "2018-09-30 08:09:13.123 am AMT" , out : "2018-09-30 08:09:13.123 +0000 UTC" , zname : "AMT" } ,
{ in : "2018-09-30 08:09:13.123am AMT" , out : "2018-09-30 08:09:13.123 +0000 UTC" , zname : "AMT" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm-dd hh:mm:ss,000
{ in : "2014-05-11 08:20:13,787" , out : "2014-05-11 08:20:13.787 +0000 UTC" } ,
// yyyy-mm-dd hh:mm:ss +0000
{ in : "2012-08-03 18:31:59 +0000" , out : "2012-08-03 18:31:59 +0000 UTC" } ,
{ in : "2012-08-03 13:31:59 -0600" , out : "2012-08-03 19:31:59 +0000 UTC" } ,
{ in : "2012-08-03 18:31:59.257000000 +0000" , out : "2012-08-03 18:31:59.257 +0000 UTC" } ,
{ in : "2012-08-03 8:1:59.257000000 +0000" , out : "2012-08-03 08:01:59.257 +0000 UTC" } ,
{ in : "2012-8-03 18:31:59.257000000 +0000" , out : "2012-08-03 18:31:59.257 +0000 UTC" } ,
{ in : "2012-8-3 18:31:59.257000000 +0000" , out : "2012-08-03 18:31:59.257 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.123456 +0000" , out : "2014-04-26 17:24:37.123456 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.12 +0000" , out : "2014-04-26 17:24:37.12 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.1 +0000" , out : "2014-04-26 17:24:37.1 +0000 UTC" } ,
{ in : "2014-05-11 08:20:13 +0000" , out : "2014-05-11 08:20:13 +0000 UTC" } ,
2018-04-06 21:57:28 +08:00
{ in : "2014-05-11 08:20:13 +0530" , out : "2014-05-11 02:50:13 +0000 UTC" } ,
2018-07-01 01:20:13 +08:00
// yyyy-mm-dd hh:mm:ss +0300 +03 ?? issue author said this is from golang?
{ in : "2018-06-29 19:09:57.77297118 +0300 +03" , out : "2018-06-29 16:09:57.77297118 +0000 UTC" } ,
{ in : "2018-06-29 19:09:57.77297118 +0300 +0300" , out : "2018-06-29 16:09:57.77297118 +0000 UTC" } ,
{ in : "2018-06-29 19:09:57 +0300 +03" , out : "2018-06-29 16:09:57 +0000 UTC" } ,
{ in : "2018-06-29 19:09:57 +0300 +0300" , out : "2018-06-29 16:09:57 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
// 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 : "2012-08-03 18:31:59 +0000 UTC" } ,
{ in : "2014-05-01 08:02:13 +00:00" , out : "2014-05-01 08:02:13 +0000 UTC" } ,
{ in : "2014-5-01 08:02:13 +00:00" , out : "2014-05-01 08:02:13 +0000 UTC" } ,
{ in : "2014-05-1 08:02:13 +00:00" , out : "2014-05-01 08:02:13 +0000 UTC" } ,
{ in : "2012-08-03 13:31:59 -06:00" , out : "2012-08-03 19:31:59 +0000 UTC" } ,
{ in : "2012-08-03 18:31:59.257000000 +00:00" , out : "2012-08-03 18:31:59.257 +0000 UTC" } ,
{ in : "2012-08-03 8:1:59.257000000 +00:00" , out : "2012-08-03 08:01:59.257 +0000 UTC" } ,
{ in : "2012-8-03 18:31:59.257000000 +00:00" , out : "2012-08-03 18:31:59.257 +0000 UTC" } ,
{ in : "2012-8-3 18:31:59.257000000 +00:00" , out : "2012-08-03 18:31:59.257 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.123456 +00:00" , out : "2014-04-26 17:24:37.123456 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.12 +00:00" , out : "2014-04-26 17:24:37.12 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.1 +00:00" , out : "2014-04-26 17:24:37.1 +0000 UTC" } ,
// yyyy-mm-dd hh:mm:ss +0000 TZ
// Golang Native Format
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 18:31:59 +0000 UTC" , out : "2012-08-03 18:31:59 +0000 UTC" , zname : "UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2012-08-03 13:31:59 -0600 MST" , out : "2012-08-03 19:31:59 +0000 UTC" , loc : "America/Denver" } ,
2023-12-12 14:45:58 +08:00
{ in : "2015-02-18 00:12:00 +0000 UTC" , out : "2015-02-18 00:12:00 +0000 UTC" , zname : "UTC" } ,
{ in : "2015-02-18 00:12:00 +0000 GMT" , out : "2015-02-18 00:12:00 +0000 UTC" , zname : "GMT" } ,
2018-03-12 08:39:59 +08:00
{ in : "2015-02-08 03:02:00 +0200 CEST" , out : "2015-02-08 01:02:00 +0000 UTC" , loc : "Europe/Berlin" } ,
2023-12-12 14:45:58 +08:00
{ in : "2015-02-08 03:02:00 +0300 MSK" , out : "2015-02-08 00:02:00 +0000 UTC" , zname : "MSK" } ,
{ in : "2015-2-08 03:02:00 +0300 MSK" , out : "2015-02-08 00:02:00 +0000 UTC" , zname : "MSK" } ,
{ in : "2015-02-8 03:02:00 +0300 MSK" , out : "2015-02-08 00:02:00 +0000 UTC" , zname : "MSK" } ,
{ in : "2015-2-8 03:02:00 +0300 MSK" , out : "2015-02-08 00:02:00 +0000 UTC" , zname : "MSK" } ,
{ in : "2012-08-03 18:31:59.257000000 +0000 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-08-03 8:1:59.257000000 +0000 UTC" , out : "2012-08-03 08:01:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-03 18:31:59.257000000 +0000 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-3 18:31:59.257000000 +0000 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.123456 +0000 UTC" , out : "2014-04-26 17:24:37.123456 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.12 +0000 UTC" , out : "2014-04-26 17:24:37.12 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.1 +0000 UTC" , out : "2014-04-26 17:24:37.1 +0000 UTC" , zname : "UTC" } ,
2018-04-18 05:16:01 +08:00
{ in : "2015-02-08 03:02:00 +0200 CEST m=+0.000000001" , out : "2015-02-08 01:02:00 +0000 UTC" , loc : "Europe/Berlin" } ,
2023-12-12 14:45:58 +08:00
{ in : "2015-02-08 03:02:00 +0300 MSK m=+0.000000001" , out : "2015-02-08 00:02:00 +0000 UTC" , zname : "MSK" } ,
{ in : "2015-02-08 03:02:00.001 +0300 MSK m=+0.000000001" , out : "2015-02-08 00:02:00.001 +0000 UTC" , zname : "MSK" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm-dd hh:mm:ss TZ
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 18:31:59 UTC" , out : "2012-08-03 18:31:59 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-08-03 18:31:59 CEST" , out : "2012-08-03 18:31:59 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-12-16 06:20:00 GMT" , out : "2014-12-16 06:20:00 +0000 UTC" , zname : "GMT" } ,
2018-03-12 08:39:59 +08:00
{ in : "2012-08-03 13:31:59 MST" , out : "2012-08-03 20:31:59 +0000 UTC" , loc : "America/Denver" } ,
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 18:31:59.257000000 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-08-03 8:1:59.257000000 UTC" , out : "2012-08-03 08:01:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-03 18:31:59.257000000 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-3 18:31:59.257000000 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-3 18:31:59.257000000 CEST" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-04-26 17:24:37.123456 UTC" , out : "2014-04-26 17:24:37.123456 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.123456 CEST" , out : "2014-04-26 17:24:37.123456 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-04-26 17:24:37.123456Z" , out : "2014-04-26 17:24:37.123456 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.12 UTC" , out : "2014-04-26 17:24:37.12 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.12 CEST" , out : "2014-04-26 17:24:37.12 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-04-26 17:24:37.1 UTC" , out : "2014-04-26 17:24:37.1 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.1 CEST" , out : "2014-04-26 17:24:37.1 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
// This one is pretty special, it is TIMEZONE based but starts with P to emulate collions with PM
2023-12-12 14:45:58 +08:00
{ in : "2014-04-26 05:24:37 PST" , out : "2014-04-26 05:24:37 +0000 UTC" , zname : "PST" } ,
2021-02-07 07:23:24 +08:00
{ in : "2014-04-26 05:24:37 PST" , out : "2014-04-26 13:24:37 +0000 UTC" , loc : "America/Los_Angeles" } ,
2018-03-12 08:39:59 +08: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 : "2017-07-19 03:21:51+00:00" , out : "2017-07-19 03:21:51 +0000 UTC" } ,
2020-06-18 05:01:20 +08: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" } ,
// dd:mm:yyyy hh:mm:ss+00:00
{ in : "08:03:2012 18:31:59+00:00" , out : "2012-08-03 18:31:59 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm-dd hh:mm:ss.000+00:00 PST
{ in : "2012-08-03 18:31:59.000+00:00 PST" , out : "2012-08-03 18:31:59 +0000 UTC" , loc : "America/Los_Angeles" } ,
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 18:31:59.000+00:00 CEST" , out : "2012-08-03 18:31:59 +0000 UTC" , loc : "Europe/Berlin" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm-dd hh:mm:ss +00:00 TZ
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 18:31:59 +00:00 UTC" , out : "2012-08-03 18:31:59 +0000 UTC" , zname : "UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2012-08-03 13:31:51 -07:00 MST" , out : "2012-08-03 20:31:51 +0000 UTC" , loc : "America/Denver" } ,
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 13:31:51 +02:00 CEST" , out : "2012-08-03 11:31:51 +0000 UTC" , loc : "Europe/Berlin" } ,
{ in : "2012-08-03 18:31:59.257000000 +00:00 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
2018-03-12 08:39:59 +08:00
{ in : "2012-08-03 13:31:51.123 -08:00 PST" , out : "2012-08-03 21:31:51.123 +0000 UTC" , loc : "America/Los_Angeles" } ,
{ in : "2012-08-03 13:31:51.123 +02:00 CEST" , out : "2012-08-03 11:31:51.123 +0000 UTC" , loc : "Europe/Berlin" } ,
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 8:1:59.257000000 +00:00 UTC" , out : "2012-08-03 08:01:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-08-03 8:1:59.257000000 +00:00 CEST" , out : "2012-08-03 08:01:59.257 +0000 UTC" , zname : "CEST" } ,
{ in : "2012-8-03 18:31:59.257000000 +00:00 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-03 18:31:59.257000000 +00:00 CEST" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "CEST" } ,
{ in : "2012-8-3 18:31:59.257000000 +00:00 UTC" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "UTC" } ,
{ in : "2012-8-3 18:31:59.257000000 +00:00 CEST" , out : "2012-08-03 18:31:59.257 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-04-26 17:24:37.123456 +00:00 UTC" , out : "2014-04-26 17:24:37.123456 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.123456 +00:00 CEST" , out : "2014-04-26 17:24:37.123456 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-04-26 17:24:37.12 +00:00 UTC" , out : "2014-04-26 17:24:37.12 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.12 +00:00 CEST" , out : "2014-04-26 17:24:37.12 +0000 UTC" , zname : "CEST" } ,
{ in : "2014-04-26 17:24:37.1 +00:00 UTC" , out : "2014-04-26 17:24:37.1 +0000 UTC" , zname : "UTC" } ,
{ in : "2014-04-26 17:24:37.1 +00:00 CEST" , out : "2014-04-26 17:24:37.1 +0000 UTC" , zname : "CEST" } ,
2018-03-12 08:39:59 +08:00
// yyyy-mm-ddThh:mm:ss
{ in : "2009-08-12T22:15:09" , out : "2009-08-12 22:15:09 +0000 UTC" } ,
{ in : "2009-08-08T02:08:08" , out : "2009-08-08 02:08:08 +0000 UTC" } ,
{ in : "2009-08-08T2:8:8" , out : "2009-08-08 02:08:08 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.123" , out : "2009-08-12 22:15:09.123 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.123456" , out : "2009-08-12 22:15:09.123456 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.12" , out : "2009-08-12 22:15:09.12 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.1" , out : "2009-08-12 22:15:09.1 +0000 UTC" } ,
{ in : "2014-04-26 17:24:37.3186369" , out : "2014-04-26 17:24:37.3186369 +0000 UTC" } ,
// yyyy-mm-ddThh:mm:ss-07:00
{ in : "2009-08-12T22:15:09-07:00" , out : "2009-08-13 05:15:09 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09-03:00" , out : "2009-08-13 01:15:09 +0000 UTC" } ,
{ in : "2009-08-12T22:15:9-07:00" , out : "2009-08-13 05:15:09 +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.799+01:00" , out : "2016-06-21 18:55:00.799 +0000 UTC" } ,
2021-02-07 05:42:06 +08:00
// 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" } ,
2018-03-12 08:39:59 +08:00
// 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-0300" , out : "2009-08-13 01:15:09 +0000 UTC" } ,
{ in : "2009-08-12T22:15:9-0700" , out : "2009-08-13 05:15:09 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.123-0700" , out : "2009-08-13 05:15:09.123 +0000 UTC" } ,
{ in : "2016-06-21T19:55:00+0100" , out : "2016-06-21 18:55:00 +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:00+0100" , out : "2016-06-21 18:55:00 +0000 UTC" } ,
{ in : "2016-06-21T19:55:00-0700" , out : "2016-06-22 02:55:00 +0000 UTC" } ,
{ in : "2016-06-21T19:55:00.799+0100" , out : "2016-06-21 18:55:00.799 +0000 UTC" } ,
2018-04-06 21:57:28 +08:00
{ 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" } ,
2021-02-07 05:42:06 +08:00
// yyyy-mm-ddThh:mm:ss:000+0000 - weird format with additional colon in front of milliseconds
2023-12-12 14:45:58 +08:00
{ in : "2012-08-17T18:31:59:257" , out : "2012-08-17 18:31:59.257 +0000 UTC" } , // https://github.com/araddon/dateparse/issues/137
2021-02-07 05:42:06 +08:00
{ 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
2018-03-12 08:39:59 +08:00
// yyyy-mm-ddThh:mm:ssZ
{ 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:09.99Z" , out : "2009-08-12 22:15:09.99 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.9999Z" , out : "2009-08-12 22:15:09.9999 +0000 UTC" } ,
{ in : "2009-08-12T22:15:09.99999999Z" , out : "2009-08-12 22:15:09.99999999 +0000 UTC" } ,
{ in : "2009-08-12T22:15:9.99999999Z" , out : "2009-08-12 22:15:09.99999999 +0000 UTC" } ,
2018-05-04 09:06:52 +08:00
// yyyy.mm
{ in : "2014.05" , out : "2014-05-01 00:00:00 +0000 UTC" } ,
2019-02-23 08:50:43 +08:00
{ in : "2018.09.30" , out : "2018-09-30 00:00:00 +0000 UTC" } ,
2018-03-12 08:39:59 +08:00
// mm.dd.yyyy
{ in : "3.31.2014" , out : "2014-03-31 00:00:00 +0000 UTC" } ,
{ in : "3.3.2014" , out : "2014-03-03 00:00:00 +0000 UTC" } ,
{ in : "03.31.2014" , out : "2014-03-31 00:00:00 +0000 UTC" } ,
// mm.dd.yy
{ in : "08.21.71" , out : "1971-08-21 00:00:00 +0000 UTC" } ,
2023-12-12 14:46:44 +08:00
// dd.mm.yyyy (see https://github.com/araddon/dateparse/issues/129 and https://github.com/araddon/dateparse/issues/28 and https://github.com/araddon/dateparse/pull/133)
{ in : "23.07.1938" , out : "1938-07-23 00:00:00 +0000 UTC" , retryAmbiguous : true } ,
{ in : "23.07.1938" , out : "1938-07-23 00:00:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "23/07/1938" , out : "1938-07-23 00:00:00 +0000 UTC" , retryAmbiguous : true } ,
{ in : "23/07/1938" , out : "1938-07-23 00:00:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "31/3/2014" , out : "2014-03-31 00:00:00 +0000 UTC" , retryAmbiguous : true } ,
{ in : "31/3/2014" , out : "2014-03-31 00:00:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "31/03/2014" , out : "2014-03-31 00:00:00 +0000 UTC" , retryAmbiguous : true } ,
{ in : "31/03/2014" , out : "2014-03-31 00:00:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "21/08/71" , out : "1971-08-21 00:00:00 +0000 UTC" , retryAmbiguous : true } ,
{ in : "21/08/71" , out : "1971-08-21 00:00:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "1/8/71" , out : "1971-01-08 00:00:00 +0000 UTC" , preferDayFirst : false } ,
{ in : "1/8/71" , out : "1971-08-01 00:00:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "8/4/2014 22:05" , out : "2014-08-04 22:05:00 +0000 UTC" , preferDayFirst : false } ,
{ in : "8/4/2014 22:05" , out : "2014-04-08 22:05:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "08/04/2014 22:05" , out : "2014-08-04 22:05:00 +0000 UTC" , preferDayFirst : false } ,
{ in : "08/04/2014 22:05" , out : "2014-04-08 22:05:00 +0000 UTC" , preferDayFirst : true } ,
{ in : "2/04/2014 03:00:51" , out : "2014-02-04 03:00:51 +0000 UTC" , preferDayFirst : false } ,
{ in : "2/04/2014 03:00:51" , out : "2014-04-02 03:00:51 +0000 UTC" , preferDayFirst : true } ,
{ in : "19/03/2012 10:11:59" , out : "2012-03-19 10:11:59 +0000 UTC" , retryAmbiguous : true } ,
{ in : "19/03/2012 10:11:59" , out : "2012-03-19 10:11:59 +0000 UTC" , preferDayFirst : true } ,
{ in : "19/03/2012 10:11:59.3186369" , out : "2012-03-19 10:11:59.3186369 +0000 UTC" , retryAmbiguous : true } ,
{ in : "19/03/2012 10:11:59.3186369" , out : "2012-03-19 10:11:59.3186369 +0000 UTC" , preferDayFirst : true } ,
// https://github.com/araddon/dateparse/issues/105
{ in : "20/5/2006 19:51:45" , out : "2006-05-20 19:51:45 +0000 UTC" , retryAmbiguous : true } ,
{ in : "20/5/2006 19:51:45" , out : "2006-05-20 19:51:45 +0000 UTC" , preferDayFirst : true } ,
2018-03-12 08:39:59 +08:00
// yyyymmdd and similar
{ in : "2014" , out : "2014-01-01 00:00:00 +0000 UTC" } ,
{ in : "20140601" , out : "2014-06-01 00:00:00 +0000 UTC" } ,
2018-07-22 05:28:33 +08:00
{ in : "20140722105203" , out : "2014-07-22 10:52:03 +0000 UTC" } ,
2021-02-06 05:11:38 +08:00
// 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" } ,
2023-12-12 14:45:58 +08:00
// https://github.com/araddon/dateparse/issues/94
{ in : "190910 11:51:49" , out : "2019-09-10 11:51:49 +0000 UTC" } ,
2018-07-22 05:28:33 +08:00
2018-03-12 08:39:59 +08:00
// 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" , loc : "America/Denver" } ,
{ in : "1384216367111" , out : "2013-11-12 00:32:47.111 +0000 UTC" } ,
{ in : "1384216367111222" , out : "2013-11-12 00:32:47.111222 +0000 UTC" } ,
{ in : "1384216367111222333" , out : "2013-11-12 00:32:47.111222333 +0000 UTC" } ,
2023-02-15 13:24:05 +08:00
{ in : "Wed, 8 Feb 2023 19:00:46 +1100 (AEDT)" , out : "2023-02-08 08:00:46 +0000 UTC" } ,
2023-02-15 14:34:02 +08:00
{ in : "FRI, 16 AUG 2013 9:39:51 +1000" , out : "2013-08-15 23:39:51 +0000 UTC" } ,
2023-02-16 06:39:34 +08:00
{ in : "Mon, 1 Dec 2008 14:48:22 GMT-07:00" , out : "2008-12-01 21:48:22 +0000 UTC" } ,
2018-03-11 05:43:16 +08:00
}
2017-07-27 06:34:40 +08:00
func TestParse ( t * testing . T ) {
// Lets ensure we are operating on UTC
time . Local = time . UTC
2017-04-24 02:24:32 +08:00
2014-06-16 02:18:20 +08:00
zeroTime := time . Time { } . Unix ( )
2023-02-15 20:37:23 +08:00
t . Run ( "Invalid" , func ( t * testing . T ) {
ts , err := ParseAny ( "INVALID" )
assert . Equal ( t , zeroTime , ts . Unix ( ) )
assert . NotEqual ( t , nil , err )
2017-07-14 10:57:15 +08:00
2023-02-15 20:37:23 +08:00
assert . Equal ( t , true , testDidPanic ( "NOT GONNA HAPPEN" ) )
// https://github.com/golang/go/issues/5294
_ , err = ParseAny ( time . RFC3339 )
assert . NotEqual ( t , nil , err )
} )
2017-07-14 10:57:15 +08:00
2018-03-12 08:39:59 +08:00
for _ , th := range testInputs {
2023-02-15 13:20:46 +08:00
t . Run ( th . in , func ( t * testing . T ) {
2023-02-15 20:37:23 +08:00
var ts time . Time
2023-02-15 13:20:46 +08:00
defer func ( ) {
if r := recover ( ) ; r != nil {
t . Fatalf ( "error: %s" , r )
}
} ( )
2023-12-12 14:46:44 +08:00
parserOptions := [ ] ParserOption { PreferMonthFirst ( ! th . preferDayFirst ) , RetryAmbiguousDateWithSwap ( th . retryAmbiguous ) }
2023-02-15 13:20:46 +08:00
if len ( th . loc ) > 0 {
loc , err := time . LoadLocation ( th . loc )
if err != nil {
t . Fatalf ( "Expected to load location %q but got %v" , th . loc , err )
}
2023-12-12 14:46:44 +08:00
ts , err = ParseIn ( th . in , loc , parserOptions ... )
2023-02-15 13:20:46 +08:00
if err != nil {
t . Fatalf ( "expected to parse %q but got %v" , th . in , err )
}
got := fmt . Sprintf ( "%v" , ts . In ( time . UTC ) )
assert . Equal ( t , th . out , got , "Expected %q but got %q from %q" , th . out , got , th . in )
if th . out != got {
t . Fatalf ( "whoops, got %s, expected %s" , got , th . out )
}
2023-12-12 14:45:58 +08:00
if len ( th . zname ) > 0 {
gotZone , _ := ts . Zone ( )
assert . Equal ( t , th . zname , gotZone , "Expected zname %q but got %q from %q" , th . zname , gotZone , th . in )
}
2023-02-15 13:20:46 +08:00
} else {
2023-12-12 14:46:44 +08:00
ts = MustParse ( th . in , parserOptions ... )
2023-02-15 13:20:46 +08:00
got := fmt . Sprintf ( "%v" , ts . In ( time . UTC ) )
assert . Equal ( t , th . out , got , "Expected %q but got %q from %q" , th . out , got , th . in )
if th . out != got {
t . Fatalf ( "whoops, got %s, expected %s" , got , th . out )
}
2023-12-12 14:45:58 +08:00
if len ( th . zname ) > 0 {
gotZone , _ := ts . Zone ( )
assert . Equal ( t , th . zname , gotZone , "Expected zname %q but got %q from %q" , th . zname , gotZone , th . in )
}
2018-03-12 08:39:59 +08:00
}
2023-02-15 13:20:46 +08:00
} )
2018-03-12 08:39:59 +08:00
}
2014-05-11 23:28:23 +08:00
2018-03-12 08:39:59 +08:00
// some errors
2017-07-14 10:57:15 +08:00
2023-02-15 20:37:23 +08:00
t . Run ( "" , func ( t * testing . T ) {
assert . Equal ( t , true , testDidPanic ( ` { "ts":"now"} ` ) )
} )
2018-03-25 06:56:26 +08:00
2023-02-15 20:37:23 +08:00
t . Run ( "too many digits" , func ( t * testing . T ) {
_ , err := ParseAny ( "138421636711122233311111" ) // too many digits
assert . NotEqual ( t , nil , err )
} )
2017-10-08 00:34:59 +08:00
2023-02-15 20:37:23 +08:00
t . Run ( "negative number" , func ( t * testing . T ) {
_ , err := ParseAny ( "-1314" )
assert . NotEqual ( t , nil , err )
} )
2018-03-12 08:39:59 +08:00
2023-02-15 20:37:23 +08:00
t . Run ( "month doesn't exist" , func ( t * testing . T ) {
_ , err := ParseAny ( "2014-13-13 08:20:13,787" ) // month 13 doesn't exist so error
assert . NotEqual ( t , nil , err )
} )
2017-07-14 10:57:15 +08:00
}
2017-10-04 18:50:25 +08:00
func testDidPanic ( datestr string ) ( paniced bool ) {
defer func ( ) {
if r := recover ( ) ; r != nil {
paniced = true
}
} ( )
MustParse ( datestr )
return false
}
2018-02-28 12:05:14 +08:00
func TestPStruct ( t * testing . T ) {
denverLoc , err := time . LoadLocation ( "America/Denver" )
assert . Equal ( t , nil , err )
2023-02-15 12:57:15 +08:00
p , err := newParser ( "08.21.71" , denverLoc )
if err != nil {
t . Fatalf ( "Parser build error: %s" , err )
}
2018-02-28 12:05:14 +08:00
p . setMonth ( )
assert . Equal ( t , 0 , p . moi )
p . setDay ( )
assert . Equal ( t , 0 , p . dayi )
p . set ( - 1 , "not" )
p . set ( 15 , "not" )
assert . Equal ( t , "08.21.71" , p . datestr )
assert . Equal ( t , "08.21.71" , string ( p . format ) )
2018-03-11 03:50:19 +08:00
assert . True ( t , len ( p . ds ( ) ) > 0 )
assert . True ( t , len ( p . ts ( ) ) > 0 )
2018-02-28 12:05:14 +08:00
}
2018-03-25 06:56:26 +08:00
2018-04-19 08:36:22 +08:00
var testParseErrors = [ ] dateTest {
{ in : "3" , err : true } ,
{ in : ` { "hello"} ` , err : true } ,
{ in : "2009-15-12T22:15Z" , err : true } ,
{ in : "5,000-9,999" , err : true } ,
{ in : "xyzq-baad" } ,
2018-06-09 09:01:07 +08:00
{ in : "oct.-7-1970" , err : true } ,
2018-07-11 09:51:27 +08:00
{ in : "septe. 7, 1970" , err : true } ,
2018-11-23 05:54:48 +08:00
{ in : "SeptemberRR 7th, 1970" , err : true } ,
2018-10-10 11:50:09 +08:00
{ in : "29-06-2016" , err : true } ,
// this is just testing the empty space up front
{ in : " 2018-01-02 17:08:09 -07:00" , err : true } ,
2023-12-12 14:45:58 +08:00
// a semantic version number should not be interpreted as a date
{ in : "1.22.3-78888" , err : true } ,
// a semantic version number that starts with a date should not be interpreted as a date
{ in : "1.22.2023-78888" , err : true } ,
// https://github.com/araddon/dateparse/issues/145
{ in : "dataddo, faces, bug" , err : true } ,
// https://github.com/araddon/dateparse/issues/108
{ in : "1.jpg" , err : true } ,
// https://github.com/araddon/dateparse/issues/98
{ in : "Wayne, Bruce" , err : true } ,
{ in : "Miami, Florida" , err : true } ,
{ in : "Doe, John" , err : true } ,
2023-12-13 08:42:09 +08:00
// https://github.com/araddon/dateparse/issues/149
{ in : "2018-09-30 21:09:13PMDT" , err : true } ,
{ in : "2018-09-30 08:09:13pm PM" , err : true } ,
{ in : "2018-09-30 08:09:13 PM PM" , err : true } ,
{ in : "2018-09-30 08:09:13 PMDT PM" , err : true } ,
{ in : "2018-09-30 21:09:13.123PMDT" , err : true } ,
{ in : "2018-09-30 08:09:13.123PM pm" , err : true } ,
{ in : "2018-09-30 08:09:13.123 pm PM" , err : true } ,
{ in : "2018-09-30 08:09:13.123 PMDT pm" , err : true } ,
{ in : "2018-09-30 21:09:13AMT" , err : true } ,
{ in : "2018-09-30 08:09:13am AM" , err : true } ,
{ in : "2018-09-30 08:09:13 AM AM" , err : true } ,
{ in : "2018-09-30 08:09:13 AMT AM" , err : true } ,
{ in : "2018-09-30 21:09:13.123AMT" , err : true } ,
{ in : "2018-09-30 08:09:13.123AM am" , err : true } ,
{ in : "2018-09-30 08:09:13.123 am AM" , err : true } ,
{ in : "2018-09-30 08:09:13.123 AMDT am" , err : true } ,
2018-04-19 08:36:22 +08:00
}
func TestParseErrors ( t * testing . T ) {
for _ , th := range testParseErrors {
2023-12-12 14:45:58 +08:00
t . Run ( th . in , func ( t * testing . T ) {
v , err := ParseAny ( th . in )
assert . NotEqual ( t , nil , err , "%v for %v" , v , th . in )
2021-04-28 23:23:48 +08:00
2023-12-12 14:45:58 +08:00
v , err = ParseAny ( th . in , RetryAmbiguousDateWithSwap ( true ) )
assert . NotEqual ( t , nil , err , "%v for %v" , v , th . in )
} )
2018-04-19 08:36:22 +08:00
}
}
2021-02-06 05:11:38 +08:00
func TestParseLayout ( t * testing . T ) {
2021-02-07 07:23:24 +08:00
time . Local = time . UTC
2021-02-06 05:11:38 +08:00
// 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 } ,
2021-02-07 05:42:06 +08:00
// This 3 digit TZ offset (should be 2 or 4? is 3 a thing?)
{ in : "2019-05-29T08:41-047" , err : true } ,
2021-02-06 05:11:38 +08:00
//
{ 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" } ,
2021-02-03 18:10:39 +08:00
2021-02-06 05:11:38 +08:00
{ 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
2021-02-07 07:23:24 +08:00
// 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" } ,
2021-02-06 05:11:38 +08:00
// yyyy-mm-dd hh:mm:ss TZ
2021-02-07 07:23:24 +08:00
{ in : "2012-08-03 18:31:59 UTC" , out : "2006-01-02 15:04:05 MST" } ,
2023-12-12 14:45:58 +08:00
{ in : "2012-08-03 18:31:59 CEST" , out : "2006-01-02 15:04:05 MST " } ,
2021-02-06 05:11:38 +08:00
// 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" } ,
}
2018-03-25 06:56:26 +08:00
for _ , th := range testParseFormat {
2023-12-12 14:45:58 +08:00
t . Run ( th . in , func ( t * testing . T ) {
l , err := ParseFormat ( th . in )
if th . err {
assert . NotEqual ( t , nil , err )
} else {
assert . Equal ( t , nil , err )
assert . Equal ( t , th . out , l , "for in=%v" , th . in )
}
} )
2018-03-25 06:56:26 +08:00
}
}
2018-03-25 08:49:27 +08:00
var testParseStrict = [ ] dateTest {
2018-10-10 11:50:09 +08:00
// dd-mon-yy 13-Feb-03
2023-12-12 14:45:58 +08:00
{ in : "03-03-14" , err : true } ,
2018-03-25 08:49:27 +08:00
// mm.dd.yyyy
2023-12-12 14:45:58 +08:00
{ in : "3.3.2014" , err : true } ,
2018-03-25 08:49:27 +08:00
// mm.dd.yy
2023-12-12 14:45:58 +08:00
{ in : "08.09.71" , err : true } ,
2018-03-25 08:49:27 +08:00
// mm/dd/yyyy
2023-12-12 14:45:58 +08:00
{ in : "3/5/2014" , err : true } ,
2018-03-25 08:49:27 +08:00
// mm/dd/yy
2023-12-12 14:45:58 +08:00
{ in : "08/08/71" , err : true } ,
{ in : "8/8/71" , err : true } ,
2018-03-25 08:49:27 +08:00
// mm/dd/yy hh:mm:ss
2023-12-12 14:45:58 +08:00
{ in : "04/02/2014 04:08:09" , err : true } ,
{ in : "4/2/2014 04:08:09" , err : true } ,
{ in : ` { "hello"} ` , err : true } ,
{ in : "2009-08-12T22:15Z" } ,
2018-03-25 08:49:27 +08:00
}
func TestParseStrict ( t * testing . T ) {
for _ , th := range testParseStrict {
2023-12-12 14:45:58 +08:00
t . Run ( th . in , func ( t * testing . T ) {
_ , err := ParseStrict ( th . in )
if th . err {
assert . NotEqual ( t , nil , err )
} else {
assert . Equal ( t , nil , err )
}
} )
2018-03-25 08:49:27 +08:00
}
}
2018-05-04 09:06:52 +08:00
// Lets test to see how this performs using different Timezones/Locations
// Also of note, try changing your server/machine timezones and repeat
//
// !!!!! The time-zone of local machine effects the results!
// https://play.golang.org/p/IDHRalIyXh
// https://github.com/golang/go/issues/18012
func TestInLocation ( t * testing . T ) {
denverLoc , err := time . LoadLocation ( "America/Denver" )
assert . Equal ( t , nil , err )
// Start out with time.UTC
time . Local = time . UTC
// Just normal parse to test out zone/offset
ts := MustParse ( "2013-02-01 00:00:00" )
zone , offset := ts . Zone ( )
assert . Equal ( t , 0 , offset , "Should have found offset = 0 %v" , offset )
assert . Equal ( t , "UTC" , zone , "Should have found zone = UTC %v" , zone )
assert . Equal ( t , "2013-02-01 00:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now lets set to denver (MST/MDT) and re-parse the same time string
// and since no timezone info in string, we expect same result
time . Local = denverLoc
ts = MustParse ( "2013-02-01 00:00:00" )
zone , offset = ts . Zone ( )
assert . Equal ( t , 0 , offset , "Should have found offset = 0 %v" , offset )
assert . Equal ( t , "UTC" , zone , "Should have found zone = UTC %v" , zone )
assert . Equal ( t , "2013-02-01 00:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
ts = MustParse ( "Tue, 5 Jul 2017 16:28:13 -0700 (MST)" )
assert . Equal ( t , "2017-07-05 23:28:13 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now we are going to use ParseIn() and see that it gives different answer
// with different zone, offset
time . Local = nil
ts , err = ParseIn ( "2013-02-01 00:00:00" , denverLoc )
assert . Equal ( t , nil , err )
zone , offset = ts . Zone ( )
assert . Equal ( t , - 25200 , offset , "Should have found offset = -25200 %v %v" , offset , denverLoc )
assert . Equal ( t , "MST" , zone , "Should have found zone = MST %v" , zone )
assert . Equal ( t , "2013-02-01 07:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
ts , err = ParseIn ( "18 January 2018" , denverLoc )
assert . Equal ( t , nil , err )
zone , offset = ts . Zone ( )
assert . Equal ( t , - 25200 , offset , "Should have found offset = 0 %v" , offset )
assert . Equal ( t , "MST" , zone , "Should have found zone = UTC %v" , zone )
assert . Equal ( t , "2018-01-18 07:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now we are going to use ParseLocal() and see that it gives same
// answer as ParseIn when we have time.Local set to a location
time . Local = denverLoc
ts , err = ParseLocal ( "2013-02-01 00:00:00" )
assert . Equal ( t , nil , err )
zone , offset = ts . Zone ( )
assert . Equal ( t , - 25200 , offset , "Should have found offset = -25200 %v %v" , offset , denverLoc )
assert . Equal ( t , "MST" , zone , "Should have found zone = MST %v" , zone )
assert . Equal ( t , "2013-02-01 07:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Lets advance past daylight savings time start
// use parseIn and see offset/zone has changed to Daylight Savings Equivalents
ts , err = ParseIn ( "2013-04-01 00:00:00" , denverLoc )
assert . Equal ( t , nil , err )
zone , offset = ts . Zone ( )
assert . Equal ( t , - 21600 , offset , "Should have found offset = -21600 %v %v" , offset , denverLoc )
assert . Equal ( t , "MDT" , zone , "Should have found zone = MDT %v" , zone )
assert . Equal ( t , "2013-04-01 06:00:00 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// reset to UTC
time . Local = time . UTC
// UnixDate = "Mon Jan _2 15:04:05 MST 2006"
ts = MustParse ( "Mon Jan 2 15:04:05 MST 2006" )
_ , offset = ts . Zone ( )
assert . Equal ( t , 0 , offset , "Should have found offset = 0 %v" , offset )
assert . Equal ( t , "2006-01-02 15:04:05 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now lets set to denver(mst/mdt)
time . Local = denverLoc
ts = MustParse ( "Mon Jan 2 15:04:05 MST 2006" )
// this time is different from one above parsed with time.Local set to UTC
_ , offset = ts . Zone ( )
assert . Equal ( t , - 25200 , offset , "Should have found offset = -25200 %v" , offset )
assert . Equal ( t , "2006-01-02 22:04:05 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now Reset To UTC
time . Local = time . UTC
// RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
ts = MustParse ( "Monday, 02-Jan-06 15:04:05 MST" )
_ , offset = ts . Zone ( )
assert . Equal ( t , 0 , offset , "Should have found offset = 0 %v" , offset )
assert . Equal ( t , "2006-01-02 15:04:05 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now lets set to denver
time . Local = denverLoc
ts = MustParse ( "Monday, 02-Jan-06 15:04:05 MST" )
_ , offset = ts . Zone ( )
assert . NotEqual ( t , 0 , offset , "Should have found offset %v" , offset )
assert . Equal ( t , "2006-01-02 22:04:05 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// Now some errors
zeroTime := time . Time { } . Unix ( )
ts , err = ParseIn ( "INVALID" , denverLoc )
assert . Equal ( t , zeroTime , ts . Unix ( ) )
assert . NotEqual ( t , nil , err )
ts , err = ParseLocal ( "INVALID" )
assert . Equal ( t , zeroTime , ts . Unix ( ) )
assert . NotEqual ( t , nil , err )
}
2019-08-13 09:38:23 +08:00
func TestPreferMonthFirst ( t * testing . T ) {
// default case is true
ts , err := ParseAny ( "04/02/2014 04:08:09 +0000 UTC" )
assert . Equal ( t , nil , err )
assert . Equal ( t , "2014-04-02 04:08:09 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
preferMonthFirstTrue := PreferMonthFirst ( true )
ts , err = ParseAny ( "04/02/2014 04:08:09 +0000 UTC" , preferMonthFirstTrue )
assert . Equal ( t , nil , err )
assert . Equal ( t , "2014-04-02 04:08:09 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
// allows the day to be preferred before the month, when completely ambiguous
preferMonthFirstFalse := PreferMonthFirst ( false )
ts , err = ParseAny ( "04/02/2014 04:08:09 +0000 UTC" , preferMonthFirstFalse )
assert . Equal ( t , nil , err )
assert . Equal ( t , "2014-02-04 04:08:09 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
}
func TestRetryAmbiguousDateWithSwap ( t * testing . T ) {
// default is false
_ , err := ParseAny ( "13/02/2014 04:08:09 +0000 UTC" )
assert . NotEqual ( t , nil , err )
// will fail error if the month preference cannot work due to the value being larger than 12
retryAmbiguousDateWithSwapFalse := RetryAmbiguousDateWithSwap ( false )
_ , err = ParseAny ( "13/02/2014 04:08:09 +0000 UTC" , retryAmbiguousDateWithSwapFalse )
assert . NotEqual ( t , nil , err )
// will retry with the other month preference if this error is detected
retryAmbiguousDateWithSwapTrue := RetryAmbiguousDateWithSwap ( true )
ts , err := ParseAny ( "13/02/2014 04:08:09 +0000 UTC" , retryAmbiguousDateWithSwapTrue )
assert . Equal ( t , nil , err )
assert . Equal ( t , "2014-02-13 04:08:09 +0000 UTC" , fmt . Sprintf ( "%v" , ts . In ( time . UTC ) ) )
}