|
1 | 1 | use std::fmt;
|
2 | 2 | use std::time::SystemTime;
|
3 | 3 |
|
4 |
| -use humantime::{ |
5 |
| - format_rfc3339_micros, format_rfc3339_millis, format_rfc3339_nanos, format_rfc3339_seconds, |
6 |
| -}; |
7 |
| - |
8 | 4 | use crate::fmt::{Formatter, TimestampPrecision};
|
9 | 5 |
|
10 | 6 | impl Formatter {
|
@@ -99,13 +95,44 @@ impl fmt::Debug for Timestamp {
|
99 | 95 |
|
100 | 96 | impl fmt::Display for Timestamp {
|
101 | 97 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
| 98 | + use jiff::fmt::strtime; |
| 99 | + |
| 100 | + let Ok(ts) = jiff::Timestamp::try_from(self.time) else { |
| 101 | + return Err(fmt::Error); |
| 102 | + }; |
| 103 | + |
102 | 104 | let formatter = match self.precision {
|
103 |
| - TimestampPrecision::Seconds => format_rfc3339_seconds, |
104 |
| - TimestampPrecision::Millis => format_rfc3339_millis, |
105 |
| - TimestampPrecision::Micros => format_rfc3339_micros, |
106 |
| - TimestampPrecision::Nanos => format_rfc3339_nanos, |
| 105 | + TimestampPrecision::Seconds => |t| strtime::format("%FT%TZ", t), |
| 106 | + TimestampPrecision::Millis => |t| strtime::format("%FT%T%.3fZ", t), |
| 107 | + TimestampPrecision::Micros => |t| strtime::format("%FT%T%.6fZ", t), |
| 108 | + TimestampPrecision::Nanos => |t| strtime::format("%FT%T%.9fZ", t), |
| 109 | + }; |
| 110 | + |
| 111 | + formatter(ts).map_err(|_| fmt::Error).and_then(|s| f.write_str(&s)) |
| 112 | + } |
| 113 | +} |
| 114 | + |
| 115 | +#[cfg(test)] |
| 116 | +mod tests { |
| 117 | + use crate::TimestampPrecision; |
| 118 | + use super::Timestamp; |
| 119 | + |
| 120 | + #[test] |
| 121 | + fn test_display_timestamp() { |
| 122 | + let mut ts = Timestamp { |
| 123 | + time: std::time::SystemTime::UNIX_EPOCH, |
| 124 | + precision: TimestampPrecision::Nanos, |
107 | 125 | };
|
108 | 126 |
|
109 |
| - formatter(self.time).fmt(f) |
| 127 | + assert_eq!("1970-01-01T00:00:00.000000000Z", format!("{ts}")); |
| 128 | + |
| 129 | + ts.precision = TimestampPrecision::Micros; |
| 130 | + assert_eq!("1970-01-01T00:00:00.000000Z", format!("{ts}")); |
| 131 | + |
| 132 | + ts.precision = TimestampPrecision::Millis; |
| 133 | + assert_eq!("1970-01-01T00:00:00.000Z", format!("{ts}")); |
| 134 | + |
| 135 | + ts.precision = TimestampPrecision::Seconds; |
| 136 | + assert_eq!("1970-01-01T00:00:00Z", format!("{ts}")); |
110 | 137 | }
|
111 | 138 | }
|
0 commit comments