[dart2wasm] Implement unimplemented methods in `DateTime`.

Change-Id: Ia84d2e65ab6207fc70f6f8380c18ba3b89f7400f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/251590
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Joshua Litt <joshualitt@google.com>
diff --git a/pkg/dart2wasm/bin/run_wasm.js b/pkg/dart2wasm/bin/run_wasm.js
index 0078a7b..a0673a0 100644
--- a/pkg/dart2wasm/bin/run_wasm.js
+++ b/pkg/dart2wasm/bin/run_wasm.js
@@ -163,6 +163,19 @@
         var factoryFunction = constructor.bind.apply(constructor, [null, ...args]);
         return new factoryFunction();
     },
+    getTimeZoneNameForSeconds: function(secondsSinceEpoch) {
+        var date = new Date(secondsSinceEpoch * 1000);
+        var match = /\((.*)\)/.exec(date.toString());
+        if (match == null) {
+            // This should never happen on any recent browser.
+            return '';
+        }
+        return stringToDartString(match[1]);
+
+    },
+    getTimeZoneOffsetInSeconds: function(secondsSinceEpoch) {
+        return new Date(secondsSinceEpoch * 1000).getTimezoneOffset() * 60;
+    },
 };
 
 function instantiate(filename, imports) {
diff --git a/sdk/lib/_internal/wasm/lib/date_patch.dart b/sdk/lib/_internal/wasm/lib/date_patch.dart
index 9b31078..72f91011 100644
--- a/sdk/lib/_internal/wasm/lib/date_patch.dart
+++ b/sdk/lib/_internal/wasm/lib/date_patch.dart
@@ -17,16 +17,19 @@
 class DateTime {
   // Natives.
   // The natives have been moved up here to work around Issue 10401.
-  @pragma("vm:external-name", "DateTime_currentTimeMicros")
   static int _getCurrentMicros() =>
       (_jsDateNow() * Duration.microsecondsPerMillisecond).toInt();
 
-  @pragma("vm:external-name", "DateTime_timeZoneName")
-  external static String _timeZoneNameForClampedSeconds(int secondsSinceEpoch);
+  @pragma("wasm:import", "dart2wasm.getTimeZoneNameForSeconds")
+  external static String _timeZoneNameForClampedSecondsRaw(
+      double secondsSinceEpoch);
 
-  @pragma("vm:external-name", "DateTime_timeZoneOffsetInSeconds")
-  external static int _timeZoneOffsetInSecondsForClampedSeconds(
-      int secondsSinceEpoch);
+  static String _timeZoneNameForClampedSeconds(int secondsSinceEpoch) =>
+      _timeZoneNameForClampedSecondsRaw(secondsSinceEpoch.toDouble());
+
+  @pragma("wasm:import", "dart2wasm.getTimeZoneOffsetInSeconds")
+  external static double _timeZoneOffsetInSecondsForClampedSeconds(
+      double secondsSinceEpoch);
 
   static const _MICROSECOND_INDEX = 0;
   static const _MILLISECOND_INDEX = 1;
@@ -424,7 +427,9 @@
 
   static int _timeZoneOffsetInSeconds(int microsecondsSinceEpoch) {
     int equivalentSeconds = _equivalentSeconds(microsecondsSinceEpoch);
-    return _timeZoneOffsetInSecondsForClampedSeconds(equivalentSeconds);
+    return _timeZoneOffsetInSecondsForClampedSeconds(
+            equivalentSeconds.toDouble())
+        .toInt();
   }
 
   static String _timeZoneName(int microsecondsSinceEpoch) {