Fix date formatting overflow bug

- Use chrono library for proper date parsing from Unix timestamps
- Fixes integer overflow in manual date calculation that caused
  dates to display as huge numbers like "2026-01-18446744073709551241"
This commit is contained in:
kidev 2026-01-31 00:02:00 +01:00
parent 1fb4dc0092
commit edb7545a4d
3 changed files with 4 additions and 23 deletions

View File

@ -13,6 +13,7 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
toml = "0.8"
dirs = "5.0"
chrono = "0.4"
[profile.release]
lto = true

Binary file not shown.

View File

@ -490,29 +490,9 @@ fn create_size_bar(size: u64, max_size: u64) -> String {
fn format_date(timestamp: &str) -> String {
// ZFS returns timestamp as Unix epoch seconds
if let Ok(ts) = timestamp.parse::<i64>() {
use std::time::{UNIX_EPOCH, Duration};
if let Some(datetime) = UNIX_EPOCH.checked_add(Duration::from_secs(ts as u64)) {
// Format as YYYY-MM-DD
let secs = datetime.duration_since(UNIX_EPOCH).unwrap().as_secs();
let days = secs / 86400;
let years_since_1970 = days / 365;
let year = 1970 + years_since_1970;
// Simplified date calculation
let remaining_days = days - (years_since_1970 * 365) - (years_since_1970 / 4);
let month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let mut month = 1;
let mut day = remaining_days;
for (i, &m_days) in month_days.iter().enumerate() {
if day < m_days as u64 {
month = i + 1;
break;
}
day -= m_days as u64;
}
return format!("{:04}-{:02}-{:02}", year, month, day + 1);
use chrono::{DateTime, Utc};
if let Some(dt) = DateTime::<Utc>::from_timestamp(ts, 0) {
return dt.format("%Y-%m-%d").to_string();
}
}
// Return original if parsing fails