[ddc] Copy JS 2-digit year handling from dart2js.

Fixes https://github.com/dart-lang/sdk/issues/42894

Change-Id: I68a8782d123c299ec34bfd0a31b3108138dac117
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164681
Reviewed-by: Riley Porter <rileyporter@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Commit-Queue: Riley Porter <rileyporter@google.com>
This commit is contained in:
Riley Porter 2020-09-26 01:11:54 +00:00 committed by commit-bot@chromium.org
parent 22c3d24f77
commit febb1929cd
3 changed files with 40 additions and 0 deletions

View file

@ -354,6 +354,14 @@ class Primitives {
@nullCheck bool isUtc) {
final int MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
var jsMonth = month - 1;
// The JavaScript Date constructor 'corrects' year NN to 19NN. Sidestep that
// correction by adjusting years out of that range and compensating with an
// adjustment of months. This hack should not be sensitive to leap years but
// use 400 just in case.
if (0 <= years && years < 100) {
years += 400;
jsMonth -= 400 * 12;
}
int value;
if (isUtc) {
value = JS<int>('!', r'Date.UTC(#, #, #, #, #, #, #)', years, jsMonth,

View file

@ -0,0 +1,16 @@
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import "package:expect/expect.dart";
// The JavaScript Date constructor 'corrects' 2-digit years NN to 19NN.
// Verify that a DateTime with year 1 is created correctly.
// Regression test for https://github.com/dart-lang/sdk/issues/42894
main() {
var d = new DateTime(1, 0, 1, 0, 0, 0, 0);
var d2 = new DateTime(0, 12, 1, 0, 0, 0, 0);
Expect.equals(d, d2);
}

View file

@ -0,0 +1,16 @@
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import "package:expect/expect.dart";
// The JavaScript Date constructor 'corrects' 2-digit years NN to 19NN.
// Verify that a DateTime with year 1 is created correctly.
// Regression test for https://github.com/dart-lang/sdk/issues/42894
main() {
var d = new DateTime(1, 0, 1, 0, 0, 0, 0);
var d2 = new DateTime(0, 12, 1, 0, 0, 0, 0);
Expect.equals(d, d2);
}