我正在寻找有关Max time.Time的文档。
其他语言使其明确,例如在C#:http://msdn.microsoft.com/en-us/library/system.datetime.maxvalue(v=vs.110).aspx
中public static readonly DateTime MaxValue
此常量的值相当于12月23:59:59.9999999 31,9999,正好在1月1日00:00:00之前的100纳秒刻度, 10000
Go的最长时间是什么时间?它是在某处记录的吗?
答案 0 :(得分:16)
go的时间存储为int64加上32bit Nanosec值(由于技术原因目前是uintptr),所以不用担心用完了。
t := time.Unix(1<<63-1, 0)
fmt.Println(t.UTC())
打印219250468-12-04 15:30:07 +0000 UTC
如果由于某种原因您需要有用的最长时间(有关详细信息,请参阅@cce's answer),您可以使用:
maxTime := time.Unix(1<<63-62135596801, 999999999)
答案 1 :(得分:13)
time.Time
存储为int64加上32位纳秒值,但如果使用@ JimB的答案,则会触发sec
组件上的整数溢出以及{{1}之类的比较无效。
这是因为time.Before()
向time.Unix(sec, nsec)
添加了62135596800秒的偏移量,表示第1年(Go中为零时)和1970之间(Unix中为零时)之间的秒数。
@ twotwotwo的游乐场示例在http://play.golang.org/p/i6S_T4-X3v中明确说明了这一点,但这是一个提炼版本。
sec
因此,如果你想要一个对比较有用的最大// 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)
虽然有点痛苦,例如在一定范围内找到最小值。
答案 2 :(得分:1)
请注意,虽然@cce 的回答确保 After
和 Before
可以工作,但其他 API 却不能。 UnixNano
仅在 1970 年左右(1678 年和 2262 年之间)±292 年内有效。此外,由于最长持续时间约为 292 年,即使是这两个也会在 Sub
上给出一个限制结果。
因此,另一种方法是选择一个最小[1] 值并执行以下操作:
var MinTime = time.Unix(-2208988800, 0) // Jan 1, 1900
var MaxTime = MinTime.Add(1<<63 - 1)
在这些范围内,一切都应该正常。
[1]:如果您不关心 1970 年之前的日期,另一个明显的选择是 time.Unix(0, 0)
。