uutils / parse_datetime

Parses a relative time string and returns a `Duration`
MIT License
14 stars 16 forks source link

Cargo test fails at 0:20 JST #36

Open philolo1 opened 10 months ago

philolo1 commented 10 months ago

I ran cargo test on the current repo and got two errors:

failures:

---- test_from_str_at_date_day stdout ----
thread 'test_from_str_at_date_day' panicked at 'assertion failed: `(left == right)`
  left: `Duration { secs: 0, nanos: 0 }`,
 right: `Duration { secs: 86400, nanos: 0 }`', tests/simple.rs:133:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- test_duration_parsing stdout ----
thread 'test_duration_parsing' panicked at 'assertion failed: `(left == right)`
  left: `Duration { secs: 31449600, nanos: 0 }`,
 right: `Duration { secs: 31536000, nanos: 0 }`', tests/simple.rs:16:5

failures:
    test_duration_parsing
    test_from_str_at_date_day

test result: FAILED. 4 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

error: test failed, to rerun pass `--test simple`

I did not get the errors before, so it might have to do with the my timezone. It looks like there might be an error or a different usage between JST and UTC.

philolo1 commented 10 months ago

I think it has to do with the fact that its Aug28th on JST but AUG 27th on UTC.

philolo1 commented 10 months ago

Interestingly the tests work at 9:15 JST.

drmorr0 commented 2 weeks ago

I ran into this issue in my unit tests, which pass in the morning and fail in the evening (I'm in Pacific time, UTC-8). I believe the root cause of this issue is in parse_relative_time.rs:

pub fn parse_relative_time(s: &str) -> Result<Duration, ParseDateTimeError> {
    parse_relative_time_at_date(Utc::now().date_naive(), s)
}
...
pub fn parse_relative_time_at_date(
    date: NaiveDate,
    s: &str,
) -> Result<Duration, ParseDateTimeError> {
...
    if captures_processed == 0 {
        Err(ParseDateTimeError::InvalidInput)
    } else {
        let time_now = Local::now().date_naive();
        let date_duration = date - time_now;

        Ok(total_duration + date_duration)
    }
}

In other words, parse_relative_time is passing in a Utc::now, and then we're subtracting a Local::now date, which definitely isn't going to work if the offset between Utc and Local crosses midnight. Any progress towards a fix on this?

tertsdiepraam commented 2 weeks ago

Nice find! Feel free to open a PR!