Какое максимальное время.Время в 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
это полезно для сравнений, таких как поиск минимального значения в диапазоне времен.