use chrono::{DateTime, TimeZone, Utc};
pub fn get_now() -> DateTime<Utc> {
Utc::now()
}
pub fn get_now_as_secs() -> i64 {
get_now().timestamp()
}
pub fn get_now_as_ms() -> i64 {
get_now().timestamp_millis()
}
pub fn get_ms_as_datetime(ms: i64) -> DateTime<Utc> {
Utc.timestamp_nanos(ms * 1_000_000)
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::TimeZone;
#[test]
fn test_get_now() {
let now = get_now();
let system_now = Utc::now();
assert!((system_now - now).num_seconds().abs() < 1);
}
#[test]
fn test_get_now_as_secs() {
let now_secs = get_now_as_secs();
let system_now_secs = Utc::now().timestamp();
assert!((system_now_secs - now_secs).abs() < 1);
}
#[test]
fn test_get_now_as_ms() {
let now_ms = get_now_as_ms();
let system_now_ms = Utc::now().timestamp_millis();
assert!((system_now_ms - now_ms).abs() < 1000); }
#[test]
fn test_get_ms_as_datetime() {
let now_ms = get_now_as_ms();
let datetime = get_ms_as_datetime(now_ms);
let system_datetime = Utc::now();
assert!((system_datetime.timestamp_millis() - datetime.timestamp_millis()).abs() < 1000);
}
#[test]
fn test_get_ms_as_datetime_specific_value() {
let ms = 1_600_000_000_000; let datetime = get_ms_as_datetime(ms);
let expected_datetime = Utc.timestamp_opt(1_600_000_000, 0).unwrap(); assert_eq!(datetime, expected_datetime);
}
}