summaryrefslogtreecommitdiff
path: root/vendor/time/src/interop/js_sys_date_offsetdatetime.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/time/src/interop/js_sys_date_offsetdatetime.rs')
-rw-r--r--vendor/time/src/interop/js_sys_date_offsetdatetime.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/vendor/time/src/interop/js_sys_date_offsetdatetime.rs b/vendor/time/src/interop/js_sys_date_offsetdatetime.rs
new file mode 100644
index 00000000..ecbd601e
--- /dev/null
+++ b/vendor/time/src/interop/js_sys_date_offsetdatetime.rs
@@ -0,0 +1,27 @@
+use num_conv::prelude::*;
+
+use crate::convert::*;
+use crate::OffsetDateTime;
+
+impl From<js_sys::Date> for OffsetDateTime {
+ /// # Panics
+ ///
+ /// This may panic if the timestamp can not be represented.
+ fn from(js_date: js_sys::Date) -> Self {
+ // get_time() returns milliseconds
+ let timestamp_nanos = js_date.get_time() as i128
+ * Nanosecond::per(Millisecond).cast_signed().extend::<i128>();
+ Self::from_unix_timestamp_nanos(timestamp_nanos)
+ .expect("invalid timestamp: Timestamp cannot fit in range")
+ }
+}
+
+impl From<OffsetDateTime> for js_sys::Date {
+ fn from(datetime: OffsetDateTime) -> Self {
+ // new Date() takes milliseconds
+ let timestamp = (datetime.unix_timestamp_nanos()
+ / Nanosecond::per(Millisecond).cast_signed().extend::<i128>())
+ as f64;
+ Self::new(&timestamp.into())
+ }
+}