1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use std::time;
use {Duration, Instant};
pub struct Clock;
lazy_static! {
static ref CLOCK_OFFSET: u64 = clock_offset();
}
impl Clock {
#[inline]
pub fn now_since_epoch() -> Duration {
let offset = *CLOCK_OFFSET;
let unix_ts_now = Instant::now().as_u64().wrapping_add(offset);
Duration::from_u64(unix_ts_now)
}
#[inline]
pub fn recent_since_epoch() -> Duration {
let offset = *CLOCK_OFFSET;
let unix_ts_now = Instant::recent().as_u64().wrapping_add(offset);
Duration::from_u64(unix_ts_now)
}
#[inline]
pub fn update() {
Instant::update()
}
}
fn clock_offset() -> u64 {
let unix_ts_now_sys = time::SystemTime::now()
.duration_since(time::UNIX_EPOCH)
.expect("The system clock is not properly set");
let unix_ts_now = Duration::from(unix_ts_now_sys);
let unix_ts_now = unix_ts_now.as_u64();
let instant_now = Instant::now().as_u64();
let clock_offset = instant_now.wrapping_sub(unix_ts_now);
clock_offset
}