Skip to content

Commit fd0c948

Browse files
output six decimal digits for timestamp microseconds (#47)
output six decimal digits for timestamp nanonseconds
1 parent e133861 commit fd0c948

File tree

6 files changed

+54
-54
lines changed

6 files changed

+54
-54
lines changed

fuzz/fuzz_targets/parse_float.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ fn check_float_matches(data: &str) {
66
match float_parse_str(data) {
77
IntFloat::Int(i) => assert_eq!(data.parse::<i64>().unwrap(), i),
88
IntFloat::Float(f) => assert_eq!(data.parse::<f64>().unwrap(), f),
9-
IntFloat::Err => assert!(data.parse::<f64>().is_err())
9+
IntFloat::Err => assert!(data.parse::<f64>().is_err()),
1010
}
1111
}
1212

fuzz/fuzz_targets/parse_int.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use speedate::int_parse_str;
55
fn check_int_matches(data: &str) {
66
match int_parse_str(data) {
77
Some(i) => assert_eq!(data.parse::<i64>().unwrap(), i),
8-
None => assert!(data.parse::<i64>().is_err())
8+
None => assert!(data.parse::<i64>().is_err()),
99
}
1010
}
1111

src/datetime.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ impl DateTime {
371371
/// assert_eq!(d.to_string(), "2022-06-07T16:28:40.000123");
372372
///
373373
/// let d = DateTime::from_timestamp_with_config(1_654_619_320_123, 123_000, &TimeConfigBuilder::new().build()).unwrap();
374-
/// assert_eq!(d.to_string(), "2022-06-07T16:28:40.246");
374+
/// assert_eq!(d.to_string(), "2022-06-07T16:28:40.246000");
375375
/// ```
376376
pub fn from_timestamp_with_config(
377377
timestamp: i64,
@@ -429,7 +429,7 @@ impl DateTime {
429429
/// assert_eq!(d.to_string(), "2022-06-07T16:28:40.000123");
430430
///
431431
/// let d = DateTime::from_timestamp(1_654_619_320_123, 123_000).unwrap();
432-
/// assert_eq!(d.to_string(), "2022-06-07T16:28:40.246");
432+
/// assert_eq!(d.to_string(), "2022-06-07T16:28:40.246000");
433433
/// ```
434434
pub fn from_timestamp(timestamp: i64, timestamp_microsecond: u32) -> Result<Self, ParseError> {
435435
Self::from_timestamp_with_config(timestamp, timestamp_microsecond, &TimeConfigBuilder::new().build())

src/time.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl fmt::Display for Time {
4545
crate::display_num_buf(2, 3, self.minute as u32, &mut buf);
4646
crate::display_num_buf(2, 6, self.second as u32, &mut buf);
4747
crate::display_num_buf(6, 9, self.microsecond, &mut buf);
48-
f.write_str(std::str::from_utf8(&buf[..]).unwrap().trim_end_matches('0'))?
48+
f.write_str(std::str::from_utf8(&buf[..]).unwrap())?
4949
} else {
5050
let mut buf: [u8; 8] = *b"00:00:00";
5151
crate::display_num_buf(2, 0, self.hour as u32, &mut buf);

tests/main.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -424,13 +424,13 @@ fn datetime_watershed() {
424424
let dt = DateTime::from_timestamp(20_000_000_000, 0).unwrap();
425425
assert_eq!(dt.to_string(), "2603-10-11T11:33:20");
426426
let dt = DateTime::from_timestamp(20_000_000_001, 0).unwrap();
427-
assert_eq!(dt.to_string(), "1970-08-20T11:33:20.001");
427+
assert_eq!(dt.to_string(), "1970-08-20T11:33:20.001000");
428428
match DateTime::from_timestamp(-20_000_000_000, 0) {
429429
Ok(dt) => panic!("unexpectedly valid, {dt}"),
430430
Err(e) => assert_eq!(e, ParseError::DateTooSmall),
431431
}
432432
let dt = DateTime::from_timestamp(-20_000_000_001, 0).unwrap();
433-
assert_eq!(dt.to_string(), "1969-05-14T12:26:39.999");
433+
assert_eq!(dt.to_string(), "1969-05-14T12:26:39.999000");
434434
}
435435

436436
#[test]
@@ -456,10 +456,10 @@ fn datetime_with_tz_offset() {
456456
let dt_z = DateTime::parse_str("2022-01-01T12:13:14.567+00:00").unwrap();
457457

458458
let dt_m8 = dt_z.with_timezone_offset(Some(-8 * 3600)).unwrap();
459-
assert_eq!(dt_m8.to_string(), "2022-01-01T12:13:14.567-08:00");
459+
assert_eq!(dt_m8.to_string(), "2022-01-01T12:13:14.567000-08:00");
460460

461461
let dt_naive = dt_z.with_timezone_offset(None).unwrap();
462-
assert_eq!(dt_naive.to_string(), "2022-01-01T12:13:14.567");
462+
assert_eq!(dt_naive.to_string(), "2022-01-01T12:13:14.567000");
463463

464464
let dt_naive = DateTime::parse_str("2000-01-01T00:00:00").unwrap();
465465

@@ -475,13 +475,13 @@ fn datetime_with_tz_offset() {
475475

476476
#[test]
477477
fn datetime_in_timezone() {
478-
let dt_z = DateTime::parse_str("2000-01-01T15:00:00.567Z").unwrap();
478+
let dt_z = DateTime::parse_str("2000-01-01T15:00:00.567000Z").unwrap();
479479

480480
let dt_p1 = dt_z.in_timezone(3_600).unwrap();
481-
assert_eq!(dt_p1.to_string(), "2000-01-01T16:00:00.567+01:00");
481+
assert_eq!(dt_p1.to_string(), "2000-01-01T16:00:00.567000+01:00");
482482

483483
let dt_m2 = dt_z.in_timezone(-7_200).unwrap();
484-
assert_eq!(dt_m2.to_string(), "2000-01-01T13:00:00.567-02:00");
484+
assert_eq!(dt_m2.to_string(), "2000-01-01T13:00:00.567000-02:00");
485485

486486
let dt_naive = DateTime::parse_str("2000-01-01T00:00:00").unwrap();
487487
let error = match dt_naive.in_timezone(3_600) {
@@ -573,10 +573,10 @@ fn time_with_tz_offset() {
573573
let t_z = Time::parse_str("12:13:14.567+00:00").unwrap();
574574

575575
let t_m8 = t_z.with_timezone_offset(Some(-8 * 3600)).unwrap();
576-
assert_eq!(t_m8.to_string(), "12:13:14.567-08:00");
576+
assert_eq!(t_m8.to_string(), "12:13:14.567000-08:00");
577577

578578
let t_naive = t_z.with_timezone_offset(None).unwrap();
579-
assert_eq!(t_naive.to_string(), "12:13:14.567");
579+
assert_eq!(t_naive.to_string(), "12:13:14.567000");
580580

581581
let t_naive = Time::parse_str("00:00:00").unwrap();
582582

@@ -595,10 +595,10 @@ fn time_in_timezone() {
595595
let t_z = Time::parse_str("15:00:00.567Z").unwrap();
596596

597597
let t_p1 = t_z.in_timezone(3_600).unwrap();
598-
assert_eq!(t_p1.to_string(), "16:00:00.567+01:00");
598+
assert_eq!(t_p1.to_string(), "16:00:00.567000+01:00");
599599

600600
let t_m2 = t_z.in_timezone(-7_200).unwrap();
601-
assert_eq!(t_m2.to_string(), "13:00:00.567-02:00");
601+
assert_eq!(t_m2.to_string(), "13:00:00.567000-02:00");
602602

603603
let t_naive = Time::parse_str("10:00:00").unwrap();
604604
let error = match t_naive.in_timezone(3_600) {
@@ -619,7 +619,7 @@ param_tests! {
619619
time_min: ok => "00:00:00.000000", "00:00:00";
620620
time_max: ok => "23:59:59.999999", "23:59:59.999999";
621621
time_no_fraction: ok => "12:13:14", "12:13:14";
622-
time_fraction_small: ok => "12:13:14.123", "12:13:14.123";
622+
time_fraction_small: ok => "12:13:14.123", "12:13:14.123000";
623623
time_no_sec: ok => "12:13", "12:13:00";
624624
time_tz: ok => "12:13:14z", "12:13:14Z";
625625
time: err => "xxx", TooShort;
@@ -813,12 +813,12 @@ param_tests! {
813813
dt_tz_negative: ok => "2020-01-01T12:13:14-02:15", "2020-01-01T12:13:14-02:15";
814814
dt_tz_negative_10: ok => "2020-01-01T12:13:14-11:30", "2020-01-01T12:13:14-11:30";
815815
dt_tz_no_colon: ok => "2020-01-01T12:13:14+1234", "2020-01-01T12:13:14+12:34";
816-
dt_seconds_fraction_break: ok => "2020-01-01 12:13:14.123z", "2020-01-01T12:13:14.123Z";
817-
dt_seconds_fraction_comma: ok => "2020-01-01 12:13:14,123z", "2020-01-01T12:13:14.123Z";
818-
dt_underscore: ok => "2020-01-01_12:13:14,123z", "2020-01-01T12:13:14.123Z";
816+
dt_seconds_fraction_break: ok => "2020-01-01 12:13:14.123z", "2020-01-01T12:13:14.123000Z";
817+
dt_seconds_fraction_comma: ok => "2020-01-01 12:13:14,123z", "2020-01-01T12:13:14.123000Z";
818+
dt_underscore: ok => "2020-01-01_12:13:14,123z", "2020-01-01T12:13:14.123000Z";
819819
dt_unix1: ok => "1654646400", "2022-06-08T00:00:00";
820820
dt_unix2: ok => "1654646404", "2022-06-08T00:00:04";
821-
dt_unix_float: ok => "1654646404.5", "2022-06-08T00:00:04.5";
821+
dt_unix_float: ok => "1654646404.5", "2022-06-08T00:00:04.500000";
822822
dt_short_date: err => "xxx", TooShort;
823823
dt_short_time: err => "2020-01-01T12:0", TooShort;
824824
dt: err => "202x-01-01", InvalidCharYear;

tests/values_ok.txt

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,56 @@
22
date: 2022-05-30 -> 2022-05-30
33
# times with timezones are removed since they're not supported by this library
44
time: 20:26:52 -> 20:26:52
5-
time: 20:26:52.3 -> 20:26:52.3
6-
time: 20:26:52.36 -> 20:26:52.36
7-
time: 20:26:52.361 -> 20:26:52.361
8-
time: 20:26:52.361000 -> 20:26:52.361
5+
time: 20:26:52.3 -> 20:26:52.300000
6+
time: 20:26:52.36 -> 20:26:52.360000
7+
time: 20:26:52.361 -> 20:26:52.361000
8+
time: 20:26:52.361000 -> 20:26:52.361000
99
dt: 2022-05-30T20:26:52Z -> 2022-05-30T20:26:52Z
10-
dt: 2022-05-30T20:26:52.3Z -> 2022-05-30T20:26:52.3Z
11-
dt: 2022-05-30T20:26:52.36Z -> 2022-05-30T20:26:52.36Z
12-
dt: 2022-05-30T20:26:52.361Z -> 2022-05-30T20:26:52.361Z
13-
dt: 2022-05-30T20:26:52.361000Z -> 2022-05-30T20:26:52.361Z
10+
dt: 2022-05-30T20:26:52.3Z -> 2022-05-30T20:26:52.300000Z
11+
dt: 2022-05-30T20:26:52.36Z -> 2022-05-30T20:26:52.360000Z
12+
dt: 2022-05-30T20:26:52.361Z -> 2022-05-30T20:26:52.361000Z
13+
dt: 2022-05-30T20:26:52.361000Z -> 2022-05-30T20:26:52.361000Z
1414
dt: 2022-05-30T21:26:52+01:00 -> 2022-05-30T21:26:52+01:00
15-
dt: 2022-05-30T21:26:52.361+01:00 -> 2022-05-30T21:26:52.361+01:00
16-
dt: 2022-05-30T21:26:52.361000+01:00 -> 2022-05-30T21:26:52.361+01:00
15+
dt: 2022-05-30T21:26:52.361+01:00 -> 2022-05-30T21:26:52.361000+01:00
16+
dt: 2022-05-30T21:26:52.361000+01:00 -> 2022-05-30T21:26:52.361000+01:00
1717
dt: 2022-05-30 21:26:52+01:00 -> 2022-05-30T21:26:52+01:00
18-
dt: 2022-05-30 21:26:52.3+01:00 -> 2022-05-30T21:26:52.3+01:00
19-
dt: 2022-05-30 21:26:52.36+01:00 -> 2022-05-30T21:26:52.36+01:00
20-
dt: 2022-05-30 21:26:52.361+01:00 -> 2022-05-30T21:26:52.361+01:00
21-
dt: 2022-05-30 21:26:52.361000+01:00 -> 2022-05-30T21:26:52.361+01:00
18+
dt: 2022-05-30 21:26:52.3+01:00 -> 2022-05-30T21:26:52.300000+01:00
19+
dt: 2022-05-30 21:26:52.36+01:00 -> 2022-05-30T21:26:52.360000+01:00
20+
dt: 2022-05-30 21:26:52.361+01:00 -> 2022-05-30T21:26:52.361000+01:00
21+
dt: 2022-05-30 21:26:52.361000+01:00 -> 2022-05-30T21:26:52.361000+01:00
2222
dt: 2022-05-30 20:26:52Z -> 2022-05-30T20:26:52Z
2323
dt: 2022-05-30_20:26:52Z -> 2022-05-30T20:26:52Z
2424
dt: 2022-05-30 20:26:52z -> 2022-05-30T20:26:52Z
2525
dt: 2022-05-30_20:26:52z -> 2022-05-30T20:26:52Z
26-
dt: 2022-05-30 20:26:52.3Z -> 2022-05-30T20:26:52.3Z
27-
dt: 2022-05-30 20:26:52.36Z -> 2022-05-30T20:26:52.36Z
28-
dt: 2022-05-30 20:26:52.361Z -> 2022-05-30T20:26:52.361Z
29-
dt: 2022-05-30_20:26:52.361Z -> 2022-05-30T20:26:52.361Z
30-
dt: 2022-05-30 20:26:52.361000Z -> 2022-05-30T20:26:52.361Z
31-
dt: 2022-05-30_20:26:52.361000Z -> 2022-05-30T20:26:52.361Z
32-
dt: 2022-05-30 20:26:52.361z -> 2022-05-30T20:26:52.361Z
33-
dt: 2022-05-30_20:26:52.361z -> 2022-05-30T20:26:52.361Z
34-
dt: 2022-05-30 20:26:52.361000z -> 2022-05-30T20:26:52.361Z
35-
dt: 2022-05-30_20:26:52.361000z -> 2022-05-30T20:26:52.361Z
26+
dt: 2022-05-30 20:26:52.3Z -> 2022-05-30T20:26:52.300000Z
27+
dt: 2022-05-30 20:26:52.36Z -> 2022-05-30T20:26:52.360000Z
28+
dt: 2022-05-30 20:26:52.361Z -> 2022-05-30T20:26:52.361000Z
29+
dt: 2022-05-30_20:26:52.361Z -> 2022-05-30T20:26:52.361000Z
30+
dt: 2022-05-30 20:26:52.361000Z -> 2022-05-30T20:26:52.361000Z
31+
dt: 2022-05-30_20:26:52.361000Z -> 2022-05-30T20:26:52.361000Z
32+
dt: 2022-05-30 20:26:52.361z -> 2022-05-30T20:26:52.361000Z
33+
dt: 2022-05-30_20:26:52.361z -> 2022-05-30T20:26:52.361000Z
34+
dt: 2022-05-30 20:26:52.361000z -> 2022-05-30T20:26:52.361000Z
35+
dt: 2022-05-30_20:26:52.361000z -> 2022-05-30T20:26:52.361000Z
3636
dt: 2022-05-30 20:26:52-00:00 -> 2022-05-30T20:26:52Z
37-
dt: 2022-05-30 20:26:52.361-00:00 -> 2022-05-30T20:26:52.361Z
37+
dt: 2022-05-30 20:26:52.361-00:00 -> 2022-05-30T20:26:52.361000Z
3838
dt: 2022-05-30T20:26:52-00:00 -> 2022-05-30T20:26:52Z
39-
dt: 2022-05-30T20:26:52.361-00:00 -> 2022-05-30T20:26:52.361Z
39+
dt: 2022-05-30T20:26:52.361-00:00 -> 2022-05-30T20:26:52.361000Z
4040
dt: 2022-05-31T05:11:52+08:45 -> 2022-05-31T05:11:52+08:45
4141
dt: 2022-05-30T20:26:52+00:00 -> 2022-05-30T20:26:52Z
42-
dt: 2022-05-30T20:26:52.361+00:00 -> 2022-05-30T20:26:52.361Z
42+
dt: 2022-05-30T20:26:52.361+00:00 -> 2022-05-30T20:26:52.361000Z
4343

4444
# from https://github.com/python/cpython/blob/5849af7a80166e9e82040e082f22772bd7cf3061/Lib/test/datetimetester.py#L3104-L3226
4545
# with invalid cases moved to values_err.txt
4646
dt: 2025-01-02T03:04 -> 2025-01-02T03:04:00
4747
dt: 2025-01-02T03:04:05 -> 2025-01-02T03:04:05
48-
dt: 2025-01-02T03:04:05.6 -> 2025-01-02T03:04:05.6
49-
dt: 2025-01-02T03:04:05,6 -> 2025-01-02T03:04:05.6
50-
dt: 2025-01-02T03:04:05.678 -> 2025-01-02T03:04:05.678
48+
dt: 2025-01-02T03:04:05.6 -> 2025-01-02T03:04:05.600000
49+
dt: 2025-01-02T03:04:05,6 -> 2025-01-02T03:04:05.600000
50+
dt: 2025-01-02T03:04:05.678 -> 2025-01-02T03:04:05.678000
5151
dt: 2025-01-02T03:04:05.678901 -> 2025-01-02T03:04:05.678901
5252
dt: 2025-01-02T03:04:05,678901 -> 2025-01-02T03:04:05.678901
53-
dt: 2009-04-19T03:15:45.2345 -> 2009-04-19T03:15:45.2345
54-
dt: 2025-01-02T03:04:05,678 -> 2025-01-02T03:04:05.678
53+
dt: 2009-04-19T03:15:45.2345 -> 2009-04-19T03:15:45.234500
54+
dt: 2025-01-02T03:04:05,678 -> 2025-01-02T03:04:05.678000
5555
dt: 2025-01-02T03:04:05Z -> 2025-01-02T03:04:05Z
5656
dt: 2025-01-02T03:05:06+0300 -> 2025-01-02T03:05:06+03:00
5757
dt: 2025-01-02T03:05:06-0300 -> 2025-01-02T03:05:06-03:00
@@ -62,4 +62,4 @@ dt: 2020-06-01T04:05:06.111111-04:00 -> 2020-06-01T04:05:06.111111-04:00
6262
dt: 2020-06-01T04:05:06.111111-0400 -> 2020-06-01T04:05:06.111111-04:00
6363
dt: 2021-10-31T01:30:00.000000+01:00 -> 2021-10-31T01:30:00+01:00
6464
dt: 2021-10-31T01:30:00.000000+0100 -> 2021-10-31T01:30:00+01:00
65-
dt: 2025-01-02T03:04:05,678+00:00 -> 2025-01-02T03:04:05.678Z
65+
dt: 2025-01-02T03:04:05,678+00:00 -> 2025-01-02T03:04:05.678000Z

0 commit comments

Comments
 (0)