diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index c0b982792ca..e6e711a9a12 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -318,6 +318,7 @@ pub fn uu_app() -> Command { .short('d') .long(OPT_DATE) .value_name("STRING") + .allow_hyphen_values(true) .help("display time described by STRING, not 'now'"), ) .arg( diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index 86b2e0439f9..fe7e7347831 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -1,3 +1,4 @@ +use chrono::{DateTime, Duration, Utc}; // This file is part of the uutils coreutils package. // // For the full copyright and license information, please view the LICENSE @@ -410,6 +411,31 @@ fn test_date_string_human() { } } +#[test] +fn test_negative_offset() { + let data_formats = vec![ + ("-1 hour", Duration::hours(1)), + ("-1 hours", Duration::hours(1)), + ("-1 day", Duration::days(1)), + ("-2 weeks", Duration::weeks(2)), + ]; + for (date_format, offset) in data_formats { + new_ucmd!() + .arg("-d") + .arg(date_format) + .arg("--rfc-3339=seconds") + .succeeds() + .stdout_str_check(|out| { + let date = DateTime::parse_from_rfc3339(out.trim()).unwrap(); + + // Is the resulting date roughly what is expected? + let expected_date = Utc::now() - offset; + date > expected_date - Duration::minutes(10) + && date < expected_date + Duration::minutes(10) + }); + } +} + #[test] fn test_invalid_date_string() { new_ucmd!()