samod_core/
unix_timestamp.rs1use std::{
2 ops::{Add, AddAssign, Sub},
3 time::{Duration, SystemTime, UNIX_EPOCH},
4};
5
6#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct UnixTimestamp {
8 millis: u128,
9}
10
11impl std::fmt::Display for UnixTimestamp {
12 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13 write!(f, "{}", self.millis)
14 }
15}
16
17impl std::fmt::Debug for UnixTimestamp {
18 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19 write!(f, "{}", self.millis)
20 }
21}
22
23impl UnixTimestamp {
24 pub fn now() -> Self {
25 Self {
26 millis: SystemTime::now()
27 .duration_since(UNIX_EPOCH)
28 .unwrap()
29 .as_millis(),
30 }
31 }
32
33 pub fn from_millis(millis: u128) -> Self {
34 Self { millis }
35 }
36
37 pub fn as_millis(&self) -> u128 {
38 self.millis
39 }
40}
41
42impl From<UnixTimestamp> for i64 {
43 fn from(ts: UnixTimestamp) -> i64 {
44 ts.millis as i64
45 }
46}
47
48impl AddAssign<Duration> for UnixTimestamp {
49 fn add_assign(&mut self, rhs: Duration) {
50 self.millis += rhs.as_millis();
51 }
52}
53
54impl Add<Duration> for UnixTimestamp {
55 type Output = Self;
56
57 fn add(self, rhs: Duration) -> Self::Output {
58 Self {
59 millis: self.millis + rhs.as_millis(),
60 }
61 }
62}
63
64impl Sub<Duration> for UnixTimestamp {
65 type Output = Self;
66
67 fn sub(self, rhs: Duration) -> Self::Output {
68 Self {
69 millis: self.millis - rhs.as_millis(),
70 }
71 }
72}
73
74impl Sub<UnixTimestamp> for UnixTimestamp {
75 type Output = Duration;
76
77 fn sub(self, rhs: Self) -> Self::Output {
78 let diff = self.millis - rhs.millis;
79 Duration::from_millis(diff as u64)
80 }
81}