diff --git a/src/time/time.go b/src/time/time.go index c63910cd91e6a8..ca53848ae10721 100644 --- a/src/time/time.go +++ b/src/time/time.go @@ -1552,7 +1552,7 @@ func (t *Time) UnmarshalBinary(data []byte) error { buf = buf[4:] offset := int(int16(buf[1])|int16(buf[0])<<8) * 60 if version == timeBinaryVersionV2 { - offset += int(buf[2]) + offset += int(int8(buf[2])) } *t = Time{} diff --git a/src/time/time_test.go b/src/time/time_test.go index a453ee043c4985..8ff3b70c8446d5 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -1752,6 +1752,29 @@ func TestMarshalBinaryVersion2(t *testing.T) { } } +func TestMarshalBinaryVersion2Bugfix(t *testing.T) { + offsetSec := -5*3600 - 30*60 - 45 // -19845 + loc := FixedZone("LMT", offsetSec) + + t1 := Date(2024, 6, 15, 12, 0, 0, 0, loc) + b, err := t1.MarshalBinary() + if err != nil { + t.Errorf("Failed to Marshal, error = %v", err) + } + + t2 := Time{} + err = t2.UnmarshalBinary(b) + if err != nil { + t.Errorf("Failed to Unmarshal, error = %v", err) + } + + _, t1OriginOffset := t1.Zone() + _, t2OriginOffset := t2.Zone() + if t1OriginOffset != t2OriginOffset { + t.Errorf("The result offsetSec: %d after Unmarshal is not matched original offsetSec: %d", t2OriginOffset, t1OriginOffset) + } +} + func TestUnmarshalTextAllocations(t *testing.T) { in := []byte(testdataRFC3339UTC) // short enough to be stack allocated if allocs := testing.AllocsPerRun(100, func() {