Go的最长时间是多长时间?

时间:2014-07-31 17:11:36

标签: date time go

我正在寻找有关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的最长时间是什么时间?它是在某处记录的吗?

3 个答案:

答案 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)

go中的

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 的回答确保 AfterBefore 可以工作,但其他 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)