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:
21 files changed
+3397
-146
No files matched your search
@@ -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"
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user