1use cfg_if::cfg_if;
8
9pub use web_time::*;
11
12pub const SECONDS: u64 = 1000;
14pub const MINUTES: u64 = SECONDS * 60;
16pub const HOURS: u64 = MINUTES * 60;
18pub const DAYS: u64 = HOURS * 24;
20
21pub enum TimeFormat {
23 Time24,
25 Time12,
27 Locale,
29 Custom(String),
31}
32
33cfg_if! {
34 if #[cfg(target_arch = "wasm32")] {
35 use js_sys::{Date,Intl,Reflect};
36 use wasm_bindgen::prelude::JsValue;
37
38 #[inline(always)]
40 pub fn unixtime_as_millis_u128() -> u128 {
41 Date::now() as u128
42 }
43
44 #[inline(always)]
46 pub fn unixtime_as_millis_f64() -> f64 {
47 Date::now()
48 }
49
50 #[inline(always)]
52 pub fn unixtime_as_millis_u64() -> u64 {
53 Date::now() as u64
54 }
55
56 #[inline(always)]
58 pub fn unixtime_to_locale_string(unixtime : u64) -> String {
59 let date = Date::new(&JsValue::from(unixtime as f64));
60 date.to_locale_string(default_locale().as_str(), &JsValue::UNDEFINED).as_string().unwrap()
61 }
62
63 fn default_locale() -> String {
64 static mut LOCALE: Option<String> = None;
65 let locale_ptr = &raw mut LOCALE;
66 unsafe {
67 (*locale_ptr).get_or_insert_with(|| {
68 let date_time_format = Intl::DateTimeFormat::default();
69 let resolved_options = date_time_format.resolved_options();
70 let locale = Reflect::get(&resolved_options, &JsValue::from("locale")).expect("Intl::DateTimeFormat().resolvedOptions().locale is not defined");
71 locale.as_string().expect("Intl::DateTimeFormat().resolvedOptions().locale()")
72 }).clone()
73 }
74 }
75
76 pub fn init_desired_time_format(_time_format : TimeFormat) {
79 }
82
83 } else {
84 use chrono::{Local, TimeZone};
85
86 #[inline(always)]
88 pub fn unixtime_as_millis_u128() -> u128 {
89 SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).expect("unixtime_as_millis_u64").as_millis()
90 }
91
92 #[inline(always)]
94 pub fn unixtime_as_millis_f64() -> f64 {
95 SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).expect("unixtime_as_millis_u64").as_millis() as f64
96 }
97
98 #[inline(always)]
100 pub fn unixtime_as_millis_u64() -> u64 {
101 SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).expect("unixtime_as_millis_u64").as_millis() as u64
102 }
103
104 static mut TIME_FORMAT: Option<String> = None;
105
106 #[inline(always)]
107 fn time_format() -> &'static str {
108 let time_format_ptr = &raw mut TIME_FORMAT;
109 unsafe {
110 (*time_format_ptr).get_or_insert_with(|| {
111 "%Y-%m-%d %H:%M:%S".to_string()
112 }).as_str()
113 }
114 }
115
116 pub fn init_desired_time_format(time_format : TimeFormat) {
119 unsafe {
120 match time_format {
121 TimeFormat::Time24 => {
122 TIME_FORMAT = Some("%Y-%m-%d %H:%M:%S".to_string());
123 },
124 TimeFormat::Time12 => {
125 TIME_FORMAT = Some("%Y-%m-%d %I:%M:%S %p".to_string());
126 },
127 TimeFormat::Locale => {
128 TIME_FORMAT = Some("%c".to_string());
129 },
130 TimeFormat::Custom(format) => {
131 TIME_FORMAT = Some(format);
132 }
133 }
134 }
135 }
136
137 #[inline(always)]
140 pub fn unixtime_to_locale_string(unixtime : u64) -> String {
141 let local = Local.timestamp_millis_opt(unixtime as i64).unwrap();
142 local.format(time_format()).to_string()
143 }
144 }
145}
146
147