Substrate 中的时间戳算法

Timestamp Arithmetic in Substrate

我可以在 substrate runtime 模块中获取当前时间戳作为 <timestamp::Module<T>>::get()

如何用它进行基本算术运算(加法、减法)?

decl_module! {
  pub struct Module<T: Trait> for enum Call where origin: T::Origin {
    fn deposit_event<T>() = default;

    pub fn func1(origin) -> Result {
      let now = <timestamp::Module<T>>::get();
      const DURATION = 60 * 5;
      // what is the proper way of performing the following operation?
      // let future = now + DURATION; 

      // At some point in future, can I perform the following comparison?
      if now > future { 
        // ... some code 
      }
    }
  }
}

进一步的问题

这提出了一个我不确定 Rust / Rust 文档的问题。类型 T::Moment has to have trait SimpleArithmetic,这反过来要求类型具有特征 TryInto<u32>.

所以这应该有效,

let tmp: u32 = DURATION + now.try_into()?;

但实际返回:

error[E0277]: cannot add `()` to `u32`
| no implementation for `u32 + ()`
|
= help: the trait `core::ops::Add<()>` is not implemented for `u32`

error[E0271]: type mismatch resolving `<() as core::convert::TryFrom<<T as srml_timestamp::Trait>::Moment>>::Error == &str`
| note: expected type `core::convert::Infallible`
=               found type `&str`

进一步的问题 - 2

基本上,我经历了。你能 post 举个例子,如何从 Timestamp 转换为 u32/u64,以及如何从 u32/u64 转换为 Timestamp , 需要额外引入哪些模块?

谢谢。

我不知道如何使用 into()try_into()from()try_from()

但是根据 Shawn 示例和 Bryan 所说要避免的内容,我可以通过以下方式轻松地将时间戳转换为 u64:now.as_().

如果有人可以使用 into()from() 或其变体向我展示答案,我将很乐意更新此线程并将其标记为正确答案。