diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index 577cba460..1fe80c03f 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -215,8 +215,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { eprintln!("date: invalid date ‘{}’", form); return 1; } - // GNU `date` uses `%N` for nano seconds, however crate::chrono uses `%f` - let form = form[1..].replace("%N", "%f"); + let form = form[1..].to_string(); Format::Custom(form) } else if let Some(fmt) = matches .values_of(OPT_ISO_8601) @@ -302,7 +301,9 @@ pub fn uumain(args: impl uucore::Args) -> i32 { for date in dates { match date { Ok(date) => { - let formatted = date.format(format_string); + // GNU `date` uses `%N` for nano seconds, however crate::chrono uses `%f` + let format_string = &format_string.replace("%N", "%f"); + let formatted = date.format(format_string).to_string().replace("%f", "%N"); println!("{}", formatted); } Err((input, _err)) => { diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index 464655315..f4990566a 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -121,6 +121,12 @@ fn test_date_format_without_plus() { .code_is(1); } +#[test] +fn test_date_format_literal() { + new_ucmd!().arg("+%%s").succeeds().stdout_is("%s\n"); + new_ucmd!().arg("+%%N").succeeds().stdout_is("%N\n"); +} + #[test] #[cfg(all(unix, not(target_os = "macos")))] fn test_date_set_valid() {