Skip to content

Commit b058bd3

Browse files
Add support for RFC3164/RFC5424 formats
Many devices send dates that do not conform to the RFCs... Also add support for the strange "TZ-0700" variant of the "UTC-0700" offset. Cover all the changes with new tests.
1 parent 2c0ba64 commit b058bd3

File tree

5 files changed

+101
-3
lines changed

5 files changed

+101
-3
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
dist
44
vendor
55
dateparse/dateparse
6+
example/example

README.md

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,30 @@ var examples = []string{
312312
"1384216367189",
313313
"1384216367111222",
314314
"1384216367111222333",
315+
// syslog RFC3164 (and non-conformant variants)
316+
"Apr 9 12:37:24",
317+
"Apr 9 12:37:24-10",
318+
"Apr 9 12:37:24-1000",
319+
"Apr 9 12:37:24 UTC-10",
320+
"Apr 9 12:37:24 MST",
321+
"Apr 9 12:37:24 MST-07:00",
322+
"Apr 9 12:37:24 TZ-10",
323+
"Apr 9 12:37:24 TZ+02:00",
324+
"Apr 9 12:37:24+10",
325+
"Apr 9 12:37:24+10:00",
326+
"Apr 9 12:37:24 CEST",
327+
"Apr 9 12:37:24 CEST+0200",
328+
"Apr 9 12:37:24 2025",
329+
"Apr 9 12:37:24 2025 +02:00",
330+
"Apr 9 2025 12:37:24",
331+
"Apr 9 2025 12:37:24 -0700",
332+
// syslog RFC5424 (and non-conformant variants)
333+
"2025-04-09T12:37:24Z",
334+
"2025-04-09T12:37:24.123Z",
335+
"2025-04-09T12:37:24.123456Z",
336+
"2025-04-09T12:37:24-10:00",
337+
"2025-04-09T12:37:24.123 +0200",
338+
"2025-04-09T12:37:24.123456 -0700 MDT",
315339
}
316340

317341
var (
@@ -377,10 +401,10 @@ func main() {
377401
| 1st February 2018 13:58:24 | 2018-02-01 13:58:24 +0000 UTC |
378402
| Mon, 02 Jan 2006 15:04:05 MST | 2006-01-02 15:04:05 +0000 MST |
379403
| Mon, 02 Jan 2006 15:04:05 -0700 | 2006-01-02 15:04:05 -0700 -0700 |
380-
| Tue, 11 Jul 2017 16:28:13 +0200 (CEST) | 2017-07-11 16:28:13 +0200 +0200 |
404+
| Tue, 11 Jul 2017 16:28:13 +0200 (CEST) | 2017-07-11 16:28:13 +0200 CEST |
381405
| Mon 30 Sep 2018 09:09:09 PM UTC | 2018-09-30 21:09:09 +0000 UTC |
382406
| Sun, 07 Jun 2020 00:00:00 +0100 | 2020-06-07 00:00:00 +0100 +0100 |
383-
| Wed, 8 Feb 2023 19:00:46 +1100 (AEDT) | 2023-02-08 19:00:46 +1100 +1100 |
407+
| Wed, 8 Feb 2023 19:00:46 +1100 (AEDT) | 2023-02-08 19:00:46 +1100 AEDT |
384408
| Mon Jan 2 15:04:05 2006 | 2006-01-02 15:04:05 +0000 UTC |
385409
| Mon Jan 2 15:04:05 MST 2006 | 2006-01-02 15:04:05 +0000 MST |
386410
| Monday Jan 02 15:04:05 -0700 2006 | 2006-01-02 15:04:05 -0700 -0700 |
@@ -526,6 +550,28 @@ func main() {
526550
| 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC |
527551
| 1384216367111222 | 2013-11-12 00:32:47.111222 +0000 UTC |
528552
| 1384216367111222333 | 2013-11-12 00:32:47.111222333 +0000 UTC |
553+
| Apr 9 12:37:24 | 0000-04-09 12:37:24 +0000 UTC |
554+
| Apr 9 12:37:24-10 | 0000-04-09 12:37:24 -1000 -1000 |
555+
| Apr 9 12:37:24-1000 | 0000-04-09 12:37:24 -1000 -1000 |
556+
| Apr 9 12:37:24 UTC-10 | 0000-04-09 12:37:24 -1000 -1000 |
557+
| Apr 9 12:37:24 MST | 0000-04-09 12:37:24 +0000 MST |
558+
| Apr 9 12:37:24 MST-07:00 | 0000-04-09 12:37:24 -0700 MST |
559+
| Apr 9 12:37:24 TZ-10 | 0000-04-09 12:37:24 -1000 -1000 |
560+
| Apr 9 12:37:24 TZ+02:00 | 0000-04-09 12:37:24 +0200 +0200 |
561+
| Apr 9 12:37:24+10 | 0000-04-09 12:37:24 +1000 +1000 |
562+
| Apr 9 12:37:24+10:00 | 0000-04-09 12:37:24 +1000 +1000 |
563+
| Apr 9 12:37:24 CEST | 0000-04-09 12:37:24 +0000 CEST |
564+
| Apr 9 12:37:24 CEST+0200 | 0000-04-09 12:37:24 +0200 CEST |
565+
| Apr 9 12:37:24 2025 | 2025-04-09 12:37:24 +0000 UTC |
566+
| Apr 9 12:37:24 2025 +02:00 | 2025-04-09 12:37:24 +0200 +0200 |
567+
| Apr 9 2025 12:37:24 | 2025-04-09 12:37:24 +0000 UTC |
568+
| Apr 9 2025 12:37:24 -0700 | 2025-04-09 12:37:24 -0700 -0700 |
569+
| 2025-04-09T12:37:24Z | 2025-04-09 12:37:24 +0000 UTC |
570+
| 2025-04-09T12:37:24.123Z | 2025-04-09 12:37:24.123 +0000 UTC |
571+
| 2025-04-09T12:37:24.123456Z | 2025-04-09 12:37:24.123456 +0000 UTC |
572+
| 2025-04-09T12:37:24-10:00 | 2025-04-09 12:37:24 -1000 -1000 |
573+
| 2025-04-09T12:37:24.123 +0200 | 2025-04-09 12:37:24.123 +0200 +0200 |
574+
| 2025-04-09T12:37:24.123456 -0700 MDT | 2025-04-09 12:37:24.123456 -0700 MDT |
529575
+------------------------------------------------------------+-----------------------------------------+
530576
*/
531577

example/main.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,30 @@ var examples = []string{
220220
"1384216367189",
221221
"1384216367111222",
222222
"1384216367111222333",
223+
// syslog RFC3164 (and non-conformant variants)
224+
"Apr 9 12:37:24",
225+
"Apr 9 12:37:24-10",
226+
"Apr 9 12:37:24-1000",
227+
"Apr 9 12:37:24 UTC-10",
228+
"Apr 9 12:37:24 MST",
229+
"Apr 9 12:37:24 MST-07:00",
230+
"Apr 9 12:37:24 TZ-10",
231+
"Apr 9 12:37:24 TZ+02:00",
232+
"Apr 9 12:37:24+10",
233+
"Apr 9 12:37:24+10:00",
234+
"Apr 9 12:37:24 CEST",
235+
"Apr 9 12:37:24 CEST+0200",
236+
"Apr 9 12:37:24 2025",
237+
"Apr 9 12:37:24 2025 +02:00",
238+
"Apr 9 2025 12:37:24",
239+
"Apr 9 2025 12:37:24 -0700",
240+
// syslog RFC5424 (and non-conformant variants)
241+
"2025-04-09T12:37:24Z",
242+
"2025-04-09T12:37:24.123Z",
243+
"2025-04-09T12:37:24.123456Z",
244+
"2025-04-09T12:37:24-10:00",
245+
"2025-04-09T12:37:24.123 +0200",
246+
"2025-04-09T12:37:24.123456 -0700 MDT",
223247
}
224248

225249
var (

parseany.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1934,7 +1934,7 @@ iterRunes:
19341934
switch r {
19351935
case '+', '-':
19361936
tzNameLower := strings.ToLower(p.datestr[p.tzi:i])
1937-
if tzNameLower == "gmt" || tzNameLower == "utc" {
1937+
if tzNameLower == "gmt" || tzNameLower == "utc" || tzNameLower == "tz" {
19381938
// This is a special form where the actual timezone isn't UTC, but is rather
19391939
// specifying that the correct offset is a specified numeric offset from UTC:
19401940
// 06:20:00 UTC-05

parseany_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,31 @@ var testInputs = []dateTest{
789789
{in: " 2018-01-02 17:08:09 -07:00", out: "2018-01-03 00:08:09 +0000 UTC"},
790790
{in: " 2018-01-02 17:08:09 -07:00", out: "2018-01-03 00:08:09 +0000 UTC"},
791791
{in: " 2018-01-02 17:08:09 -07:00", out: "2018-01-03 00:08:09 +0000 UTC"},
792+
793+
//syslog RFC3164 formats and non-conformant variants observed in the wild
794+
{in: "Apr 9 12:37:24", out: "0000-04-09 12:37:24 +0000 UTC"},
795+
{in: "Apr 9 12:37:24-10", out: "0000-04-09 22:37:24 +0000 UTC"},
796+
{in: "Apr 9 12:37:24-1000", out: "0000-04-09 22:37:24 +0000 UTC"},
797+
{in: "Apr 9 12:37:24 UTC-10", out: "0000-04-09 22:37:24 +0000 UTC"},
798+
{in: "Apr 9 12:37:24 MST", out: "0000-04-09 12:37:24 +0000 UTC", zname: "MST"},
799+
{in: "Apr 9 12:37:24 MST-07:00", out: "0000-04-09 19:37:24 +0000 UTC", zname: "MST"},
800+
{in: "Apr 9 12:37:24 TZ-10", out: "0000-04-09 22:37:24 +0000 UTC"},
801+
{in: "Apr 9 12:37:24 TZ+02:00", out: "0000-04-09 10:37:24 +0000 UTC"},
802+
{in: "Apr 9 12:37:24+10", out: "0000-04-09 02:37:24 +0000 UTC"},
803+
{in: "Apr 9 12:37:24+10:00", out: "0000-04-09 02:37:24 +0000 UTC"},
804+
{in: "Apr 9 12:37:24 CEST", out: "0000-04-09 12:37:24 +0000 UTC", zname: "CEST"},
805+
{in: "Apr 9 12:37:24 CEST+0200", out: "0000-04-09 10:37:24 +0000 UTC", zname: "CEST"},
806+
{in: "Apr 9 12:37:24 2025", out: "2025-04-09 12:37:24 +0000 UTC"},
807+
{in: "Apr 9 12:37:24 2025 +02:00", out: "2025-04-09 10:37:24 +0000 UTC"},
808+
{in: "Apr 9 2025 12:37:24", out: "2025-04-09 12:37:24 +0000 UTC"},
809+
{in: "Apr 9 2025 12:37:24 -0700", out: "2025-04-09 19:37:24 +0000 UTC"},
810+
//syslog RFC5424 formats and non-conformant variants observed in the wild
811+
{in: "2025-04-09T12:37:24Z", out: "2025-04-09 12:37:24 +0000 UTC"},
812+
{in: "2025-04-09T12:37:24.123Z", out: "2025-04-09 12:37:24.123 +0000 UTC"},
813+
{in: "2025-04-09T12:37:24.123456Z", out: "2025-04-09 12:37:24.123456 +0000 UTC"},
814+
{in: "2025-04-09T12:37:24-10:00", out: "2025-04-09 22:37:24 +0000 UTC"},
815+
{in: "2025-04-09T12:37:24.123 +0200", out: "2025-04-09 10:37:24.123 +0000 UTC"},
816+
{in: "2025-04-09T12:37:24.123456 -0700 MDT", out: "2025-04-09 19:37:24.123456 +0000 UTC", zname: "MDT"},
792817
}
793818

794819
func TestParse(t *testing.T) {
@@ -1025,6 +1050,8 @@ var testParseErrors = []dateTest{
10251050
{in: "Fri Jul 3 2015 06:04:07 UTC (GMT", err: true},
10261051
{in: "Fri Jul 3 2015 06:04:07 PST (Pacific (Daylight) Time)", err: true},
10271052
{in: "Fri Jul 3 2015 06:04:07 CEST (Central European Summer Time) extra", err: true},
1053+
// Special TZ indicator must be followed by an offset
1054+
{in: "Apr 9 12:37:24 TZ", err: true},
10281055
}
10291056

10301057
func TestParseErrors(t *testing.T) {

0 commit comments

Comments
 (0)