pub mod config;
pub mod display;
pub mod error;
pub use config::Config;
use chrono::{Datelike, Local, Timelike, Utc};
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug, Clone)]
pub struct DateTimeInfo {
pub local_time: String,
pub utc_time: String,
pub unix_seconds: u64,
pub unix_milliseconds: u128,
pub timezone: String,
pub offset: String,
pub weekday: String,
pub iso_local: String,
pub iso_utc: String,
pub config: Config,
}
impl DateTimeInfo {
pub fn new(config: &Config) -> Self {
let now = SystemTime::now();
let duration = now.duration_since(UNIX_EPOCH).unwrap_or_default();
let local = Local::now();
let utc = Utc::now();
let local_time = format!(
"{:04}-{:02}-{:02} {:02}:{:02}:{:02}.{:03} {}",
local.year(),
local.month(),
local.day(),
local.hour(),
local.minute(),
local.second(),
local.timestamp_subsec_millis(),
local.format("%Z")
);
let utc_time = format!(
"{:04}-{:02}-{:02} {:02}:{:02}:{:02}.{:03} UTC",
utc.year(),
utc.month(),
utc.day(),
utc.hour(),
utc.minute(),
utc.second(),
utc.timestamp_subsec_millis(),
);
let weekday = local.format("%A").to_string();
let iso_local = local.format("%Y-%m-%dT%H:%M:%S%.3f%:z").to_string();
let iso_utc = utc.format("%Y-%m-%dT%H:%M:%S%.3fZ").to_string();
DateTimeInfo {
local_time,
utc_time,
unix_seconds: duration.as_secs(),
unix_milliseconds: duration.as_millis(),
timezone: local.format("%Z").to_string(),
offset: local.format("%:z").to_string(),
weekday,
iso_local,
iso_utc,
config: config.clone(),
}
}
pub fn format_colored(&self) -> String {
display::format_colored(self)
}
pub fn format_plain(&self) -> String {
display::format_plain(self)
}
pub fn format_json(&self) -> String {
serde_json::to_string_pretty(&serde_json::json!({
"local_time": self.local_time,
"utc_time": self.utc_time,
"unix_seconds": self.unix_seconds,
"unix_milliseconds": self.unix_milliseconds,
"timezone": self.timezone,
"offset": self.offset,
"weekday": self.weekday,
"iso_local": self.iso_local,
"iso_utc": self.iso_utc,
}))
.unwrap_or_default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_datetime_info_creation() {
let config = Config::default();
let dt = DateTimeInfo::new(&config);
assert!(!dt.local_time.is_empty());
assert!(!dt.utc_time.is_empty());
assert!(dt.unix_seconds > 0);
assert!(dt.unix_milliseconds > 0);
assert!(!dt.timezone.is_empty());
assert!(dt.offset.starts_with('+') || dt.offset.starts_with('-'));
}
#[test]
fn test_format_plain() {
let config = Config::default();
let dt = DateTimeInfo::new(&config);
let formatted = dt.format_plain();
assert!(formatted.contains("System Time"));
assert!(formatted.contains("Local Time"));
assert!(formatted.contains("UTC Time"));
}
#[test]
fn test_format_json() {
let config = Config::default();
let dt = DateTimeInfo::new(&config);
let json = dt.format_json();
assert!(json.contains("local_time"));
assert!(json.contains("utc_time"));
assert!(json.contains("unix_seconds"));
let _: serde_json::Value = serde_json::from_str(&json).unwrap();
}
}