Skip to main content

lib/
fn_datestamp.rs

1// ./lib/fn_datestamp.rs
2use chrono::{Datelike, Local, Timelike, Weekday};
3pub use chrono::{NaiveDate, NaiveTime};
4
5/// Generuje datestamp dla obecnego, lokalnego czasu.
6/// Wywołanie: `datestamp_now()`
7pub fn datestamp_now() -> String {
8    let now = Local::now();
9    format_datestamp(now.date_naive(), now.time())
10}
11
12/// Generuje datestamp dla konkretnej, podanej daty i czasu.
13/// Wywołanie: `datestamp(date, time)`
14pub fn datestamp(date: NaiveDate, time: NaiveTime) -> String {
15    format_datestamp(date, time)
16}
17
18/// PRYWATNA funkcja, która odwala całą brudną robotę (zasada DRY).
19/// Nie ma modyfikatora `pub`, więc jest niewidoczna poza tym plikiem.
20fn format_datestamp(date: NaiveDate, time: NaiveTime) -> String {
21    let year = date.year();
22    let quarter = ((date.month() - 1) / 3) + 1;
23
24    let weekday = match date.weekday() {
25        Weekday::Mon => "Mon",
26        Weekday::Tue => "Tue",
27        Weekday::Wed => "Wed",
28        Weekday::Thu => "Thu",
29        Weekday::Fri => "Fri",
30        Weekday::Sat => "Sat",
31        Weekday::Sun => "Sun",
32    };
33
34    let month = match date.month() {
35        1 => "Jan",
36        2 => "Feb",
37        3 => "Mar",
38        4 => "Apr",
39        5 => "May",
40        6 => "Jun",
41        7 => "Jul",
42        8 => "Aug",
43        9 => "Sep",
44        10 => "Oct",
45        11 => "Nov",
46        12 => "Dec",
47        _ => unreachable!(),
48    };
49
50    let millis = time.nanosecond() / 1_000_000;
51
52    format!(
53        "{}Q{}D{:03}W{:02}_{}{:02}{}_{:02}{:02}{:02}{:03}",
54        year,
55        quarter,
56        date.ordinal(),
57        date.iso_week().week(),
58        weekday,
59        date.day(),
60        month,
61        time.hour(),
62        time.minute(),
63        time.second(),
64        millis
65    )
66}