use std::time::{SystemTime, UNIX_EPOCH};
pub const UNIX_EPOCH_TICKS: i64 = 621_355_968_000_000_000;
pub const TICKS_PER_SECOND: i64 = 10_000_000;
pub const TICKS_PER_MILLISECOND: i64 = 10_000;
#[inline]
pub fn utc_now_ticks() -> i64 {
let dur = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default();
(dur.as_nanos() / 100) as i64 + UNIX_EPOCH_TICKS
}
#[inline]
pub fn seconds_from_diff_utc_now_ticks(ticks: i64) -> i64 {
seconds_from_diff_ticks(ticks, utc_now_ticks())
}
#[inline]
pub fn seconds_from_diff_ticks(ticks: i64, now_ticks: i64) -> i64 {
if ticks > 0 {
let diff = ticks - now_ticks;
if diff > 0 {
(diff + TICKS_PER_SECOND / 2) / TICKS_PER_SECOND
} else {
-1
}
} else {
-1
}
}
#[inline]
pub fn milliseconds_from_diff_utc_now_ticks(ticks: i64) -> i64 {
milliseconds_from_diff_ticks(ticks, utc_now_ticks())
}
#[inline]
pub fn milliseconds_from_diff_ticks(ticks: i64, now_ticks: i64) -> i64 {
if ticks > 0 {
let diff = ticks - now_ticks;
if diff > 0 {
diff / TICKS_PER_MILLISECOND
} else {
-1
}
} else {
-1
}
}
#[inline]
pub fn unix_timestamp_in_seconds_to_ticks(unix_timestamp: i64) -> i64 {
unix_timestamp * TICKS_PER_SECOND + UNIX_EPOCH_TICKS
}
#[inline]
pub fn unix_timestamp_in_milliseconds_to_ticks(unix_timestamp: i64) -> i64 {
unix_timestamp * TICKS_PER_MILLISECOND + UNIX_EPOCH_TICKS
}
#[inline]
pub fn unix_time_in_seconds_from_ticks(ticks: i64) -> i64 {
if ticks > 0 {
(ticks - UNIX_EPOCH_TICKS) / TICKS_PER_SECOND
} else {
-1
}
}
#[inline]
pub fn unix_time_in_milliseconds_from_ticks(ticks: i64) -> i64 {
if ticks > 0 {
(ticks - UNIX_EPOCH_TICKS) / TICKS_PER_MILLISECOND
} else {
-1
}
}