refactor: switch from chrono to jiff

This commit is contained in:
Robert Perce 2026-04-03 11:54:36 -05:00
parent 79a054ab40
commit 3ffdf8f0d7
12 changed files with 205 additions and 161 deletions

View file

@ -1,7 +1,7 @@
use axum::extract::State;
use axum::response::IntoResponse;
use cache_bust::asset;
use chrono::{Local, NaiveDate, TimeDelta};
use jiff::{Timestamp, Unit, Zoned, civil, tz::TimeZone};
use maud::{Markup, html};
use sqlx::sqlite::SqlitePool;
@ -15,7 +15,7 @@ use crate::{AppError, AppState};
struct ContactFreshness {
contact_id: DbId,
display: String,
fresh_date: NaiveDate,
fresh_date: civil::Date,
fresh_str: String,
elapsed_str: String,
}
@ -46,8 +46,8 @@ fn freshness_section(freshens: &Vec<ContactFreshness>) -> Result<Markup, AppErro
struct KnownBirthdayContact {
contact_id: i64,
display: String,
prev_birthday: NaiveDate,
next_birthday: NaiveDate,
prev_birthday: civil::Date,
next_birthday: civil::Date,
}
fn birthdays_section(
prev_birthdays: &Vec<KnownBirthdayContact>,
@ -64,7 +64,7 @@ fn birthdays_section(
(contact.display)
}
span {
(contact.next_birthday.format("%m-%d"))
(contact.next_birthday.strftime("%m-%d"))
}
}
}
@ -75,7 +75,7 @@ fn birthdays_section(
(contact.display)
}
span {
(contact.prev_birthday.format("%m-%d"))
(contact.prev_birthday.strftime("%m-%d"))
}
}
}
@ -103,7 +103,7 @@ pub async fn journal_section(
added to the top of the list regardless of date; refresh the page to re-sort."
}
form hx-post="/journal_entry" hx-target="next .entries" hx-target-error="#journal-error" hx-swap="afterbegin" hx-on::after-request="if(event.detail.successful) this.reset()" {
input name="date" placeholder=(Local::now().date_naive().to_string());
input name="date" placeholder=(Zoned::now().date().to_string());
textarea name="value" placeholder="New entry..." autofocus {}
input type="submit" value="Add Entry";
}
@ -135,11 +135,11 @@ pub mod get {
.clone()
.into_iter()
.map(|contact| {
let zero = NaiveDate::from_epoch_days(0).unwrap();
let zero = jiff::civil::Date::ZERO;
let fresh_date = std::cmp::max(
contact
.manually_freshened_at
.map(|x| x.date_naive())
.map(|ts| ts.to_zoned(TimeZone::UTC).date())
.unwrap_or(zero),
contact.last_mention_date.unwrap_or(zero),
);
@ -152,30 +152,23 @@ pub mod get {
elapsed_str: "".to_string(),
}
} else {
let mut duration = Local::now().date_naive().signed_duration_since(fresh_date);
let mut elapsed: Vec<String> = Vec::new();
let y = duration.num_weeks() / 52;
let count = |n: i64, noun: &str| {
format!("{} {}{}", n, noun, if n > 1 { "s" } else { "" })
};
if y > 0 {
elapsed.push(count(y, "year"));
duration -= TimeDelta::weeks(y * 52);
}
let w = duration.num_weeks();
if w > 0 {
elapsed.push(count(w, "week"));
duration -= TimeDelta::weeks(w);
}
let d = duration.num_days();
if d > 0 {
elapsed.push(count(d, "day"));
}
let utc = TimeZone::UTC;
let todate = Timestamp::now().to_zoned(utc.clone()).date();
let duration = todate
.since(&fresh_date.to_zoned(utc).unwrap())
.unwrap()
.round(
jiff::SpanRound::new()
.largest(Unit::Year)
.smallest(Unit::Day)
.relative(todate),
)
.unwrap();
let elapsed_str = if elapsed.is_empty() {
let elapsed_str = if duration.is_zero() {
"today".to_string()
} else {
elapsed.join(", ")
format!("{:#}", duration)
};
ContactFreshness {
@ -197,8 +190,8 @@ pub mod get {
Some(KnownBirthdayContact {
contact_id: contact.id,
display: contact.display_name(),
prev_birthday: date.prev_month_day_occurrence().unwrap(),
next_birthday: date.next_month_day_occurrence().unwrap(),
prev_birthday: date.prev_month_day_occurrence()?,
next_birthday: date.next_month_day_occurrence()?,
})
} else {
None