Go

Time

Introduction#

The Go time package provides functionality for measuring and displaying time.

This package provide a structure time.Time, allowing to store and do computations on dates and time.

Syntax#

  • time.Date(2016, time.December, 31, 23, 59, 59, 999, time.UTC) // initialize
  • date1 == date2 // returns true when the 2 are the same moment
  • date1 != date2 // returns true when the 2 are different moment
  • date1.Before(date2) // returns true when the first is strictly before the second
  • date1.After(date2) // returns true when the first is strictly after the second

Return time.Time Zero Value when function has an Error

const timeFormat = "15 Monday January 2006"

func ParseDate(s string) (time.Time, error) {
    t, err := time.Parse(timeFormat, s)
    if err != nil {
        // time.Time{} returns January 1, year 1, 00:00:00.000000000 UTC
        // which according to the source code is the zero value for time.Time
        // https://golang.org/src/time/time.go#L23
        return time.Time{}, err
    }
    return t, nil
}

## Time parsing
If you have a date stored as a string you will need to parse it. Use `time.Parse`.

    //           time.Parse(   format   , date to parse)
    date, err := time.Parse("01/02/2006",  "04/08/2017")
    if err != nil {
        panic(err)
    }
    
    fmt.Println(date)
    // Prints 2017-04-08 00:00:00 +0000 UTC

The first parameter is the layout in which the string stores the date and the second parameter is the string that contains the date. `01/02/2006` is the same than saying the format is `MM/DD/YYYY`.

The layout defines the format by showing how the reference time, defined to be `Mon Jan 2 15:04:05 -0700 MST 2006` would be interpreted if it were the value; it serves as an example of the input format. The same interpretation will then be made to the input string.

You can see the constants defined in the time package to know how to write the layout string, but note that the constants are not exported and can't be used outside the time package.

    const (
        stdLongMonth             // "January"
        stdMonth                 // "Jan"
        stdNumMonth              // "1"
        stdZeroMonth             // "01"
        stdLongWeekDay           // "Monday"
        stdWeekDay               // "Mon"
        stdDay                   // "2"
        stdUnderDay              // "_2"
        stdZeroDay               // "02"
        stdHour                  // "15"
        stdHour12                // "3"
        stdZeroHour12            // "03"
        stdMinute                // "4"
        stdZeroMinute            // "04"
        stdSecond                // "5"
        stdZeroSecond            // "05"
        stdLongYear              // "2006"
        stdYear                  // "06"
        stdPM                    // "PM"
        stdpm                    // "pm"
        stdTZ                    // "MST"
        stdISO8601TZ             // "Z0700"  // prints Z for UTC
        stdISO8601SecondsTZ      // "Z070000"
        stdISO8601ShortTZ        // "Z07"
        stdISO8601ColonTZ        // "Z07:00" // prints Z for UTC
        stdISO8601ColonSecondsTZ // "Z07:00:00"
        stdNumTZ                 // "-0700"  // always numeric
        stdNumSecondsTz          // "-070000"
        stdNumShortTZ            // "-07"    // always numeric
        stdNumColonTZ            // "-07:00" // always numeric
        stdNumColonSecondsTZ     // "-07:00:00"
    )


## Comparing Time
Sometime you will need to know, with 2 dates objects, if there are corresponding to the same date, or find which date is after the other.

In **Go**, there is 4 way to compare dates:
- `date1 == date2`, returns `true` when the 2 are the same moment
- `date1 != date2`, returns `true` when the 2 are different moment
- `date1.Before(date2)`, returns `true` when the first is strictly before the second
- `date1.After(date2)`, returns `true` when the first is strictly after the second

> WARNING: When the 2 Time to compare are the same (or correspond to the exact same date), functions `After` and `Before` will return `false`, as a date is neither before nor after itself
> - `date1 == date1`, returns `true`
> - `date1 != date1`, returns `false`
> - `date1.After(date1)`, returns `false`
> - `date1.Before(date1)`, returns `false`

<!-- break -->

> TIPS: If you need to know if a date is before or equal another one, just need to combine the 4 operators
> - `date1 == date2 && date1.After(date2)`, returns `true` when date1 is after or equal date2  
>or using `! (date1.Before(date2))`
> - `date1 == date2 && date1.Before(date2)`, returns `true` when date1 is before or equal date2
>or using `!(date1.After(date2))`

Some examples to see how to use:

    // Init 2 dates for example
    var date1 = time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
    var date2 = time.Date(2017, time.July, 25, 16, 22, 42, 123, time.UTC)
    var date3 = time.Date(2017, time.July, 25, 16, 22, 42, 123, time.UTC)

    bool1 := date1.Before(date2) // true, because date1 is before date2
    bool2 := date1.After(date2) // false, because date1 is not after date2

    bool3 := date2.Before(date1) // false, because date2 is not before date1
    bool4 := date2.After(date1) // true, because date2 is after date1

    bool5 := date1 == date2 // false, not the same moment
    bool6 := date1 == date3 // true, different objects but representing the exact same time

    bool7 := date1 != date2 // true, different moments
    bool8 := date1 != date3 // false, not different moments

    bool9 := date1.After(date3) // false, because date1 is not after date3 (that are the same)
    bool10:= date1.Before(date3) // false, because date1 is not before date3 (that are the same)

    bool11 := !(date1.Before(date3)) // true, because date1 is not before date3
    bool12 := !(date1.After(date3)) // true, because date1 is not after date3

This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow