time.Time is a struct . When you try to compare them with == , quoting Spec: Comparison operator :
Structure values ββare comparable if all their fields are comparable. Two structure values ββare equal if their respective blank fields are equal.
So, t1 == t2 will compare all fields of values ββof the Time structure. The Time structure contains not only the second and nanosecond from the base time, but also contains the location as a pointer: *Location , therefore == also compares the location fields. Comparison of pointers:
The pointer values ββare comparable. Two pointer values ββare equal if they point to the same variable or both are nil . Pointers to various zero-size variables may or may not be equal.
And therefore, comparing time with == gives the result false : 2 locations can indicate the same location, even if their address is different, and this is your case.
To prove this:
fmt.Println("Locations:", t1.Location(), t2.Location()) fmt.Printf("Location pointers: %p %p\n", t1.Location(), t2.Location()) fmt.Println("Locations equal:", t1.Location() == t2.Location())
Output:
Locations: UTC UTC Location pointers: 0x1e2100 0x1e6de0 Locations equal: false
This is described in time.Time :
Note that the Go == operator compares not only a point in time, but also a location. Therefore, time values ββshould not be used as map or database keys without first confirming that all values ββhave the same location, which can be achieved using the UTC or Local method.
If t1 and t2 will also contain the same *Location pointer, they will be equal even compared to the == operator. This can be achieved by calling Time.UTC() or Time.Local() , which returns the value time.Time , which uses the same location pointer ( *Location ). Or using the Time.In() method, which sets the specified location pointer (after the correct conversion), for example:
t2 = t2.In(t1.Location()) fmt.Println("Locations:", t1.Location(), t2.Location()) fmt.Printf("Location pointers: %p %p\n", t1.Location(), t2.Location()) fmt.Println("Locations equal:", t1.Location() == t2.Location()) fmt.Println(t1 == t2) // Now true fmt.Println(t1.Equal(t2)) // Still true
Output:
Locations: UTC UTC Location pointers: 0x1e2100 0x1e2100 Locations equal: true true true
Try it on the go playground .