By kannanrbk


2014-09-15 09:47:47 8 Comments

I tried parsing the date string "2014-09-12T11:45:26.371Z" in Go.

Code

layout := "2014-09-12T11:45:26.371Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout , str)

I got this error:

parsing time "2014-11-12T11:47:39.489Z": month out of range

How can I parse this date string?

6 comments

@Loren Osborn 2018-08-19 08:19:53

This is rather late to the party, and not really saying anything that hasn't been already said in one form or another, mostly through links above, but I wanted to give a TL;DR recap to those with less attention span:

The date and time of the go format string is very important. It's how Go knows which field is which. They are generally 1-9 left to right as follows:

  • January / Jan / january / jan / 01 / _1 (etc) are for month
  • 02 / _2 are for day of month
  • 15 / 03 / _3 / PM / P / pm /p are for hour & meridian (3pm)
  • 04 / _4 are for minutes
  • 05 / _5 are for seconds
  • 2006 / 06 are for year
  • -0700 / 07:00 / MST are for timezone
  • .999999999 / .000000000 etc are for partial seconds (I think the distinction is if trailing zeros are removed)
  • Mon / Monday are day of the week (which 01-02-2006 actually was),

So, Don't write "01-05-15" as your date format, unless you want "Month-Second-Hour"

(... again, this was basically a summary of above.)

@Nishant Rawat 2018-02-18 15:52:52

I will suggest using time.RFC3339 constant from time package. You can check other constants from time package. https://golang.org/pkg/time/#pkg-constants

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Time parsing");
    dateString := "2014-11-12T11:45:26.371Z"
    time1, err := time.Parse(time.RFC3339,dateString);
    if err!=nil {
    fmt.Println("Error while parsing date :", err);
    }
    fmt.Println(time1); 
}

@Steven Ferrer 2017-08-11 03:40:29

This might be super late, but this is for people that might stumble on this problem and might want to use external package for parsing date string.

I've tried looking for a libraries and I found this one:

https://github.com/araddon/dateparse

Example from the README:

package main

import (
    "flag"
    "fmt"
    "time"

    "github.com/apcera/termtables"
    "github.com/araddon/dateparse"
)

var examples = []string{
    "May 8, 2009 5:57:51 PM",
    "Mon Jan  2 15:04:05 2006",
    "Mon Jan  2 15:04:05 MST 2006",
    "Mon Jan 02 15:04:05 -0700 2006",
    "Monday, 02-Jan-06 15:04:05 MST",
    "Mon, 02 Jan 2006 15:04:05 MST",
    "Tue, 11 Jul 2017 16:28:13 +0200 (CEST)",
    "Mon, 02 Jan 2006 15:04:05 -0700",
    "Thu, 4 Jan 2018 17:53:36 +0000",
    "Mon Aug 10 15:44:11 UTC+0100 2015",
    "Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
    "12 Feb 2006, 19:17",
    "12 Feb 2006 19:17",
    "03 February 2013",
    "2013-Feb-03",
    //   mm/dd/yy
    "3/31/2014",
    "03/31/2014",
    "08/21/71",
    "8/1/71",
    "4/8/2014 22:05",
    "04/08/2014 22:05",
    "4/8/14 22:05",
    "04/2/2014 03:00:51",
    "8/8/1965 12:00:00 AM",
    "8/8/1965 01:00:01 PM",
    "8/8/1965 01:00 PM",
    "8/8/1965 1:00 PM",
    "8/8/1965 12:00 AM",
    "4/02/2014 03:00:51",
    "03/19/2012 10:11:59",
    "03/19/2012 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
    "2014年04月08日",
    //   yyyy-mm-ddThh
    "2006-01-02T15:04:05+0000",
    "2009-08-12T22:15:09-07:00",
    "2009-08-12T22:15:09",
    "2009-08-12T22:15:09Z",
    //   yyyy-mm-dd hh:mm:ss
    "2014-04-26 17:24:37.3186369",
    "2012-08-03 18:31:59.257000000",
    "2014-04-26 17:24:37.123",
    "2013-04-01 22:43",
    "2013-04-01 22:43:22",
    "2014-12-16 06:20:00 UTC",
    "2014-12-16 06:20:00 GMT",
    "2014-04-26 05:24:37 PM",
    "2014-04-26 13:13:43 +0800",
    "2014-04-26 13:13:44 +09:00",
    "2012-08-03 18:31:59.257000000 +0000 UTC",
    "2015-09-30 18:48:56.35272715 +0000 UTC",
    "2015-02-18 00:12:00 +0000 GMT",
    "2015-02-18 00:12:00 +0000 UTC",
    "2017-07-19 03:21:51+00:00",
    "2014-04-26",
    "2014-04",
    "2014",
    "2014-05-11 08:20:13,787",
    // mm.dd.yy
    "3.31.2014",
    "03.31.2014",
    "08.21.71",
    //  yyyymmdd and similar
    "20140601",
    // unix seconds, ms
    "1332151919",
    "1384216367189",
}

var (
    timezone = ""
)

func main() {
    flag.StringVar(&timezone, "timezone", "UTC", "Timezone aka `America/Los_Angeles` formatted time-zone")
    flag.Parse()

    if timezone != "" {
        // NOTE:  This is very, very important to understand
        // time-parsing in go
        loc, err := time.LoadLocation(timezone)
        if err != nil {
            panic(err.Error())
        }
        time.Local = loc
    }

    table := termtables.CreateTable()

    table.AddHeaders("Input", "Parsed, and Output as %v")
    for _, dateExample := range examples {
        t, err := dateparse.ParseLocal(dateExample)
        if err != nil {
            panic(err.Error())
        }
        table.AddRow(dateExample, fmt.Sprintf("%v", t))
    }
    fmt.Println(table.Render())
}

@chmike 2019-07-18 10:11:31

Unfortunately, there is an ambiguity in day month order. European date format gives day first and month second, and US time format use the reverse. A date like 3/5/2004 is ambiguous. The date is valid in US and European format, but 3 and 5 may correspond to day and month or the reverse. dateParse assume US format.

@robstarbuck 2017-05-28 23:40:07

As answered but to save typing out "2006-01-02T15:04:05.000Z" for the layout, you could use the package's constant RFC3339.

str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(time.RFC3339, str)

if err != nil {
    fmt.Println(err)
}
fmt.Println(t)

https://play.golang.org/p/Dgu2ZvHwTh

@Hugh 2017-11-16 02:36:19

Additionally, if you look at the package constants (linked in the answer above) there are a bunch of other common formats provided that can be used. If you need something slightly different, use them as a starting point.

@Miles 2018-03-05 22:57:59

This and several answers recommend 2006-01-02T15:04:05.000Z and mention that Go's time.RFC3339 would also work. But time.RFC3339 = "2006-01-02T15:04:05Z07:00". Are these two formats exactly equivalent insofar as what time.Parse and time.ParseInLocation will do?

@robstarbuck 2018-03-05 23:07:34

That's right @Miles, this test confirms it play.golang.org/p/T3dW1kTeAHl

@VonC 2014-09-15 10:22:34

The layout to use is indeed "2006-01-02T15:04:05.000Z" described in RickyA's answer.
It isn't "the time of the first commit of go", but rather a mnemonic way to remember said layout.
See pkg/time:

The reference time used in the layouts is:

Mon Jan 2 15:04:05 MST 2006

which is Unix time 1136239445.
Since MST is GMT-0700, the reference time can be thought of as

 01/02 03:04:05PM '06 -0700

(1,2,3,4,5,6,7, provided you remember that 1 is for the month, and 2 for the day, which is not easy for an European like myself, used to the day-month date format)

As illustrated in "time.parse : why does golang parses the time incorrectly?", that layout (using 1,2,3,4,5,6,7) must be respected exactly.

@RickyA 2014-09-15 10:30:05

Nice, thanks for that explanation.

@Simon Whitehead 2014-09-15 13:21:20

Yeah that catches Australians out too! MM/DD just does not compute for me and I have to keep looking at it.

@VonC 2014-09-15 14:07:52

@SimonWhitehead I agree. At least, once I look it up, I know what YY, MM, DD, hh, mm, ss stand for and I can re-order them easily. With Go, even after looking it up, I need to remember what 1, 2, 3, 4... stand for.

@RickyA 2014-09-15 09:55:33

Use the exact layout numbers described here and a nice blogpost here.

so:

layout := "2006-01-02T15:04:05.000Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout, str)

if err != nil {
    fmt.Println(err)
}
fmt.Println(t)

gives:

>> 2014-11-12 11:45:26.371 +0000 UTC

I know. Mind boggling. Also caught me first time. Go just doesn't use an abstract syntax for datetime components (YYYY-MM-DD), but these exact numbers (I think the time of the first commit of go Nope, according to this. Does anyone know?).

@Darth Egregious 2015-08-05 15:59:59

Layout numbers? What? Why? Argh!

@RickyA 2015-08-05 16:18:25

@Fuser97381 I share your agony...

@James Tan 2016-05-12 15:45:52

same here... and null! string with nil not acceptable..

@Jishnu Prathap 2017-03-01 05:02:03

What were they thinking ! ? or smoking ?

@Yehonatan 2017-05-16 06:40:41

These "layout numbers" are one of the most stupid ideas I've ever seen in my life as a developer. Christ, who ever came up with this idea needs to slap and kick himself in his nuts.

@Davyd Dzhahaiev 2017-05-26 10:57:41

I might be a little late with comments here, but don't be scared of layout with numbers, just use constants and your code would be clean :) e.g. time.RFC3339

@threeve 2018-02-05 16:33:49

For those that don't get the layout numbers, I admit it's very foreign at first glance, but once you get used to it, I think it makes at least as much sense as typical layout devices ('Do I use "D", "d", "dd", "DD", etc?), and probably more sense. You just have to know about it first.

@amigcamel 2018-06-01 05:27:23

It's for mnemonic purpose, that is, you just have to remember 1, 2, 3, 4, 5, 6, 7 these letters. There's a great article discussing this: medium.com/@simplyianm/…

@Sandeep sandy 2018-07-13 13:10:06

While trying to parse the following time "2018-07-13 06:37:15" against "2006-02-14 02:02:02", month out of range error is coming. What's wrong with it. Could you help me.

@C4d 2018-10-07 09:45:14

I truly came hier, copied and executed the above code at exactly 11:45. Was confused about the output giving me the current time. Thought about having a bug in this XD.

Related Questions

Sponsored Content

41 Answered Questions

[SOLVED] Detecting an "invalid date" Date instance in JavaScript

  • 2009-08-30 11:34:40
  • orip
  • 701986 View
  • 1310 Score
  • 41 Answer
  • Tags:   javascript date

38 Answered Questions

[SOLVED] How do you get a timestamp in JavaScript?

50 Answered Questions

[SOLVED] How to format a JavaScript date

46 Answered Questions

[SOLVED] How do I get the current date in JavaScript?

  • 2009-10-07 11:39:02
  • Suresh Chaganti
  • 2370984 View
  • 2051 Score
  • 46 Answer
  • Tags:   javascript date

40 Answered Questions

[SOLVED] How to return only the Date from a SQL Server DateTime datatype

36 Answered Questions

[SOLVED] Compare two dates with JavaScript

13 Answered Questions

[SOLVED] Java string to date conversion

16 Answered Questions

[SOLVED] How to check whether an object is a date?

  • 2009-03-13 17:31:06
  • Martin
  • 363086 View
  • 495 Score
  • 16 Answer
  • Tags:   javascript date

1 Answered Questions

[SOLVED] go time.Parser error with a date DMYYYY

  • 2017-10-30 21:06:38
  • llCastro
  • 188 View
  • -3 Score
  • 1 Answer
  • Tags:   go

5 Answered Questions

[SOLVED] How to parse a date?

Sponsored Content