use chrono::{DateTime, Local, NaiveDateTime, TimeZone, Utc};
pub const TICK: i64 = 10000;
pub const SECOND: i64 = 1000;
pub const MINUTE: i64 = 60 * SECOND;
pub const HOUR: i64 = 60 * MINUTE;
pub const DAY: i64 = 24 * HOUR;
#[inline]
pub fn timestamp() -> i64 {
Utc::now().timestamp_nanos_opt().unwrap() / 100
}
#[inline]
pub fn timestamp_nanos() -> u64 {
Utc::now().timestamp_nanos_opt().unwrap() as u64
}
#[inline]
pub fn timestamp_milliseconds() -> i64 {
Utc::now().timestamp_nanos_opt().unwrap() / 1_000_000
}
#[inline]
pub fn timestamp_from_time(time: DateTime<Local>) -> i64 {
time.timestamp_nanos_opt().unwrap() / 100
}
#[inline]
pub fn local_timestamp() -> i64 {
Local::now().timestamp_nanos_opt().unwrap() / 100
}
#[inline]
pub fn utc_timestamp_from_time(time: DateTime<Utc>) -> i64 {
time.timestamp_nanos_opt().unwrap() / 100
}
#[inline]
pub fn timestamp_to_time(timestamp: i64) -> DateTime<Local> {
Local.timestamp_nanos(timestamp * 100)
}
#[inline]
pub fn timestamp_to_utc_time(utc_timestamp: i64) -> DateTime<Utc> {
Utc.timestamp_nanos(utc_timestamp * 100)
}
#[inline]
pub fn get_utc_sub_day(day: i64) -> i64 {
(Utc::now().timestamp_millis() - day * DAY) * TICK
}
#[inline]
pub fn get_utc_add_day(day: i64) -> i64 {
(Utc::now().timestamp_millis() + day * DAY) * TICK
}
#[inline]
pub fn get_utc_sub_minute(minute: i64) -> i64 {
(Utc::now().timestamp_millis() - minute * MINUTE) * 10000
}
#[inline]
pub fn get_utc_add_minute(minute: i64) -> i64 {
(Utc::now().timestamp_millis() + minute * MINUTE) * TICK
}
#[inline]
pub fn get_local_sub_day(day: i64) -> i64 {
(Local::now().timestamp_millis() - day * 24 * HOUR) * TICK
}
#[inline]
pub fn get_local_add_day(day: i64) -> i64 {
(Local::now().timestamp_millis() + day * DAY) * TICK
}
#[inline]
pub fn get_local_sub_minute(minute: i64) -> i64 {
(Local::now().timestamp_millis() - minute * MINUTE) * TICK
}
#[inline]
pub fn get_local_add_minute(minute: i64) -> i64 {
(Local::now().timestamp_millis() + minute * MINUTE) * TICK
}
#[inline]
pub fn utc_time_add_minute(time: DateTime<Utc>, minute: i64) -> i64 {
(time.timestamp_millis() + minute * MINUTE) * TICK
}
#[inline]
pub fn naive_time_add_minute(time: NaiveDateTime, minute: i64) -> i64 {
(time.and_utc().timestamp_millis() + minute * MINUTE) * TICK
}
#[inline]
pub fn utc_time_sub_minute(time: DateTime<Utc>, minute: i64) -> i64 {
(time.timestamp_millis() - minute * MINUTE) * TICK
}
#[inline]
pub fn time_add_minute(time: DateTime<Local>, minute: i64) -> i64 {
(time.timestamp_millis() + minute * MINUTE) * TICK
}
#[inline]
pub fn time_sub_minute(time: DateTime<Local>, minute: i64) -> i64 {
(time.timestamp_millis() - minute * MINUTE) * TICK
}
#[inline]
pub fn timestamp_add_minute(timestamp: i64, minute: i64) -> i64 {
timestamp + (minute * MINUTE * TICK)
}
#[inline]
pub fn timestamp_sub_minute(timestamp: i64, minute: i64) -> i64 {
timestamp - (minute * MINUTE * TICK)
}
#[inline]
pub fn new_uuid() -> String {
uuid::Uuid::new_v4().hyphenated().to_string()
}
#[inline]
pub fn get_now_day_timestamp(timezone_minute: i64) -> i64 {
let utc_zero = Utc::now()
.naive_utc()
.date()
.and_hms_opt(0, 0, 0)
.unwrap()
.and_utc()
.timestamp_nanos_opt()
.unwrap()
/ 100;
let timezone = timezone_minute * MINUTE * TICK;
utc_zero - timezone
}
#[inline]
pub fn get_now_add_day(timezone_minute: i64, day: i64) -> i64 {
get_now_day_timestamp(timezone_minute) + day * 864_000_000_000i64
}
#[inline]
pub fn get_now_sub_day(timezone_minute: i64, day: i64) -> i64 {
get_now_day_timestamp(timezone_minute) - day * 864_000_000_000i64
}
#[inline]
pub fn get_utc_now_day_timestamp() -> i64 {
Utc::now()
.date_naive()
.and_hms_opt(0, 0, 0)
.unwrap()
.and_utc()
.timestamp_nanos_opt()
.unwrap()
/ 100
}
#[inline]
pub fn get_utc_now_day_timestamp_for_zone(timezone_minute: i64) -> i64 {
get_now_day_timestamp(timezone_minute)
}
#[inline]
pub fn get_utc_now_add_day(day: i64) -> i64 {
get_utc_now_day_timestamp() + day * 864_000_000_000i64
}
#[inline]
pub fn get_utc_now_sub_day(day: i64) -> i64 {
get_utc_now_day_timestamp() - day * 864_000_000_000i64
}