Skip to content

Commit

Permalink
[release-branch.go1.14] time: use extended time format past end of zo…
Browse files Browse the repository at this point in the history
…ne transitions

This gives us better expected information for daylight savings time
transitions in year 2038 and beyond.

For #36654
For #42155

Change-Id: I5a39aed3c40b184e1d7bb7d6ce3aff5307c4c146
Reviewed-on: https://go-review.googlesource.com/c/go/+/215539
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
(cherry picked from commit b71eafb)
Reviewed-on: https://go-review.googlesource.com/c/go/+/264302
Trust: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
  • Loading branch information
ianlancetaylor committed Oct 29, 2020
1 parent 3109de2 commit 1f040e0
Show file tree
Hide file tree
Showing 6 changed files with 523 additions and 22 deletions.
31 changes: 31 additions & 0 deletions src/time/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,39 @@ var (
ReadFile = readFile
LoadTzinfo = loadTzinfo
NextStdChunk = nextStdChunk
Tzset = tzset
TzsetName = tzsetName
TzsetOffset = tzsetOffset
)

type RuleKind int

const (
RuleJulian = RuleKind(ruleJulian)
RuleDOY = RuleKind(ruleDOY)
RuleMonthWeekDay = RuleKind(ruleMonthWeekDay)
)

type Rule struct {
Kind RuleKind
Day int
Week int
Mon int
Time int
}

func TzsetRule(s string) (Rule, string, bool) {
r, rs, ok := tzsetRule(s)
rr := Rule{
Kind: RuleKind(r.kind),
Day: r.day,
Week: r.week,
Mon: r.mon,
Time: r.time,
}
return rr, rs, ok
}

// StdChunkNames maps from nextStdChunk results to the matched strings.
var StdChunkNames = map[int]string{
0: "",
Expand Down
50 changes: 29 additions & 21 deletions src/time/time.go
Original file line number Diff line number Diff line change
Expand Up @@ -1074,6 +1074,34 @@ func daysIn(m Month, year int) int {
return int(daysBefore[m] - daysBefore[m-1])
}

// daysSinceEpoch takes a year and returns the number of days from
// the absolute epoch to the start of that year.
// This is basically (year - zeroYear) * 365, but accounting for leap days.
func daysSinceEpoch(year int) uint64 {
y := uint64(int64(year) - absoluteZeroYear)

// Add in days from 400-year cycles.
n := y / 400
y -= 400 * n
d := daysPer400Years * n

// Add in 100-year cycles.
n = y / 100
y -= 100 * n
d += daysPer100Years * n

// Add in 4-year cycles.
n = y / 4
y -= 4 * n
d += daysPer4Years * n

// Add in non-leap years.
n = y
d += 365 * n

return d
}

// Provided by package runtime.
func now() (sec int64, nsec int32, mono int64)

Expand Down Expand Up @@ -1382,28 +1410,8 @@ func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) T
hour, min = norm(hour, min, 60)
day, hour = norm(day, hour, 24)

y := uint64(int64(year) - absoluteZeroYear)

// Compute days since the absolute epoch.

// Add in days from 400-year cycles.
n := y / 400
y -= 400 * n
d := daysPer400Years * n

// Add in 100-year cycles.
n = y / 100
y -= 100 * n
d += daysPer100Years * n

// Add in 4-year cycles.
n = y / 4
y -= 4 * n
d += daysPer4Years * n

// Add in non-leap years.
n = y
d += 365 * n
d := daysSinceEpoch(year)

// Add in days before this month.
d += uint64(daysBefore[month-1])
Expand Down
7 changes: 7 additions & 0 deletions src/time/time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ var nanoutctests = []TimeTest{
var localtests = []TimeTest{
{0, parsedTime{1969, December, 31, 16, 0, 0, 0, Wednesday, -8 * 60 * 60, "PST"}},
{1221681866, parsedTime{2008, September, 17, 13, 4, 26, 0, Wednesday, -7 * 60 * 60, "PDT"}},
{2159200800, parsedTime{2038, June, 3, 11, 0, 0, 0, Thursday, -7 * 60 * 60, "PDT"}},
{2152173599, parsedTime{2038, March, 14, 1, 59, 59, 0, Sunday, -8 * 60 * 60, "PST"}},
{2152173600, parsedTime{2038, March, 14, 3, 0, 0, 0, Sunday, -7 * 60 * 60, "PDT"}},
{2152173601, parsedTime{2038, March, 14, 3, 0, 1, 0, Sunday, -7 * 60 * 60, "PDT"}},
{2172733199, parsedTime{2038, November, 7, 1, 59, 59, 0, Sunday, -7 * 60 * 60, "PDT"}},
{2172733200, parsedTime{2038, November, 7, 1, 0, 0, 0, Sunday, -8 * 60 * 60, "PST"}},
{2172733201, parsedTime{2038, November, 7, 1, 0, 1, 0, Sunday, -8 * 60 * 60, "PST"}},
}

var nanolocaltests = []TimeTest{
Expand Down
Loading

0 comments on commit 1f040e0

Please sign in to comment.