You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何获取纪元锚点?Rust模拟Temporal API的浏览器实现疑问

在Rust中模拟Temporal Instant的跨平台实现方案

核心结论

浏览器端确实需要自行以标准UNIX纪元(1970-01-01T00:00:00Z)作为基准逻辑,因为JavaScript的Date体系本身就基于这个纪元,不需要额外依赖JS端的常量,直接在Rust代码里用这个时间点作为基准即可。

具体实现方案

1. 用条件编译区分跨平台实现

通过Rust的target_arch条件编译,分别处理Wasm(浏览器)和其他平台的内部存储:

#[cfg(not(target_arch = "wasm32"))]
use std::time::{SystemTime, UNIX_EPOCH, Duration};

#[cfg(target_arch = "wasm32")]
use js_sys::Date;

#[derive(Debug, Clone, Copy)]
pub struct Instant {
    #[cfg(not(target_arch = "wasm32"))]
    inner: SystemTime,
    #[cfg(target_arch = "wasm32")]
    // 存储纳秒级纪元时间,保留Temporal要求的高精度
    epoch_nanos: i64,
}

2. 实现from_epoch方法

  • 非浏览器平台:基于标准库的UNIX_EPOCH计算:
#[cfg(not(target_arch = "wasm32"))]
impl Instant {
    pub fn from_epoch(epoch_nanos: i64) -> Result<Self, &'static str> {
        let duration = Duration::from_nanos(epoch_nanos as u64);
        let system_time = UNIX_EPOCH.checked_add(duration)
            .ok_or("Invalid epoch nanoseconds value")?;
        Ok(Self { inner: system_time })
    }
}
  • 浏览器平台:直接以UNIX纪元为基准存储纳秒值,按需与JS的Date交互:
#[cfg(target_arch = "wasm32")]
impl Instant {
    pub fn from_epoch(epoch_nanos: i64) -> Result<Self, &'static str> {
        // 可选:校验值是否在JS Date可处理的范围内(约1970±2.8e5年)
        if epoch_nanos < -62135596800000000 || epoch_nanos > 86400000000000000 {
            return Err("Epoch nanoseconds out of valid range");
        }
        Ok(Self { epoch_nanos })
    }

    // 示例:转换为JS Date对象
    pub fn to_js_date(&self) -> Date {
        let epoch_ms = self.epoch_nanos / 1_000_000;
        Date::new_with_time_value(epoch_ms as f64)
    }
}

关键细节

  • 浏览器端无需额外定义纪元常量,因为Temporal和JS的Date共享同一个标准UNIX纪元基准。
  • 存储纳秒值而非直接使用Date对象,是为了保留Temporal API要求的纳秒级精度,避免Date仅支持毫秒精度带来的信息丢失。

内容的提问来源于stack exchange,提问作者Hydroper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:27:46