Какое максимальное время.Время в Go?

Я ищу документацию по максимальному времени.Время идти.

другие языки делают его явным, например, в C#: http://msdn.microsoft.com/en-us/library/system.datetime.maxvalue(v=vs. 110).aspx

public static readonly DateTime MaxValue

значение этой константы эквивалентно 23:59:59.9999999, декабрь 31, 9999, ровно 100 наносекунд до 00: 00: 00, 1 января, 10000.

что такое максимальное время.Время в Go? Это где-то документально?

2 ответов


время в go хранится как int64 плюс 32-битное значение наносекунды (в настоящее время uintptr по техническим причинам), поэтому нет никакого реального беспокойства о запуске.

t := time.Unix(1<<63-1, 0)
fmt.Println(t.UTC())

печать 219250468-12-04 15:30:07 +0000 UTC

Если по какой-то причине вы хотите полезный максимальное время (см. @cce ответ для деталей), вы можете использовать:

maxTime := time.Unix(1<<63-62135596801, 999999999)

time.Time в go хранится как int64 плюс 32-разрядное наносекундное значение, но если вы используете ответ @JimB, вы вызовете переполнение целого числа на sec компонент и сравнения типа time.Before() не будет работать.

это так time.Unix(sec, nsec) добавляет смещение 62135596800 секунд в sec это представляет количество секунд между годом 1 (нулевое время в Go) и 1970 (нулевое время в Unix).

@twotwotwo's playground пример делает это ясно в http://play.golang.org/p/i6S_T4-X3v но вот дистиллированная версия.

// number of seconds between Year 1 and 1970 (62135596800 seconds)
unixToInternal := int64((1969*365 + 1969/4 - 1969/100 + 1969/400) * 24 * 60 * 60)

// max1 gets time.Time struct: {-9223371974719179009 999999999}
max1 := time.Unix(1<<63-1, 999999999)
// max2 gets time.Time struct: {9223372036854775807 999999999}
max2 := time.Unix(1<<63-1-unixToInternal, 999999999)

// t0 is definitely before the year 292277026596
t0 := time.Date(2015, 9, 16, 19, 17, 23, 0, time.UTC)

// t0 < max1 doesn't work: prints false
fmt.Println(t0.Before(max1))
// max1 < t0 doesn't work: prints true
fmt.Println(t0.After(max1))
fmt.Println(max1.Before(t0))

// t0 < max2 works: prints true
fmt.Println(t0.Before(max2))
// max2 < t0 works: prints false
fmt.Println(t0.After(max2))
fmt.Println(max2.Before(t0))

так что пока это немного боли, вы можете использовать time.Unix(1<<63-62135596801, 999999999) если вы хотите max time.Time это полезно для сравнений, таких как поиск минимального значения в диапазоне времен.