diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d46d6f756..487237871f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ Versions with only mechanical changes will be omitted from the following list. * Add `DurationRound` trait that allows rounding and truncating by `Duration` (@robyoung) +### Internal Improvements + +* Code improvements to impl `From` for `js_sys` in wasm to reuse code (@schrieveslaach) + + ## 0.4.12 ### New Methods and impls diff --git a/Cargo.toml b/Cargo.toml index ab5742f2cd..3596c0a0ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,7 +52,7 @@ criterion = { version = "0.3" } doc-comment = { version = "0.3" } [target.'cfg(all(target_arch = "wasm32", not(any(target_os = "emscripten", target_os = "wasi"))))'.dev-dependencies] -wasm-bindgen-test = "0.2" +wasm-bindgen-test = "0.3" [package.metadata.docs.rs] features = ["serde"] diff --git a/ci/github.sh b/ci/github.sh index 29335dd99f..3c1c873850 100755 --- a/ci/github.sh +++ b/ci/github.sh @@ -91,9 +91,8 @@ test_wasm() { test_wasm_simple() { now=$(date +%s) - for tz in "${TEST_TZS[@]}"; do - runt env TZ="$tz" NOW="$now" wasm-pack test --node -- --features wasmbind - done + tz=$(date +%z) + runt env TZ="$tz" NOW="$now" wasm-pack test --node -- --features wasmbind } main "$@" diff --git a/src/datetime.rs b/src/datetime.rs index cb33709830..0c0a97753d 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -753,22 +753,18 @@ impl From> for SystemTime { #[cfg(all(target_arch = "wasm32", not(target_os = "wasi"), feature = "wasmbind"))] impl From for DateTime { fn from(date: js_sys::Date) -> DateTime { - let time = date.get_time() as i64; - DateTime::::from_utc( - NaiveDateTime::from_timestamp(time / 1000, ((time % 1000) * 1_000_000) as u32), - Utc, - ) + DateTime::::from(&date) } } #[cfg(all(target_arch = "wasm32", not(target_os = "wasi"), feature = "wasmbind"))] impl From<&js_sys::Date> for DateTime { fn from(date: &js_sys::Date) -> DateTime { - let time = date.get_time() as i64; - DateTime::::from_utc( - NaiveDateTime::from_timestamp(time / 1000, ((time % 1000) * 1_000_000) as u32), - Utc, - ) + let millisecs_since_unix_epoch: u64 = date.get_time() as u64; + let secs = millisecs_since_unix_epoch / 1000; + let nanos = 1_000_000 * (millisecs_since_unix_epoch % 1000); + let naive = NaiveDateTime::from_timestamp(secs as i64, nanos as u32); + DateTime::from_utc(naive, Utc) } } diff --git a/src/offset/utc.rs b/src/offset/utc.rs index 23b536f2c0..de38594b77 100644 --- a/src/offset/utc.rs +++ b/src/offset/utc.rs @@ -54,11 +54,7 @@ impl Utc { #[cfg(all(target_arch = "wasm32", not(target_os = "wasi"), feature = "wasmbind"))] pub fn now() -> DateTime { let now = js_sys::Date::new_0(); - let millisecs_since_unix_epoch: u64 = now.get_time() as u64; - let secs = millisecs_since_unix_epoch / 1000; - let nanos = 1_000_000 * (millisecs_since_unix_epoch - 1000 * secs); - let naive = NaiveDateTime::from_timestamp(secs as i64, nanos as u32); - DateTime::from_utc(naive, Utc) + DateTime::::from(now) } } diff --git a/tests/wasm.rs b/tests/wasm.rs index 7fa9add457..e063fcf894 100644 --- a/tests/wasm.rs +++ b/tests/wasm.rs @@ -12,17 +12,36 @@ mod test { let local: DateTime = Local::now(); // Ensure time fetched is correct - let actual = Utc.datetime_from_str(env!("NOW"), "%s").unwrap(); + let actual = Utc.datetime_from_str(&env!("NOW"), "%s").unwrap(); assert!(utc - actual < chrono::Duration::minutes(5)); + let tz = env!("TZ"); + eprintln!("testing with tz={}", tz); + // Ensure offset retrieved when getting local time is correct - let expected_offset = match env!("TZ") { + let expected_offset = match tz { "ACST-9:30" => FixedOffset::east(19 * 30 * 60), "Asia/Katmandu" => FixedOffset::east(23 * 15 * 60), // No DST thankfully - "EST4" => FixedOffset::east(-4 * 60 * 60), - "UTC0" => FixedOffset::east(0), - _ => panic!("unexpected TZ"), + "EDT" | "EST4" | "-0400" => FixedOffset::east(-4 * 60 * 60), + "EST" | "-0500" => FixedOffset::east(-5 * 60 * 60), + "UTC0" | "+0000" => FixedOffset::east(0), + tz => panic!("unexpected TZ {}", tz), }; - assert_eq!(&expected_offset, local.offset()); + assert_eq!( + &expected_offset, + local.offset(), + "expected: {:?} local: {:?}", + expected_offset, + local.offset(), + ); + } + + #[wasm_bindgen_test] + fn from_is_exact() { + let now = js_sys::Date::new_0(); + + let dt = DateTime::::from(now.clone()); + + assert_eq!(now.get_time() as i64, dt.timestamp_millis()); } }