1use chrono::{Datelike, Local, Timelike, Weekday};
3pub use chrono::{NaiveDate, NaiveTime};
4
5pub fn datestamp_now() -> String {
8 let now = Local::now();
9 format_datestamp(now.date_naive(), now.time())
10}
11
12pub fn datestamp(date: NaiveDate, time: NaiveTime) -> String {
15 format_datestamp(date, time)
16}
17
18fn 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}