Skip to content

Commit b71eafb

Browse files
time: use extended time format past end of zone transitions
This gives us better expected information for daylight savings time transitions in year 2038 and beyond. Fixes #36654 Change-Id: I5a39aed3c40b184e1d7bb7d6ce3aff5307c4c146 Reviewed-on: https://go-review.googlesource.com/c/go/+/215539 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 24a1c8f commit b71eafb

File tree

6 files changed

+523
-22
lines changed

6 files changed

+523
-22
lines changed

src/time/export_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,43 @@ var (
3636
ReadFile = readFile
3737
LoadTzinfo = loadTzinfo
3838
NextStdChunk = nextStdChunk
39+
Tzset = tzset
40+
TzsetName = tzsetName
41+
TzsetOffset = tzsetOffset
3942
)
4043

4144
func LoadFromEmbeddedTZData(zone string) (string, error) {
4245
return loadFromEmbeddedTZData(zone)
4346
}
4447

48+
type RuleKind int
49+
50+
const (
51+
RuleJulian = RuleKind(ruleJulian)
52+
RuleDOY = RuleKind(ruleDOY)
53+
RuleMonthWeekDay = RuleKind(ruleMonthWeekDay)
54+
)
55+
56+
type Rule struct {
57+
Kind RuleKind
58+
Day int
59+
Week int
60+
Mon int
61+
Time int
62+
}
63+
64+
func TzsetRule(s string) (Rule, string, bool) {
65+
r, rs, ok := tzsetRule(s)
66+
rr := Rule{
67+
Kind: RuleKind(r.kind),
68+
Day: r.day,
69+
Week: r.week,
70+
Mon: r.mon,
71+
Time: r.time,
72+
}
73+
return rr, rs, ok
74+
}
75+
4576
// StdChunkNames maps from nextStdChunk results to the matched strings.
4677
var StdChunkNames = map[int]string{
4778
0: "",

src/time/time.go

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,34 @@ func daysIn(m Month, year int) int {
10191019
return int(daysBefore[m] - daysBefore[m-1])
10201020
}
10211021

1022+
// daysSinceEpoch takes a year and returns the number of days from
1023+
// the absolute epoch to the start of that year.
1024+
// This is basically (year - zeroYear) * 365, but accounting for leap days.
1025+
func daysSinceEpoch(year int) uint64 {
1026+
y := uint64(int64(year) - absoluteZeroYear)
1027+
1028+
// Add in days from 400-year cycles.
1029+
n := y / 400
1030+
y -= 400 * n
1031+
d := daysPer400Years * n
1032+
1033+
// Add in 100-year cycles.
1034+
n = y / 100
1035+
y -= 100 * n
1036+
d += daysPer100Years * n
1037+
1038+
// Add in 4-year cycles.
1039+
n = y / 4
1040+
y -= 4 * n
1041+
d += daysPer4Years * n
1042+
1043+
// Add in non-leap years.
1044+
n = y
1045+
d += 365 * n
1046+
1047+
return d
1048+
}
1049+
10221050
// Provided by package runtime.
10231051
func now() (sec int64, nsec int32, mono int64)
10241052

@@ -1327,28 +1355,8 @@ func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) T
13271355
hour, min = norm(hour, min, 60)
13281356
day, hour = norm(day, hour, 24)
13291357

1330-
y := uint64(int64(year) - absoluteZeroYear)
1331-
13321358
// Compute days since the absolute epoch.
1333-
1334-
// Add in days from 400-year cycles.
1335-
n := y / 400
1336-
y -= 400 * n
1337-
d := daysPer400Years * n
1338-
1339-
// Add in 100-year cycles.
1340-
n = y / 100
1341-
y -= 100 * n
1342-
d += daysPer100Years * n
1343-
1344-
// Add in 4-year cycles.
1345-
n = y / 4
1346-
y -= 4 * n
1347-
d += daysPer4Years * n
1348-
1349-
// Add in non-leap years.
1350-
n = y
1351-
d += 365 * n
1359+
d := daysSinceEpoch(year)
13521360

13531361
// Add in days before this month.
13541362
d += uint64(daysBefore[month-1])

src/time/time_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ var nanoutctests = []TimeTest{
6666
var localtests = []TimeTest{
6767
{0, parsedTime{1969, December, 31, 16, 0, 0, 0, Wednesday, -8 * 60 * 60, "PST"}},
6868
{1221681866, parsedTime{2008, September, 17, 13, 4, 26, 0, Wednesday, -7 * 60 * 60, "PDT"}},
69+
{2159200800, parsedTime{2038, June, 3, 11, 0, 0, 0, Thursday, -7 * 60 * 60, "PDT"}},
70+
{2152173599, parsedTime{2038, March, 14, 1, 59, 59, 0, Sunday, -8 * 60 * 60, "PST"}},
71+
{2152173600, parsedTime{2038, March, 14, 3, 0, 0, 0, Sunday, -7 * 60 * 60, "PDT"}},
72+
{2152173601, parsedTime{2038, March, 14, 3, 0, 1, 0, Sunday, -7 * 60 * 60, "PDT"}},
73+
{2172733199, parsedTime{2038, November, 7, 1, 59, 59, 0, Sunday, -7 * 60 * 60, "PDT"}},
74+
{2172733200, parsedTime{2038, November, 7, 1, 0, 0, 0, Sunday, -8 * 60 * 60, "PST"}},
75+
{2172733201, parsedTime{2038, November, 7, 1, 0, 1, 0, Sunday, -8 * 60 * 60, "PST"}},
6976
}
7077

7178
var nanolocaltests = []TimeTest{

0 commit comments

Comments
 (0)