Skip to content

Commit 8e81871

Browse files
committed
[GR-32236] ZoneRulesBasedTimeZone should use offset after (not before) a transition.
PullRequest: js/2489
2 parents efa926d + 36a9ea7 commit 8e81871

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/builtins/JSDate.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,12 @@ private static int getOffset(TimeZone timeZone, long t, boolean isUTC) {
428428

429429
// dstOffset = 0, look back by standard DST savings
430430
int dstSavings = timeZone.getDSTSavings();
431+
if (dstSavings == 0) {
432+
// getDSTSavings() returns 0 for some time-zones (like America/Sao_Paulo)
433+
// that stopped to use DST. Unfortunately, we may have a date that
434+
// used DST still => try to use the usual DST savings (1 hour)
435+
dstSavings = 3600000;
436+
}
431437
offset = getOffset(timeZone, date - dstSavings, fields);
432438
int dstOffset = offset - rawOffset;
433439
if (dstOffset != 0 && dstOffset != dstSavings) {

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/util/ZoneRulesBasedTimeZone.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.time.ZoneOffset;
5151
import java.time.zone.ZoneRules;
5252
import java.util.Date;
53+
import java.util.List;
5354

5455
/**
5556
* Implementation of ICU4J {@code TimeZone} that takes time-zone data from the provided
@@ -70,7 +71,14 @@ public int getOffset(int era, int year, int month, int day, int dayOfWeek, int m
7071
LocalDate date = LocalDate.of((era == GregorianCalendar.BC) ? -year : year, month + 1, day);
7172
LocalTime time = LocalTime.ofNanoOfDay(1000000L * milliseconds);
7273
LocalDateTime dateTime = LocalDateTime.of(date, time);
73-
return toMillis(rules.getOffset(dateTime));
74+
List<ZoneOffset> offsets = rules.getValidOffsets(dateTime);
75+
ZoneOffset offset;
76+
if (offsets.size() == 1) {
77+
offset = offsets.get(0);
78+
} else {
79+
offset = rules.getTransition(dateTime).getOffsetAfter();
80+
}
81+
return toMillis(offset);
7482
}
7583

7684
@Override

0 commit comments

Comments
 (0)