T06c forms date and time: calendar, date, range, time and date-time pickers, month, quarter, year and week pickers, relative ranges, time zones, durations, cron editor

This commit is contained in:
ZacharyZhang-NY committed 2026-09-25 07:27:42 -04:00
1 parent e39d623b58
commit 8b418b8e80
21 files changed
+3397 -146

No files matched your search

+86
View File
@@ -0,0 +1,86 @@
mod calendar;
mod cron;
mod period;
mod picker;
mod relative;
mod rule;
mod time;
mod week;
mod zone;
use jiff::{
Timestamp, Zoned,
civil::{Date, Time},
tz::TimeZone,
};
pub use calendar::Calendar;
pub use cron::CronEditor;
pub use period::{MonthPicker, QuarterPicker, YearPicker};
pub use picker::{DatePicker, DateRangePicker};
pub use relative::{RelativeDatePicker, RelativeRange};
pub use rule::CronRule;
pub use time::{DateTimePicker, DurationPicker, TimePicker};
pub use week::WeekPicker;
pub use zone::TimezoneSelect;
/// The system's clock in its own zone. An unknown zone stops here, not in UTC.
pub(crate) fn zoned_now() -> Zoned {
let zone = TimeZone::try_system().unwrap_or_else(|error| {
panic!("the system time zone is unknown; pass a fixed date: {error}")
});
Timestamp::now().to_zoned(zone)
}
/// A day as "Sep 25, 2026".
pub(crate) fn show_date(date: Date) -> String {
date.strftime("%b %-d, %Y").to_string()
}
/// A time as "09:30".
pub(crate) fn show_time(time: Time) -> String {
time.strftime("%H:%M").to_string()
}
/// A span as "Sep 3 – 17, 2026", naming only what differs.
pub(crate) fn show_span(start: Date, end: Date) -> String {
let dash = " \u{2013} ";
if start == end {
show_date(start)
} else if start.year() != end.year() {
format!("{}{dash}{}", show_date(start), show_date(end))
} else if start.month() != end.month() {
format!("{}{dash}{}", start.strftime("%b %-d"), show_date(end))
} else {
format!(
"{}{dash}{}",
start.strftime("%b %-d"),
end.strftime("%-d, %Y")
)
}
}
#[cfg(test)]
mod tests {
use jiff::civil::{date, time};
use super::{show_date, show_span, show_time};
#[test]
fn dates_times_and_spans_read_short() {
assert_eq!(show_date(date(2026, 9, 5)), "Sep 5, 2026");
assert_eq!(show_time(time(9, 5, 0, 0)), "09:05");
assert_eq!(
show_span(date(2026, 9, 3), date(2026, 9, 17)),
"Sep 3 \u{2013} 17, 2026"
);
assert_eq!(
show_span(date(2026, 9, 28), date(2026, 10, 2)),
"Sep 28 \u{2013} Oct 2, 2026"
);
assert_eq!(
show_span(date(2026, 12, 30), date(2027, 1, 2)),
"Dec 30, 2026 \u{2013} Jan 2, 2027"
);
}
}