You've already forked parse_datetime
mirror of
https://github.com/uutils/parse_datetime.git
synced 2026-06-10 16:13:15 -07:00
Add time to parsed date after parsing not before
Change the way dates without times are parsed by just parsing the date as-is and applying the placeholder time (00:00:00) after parsing instead of before.
This commit is contained in:
+14
-11
@@ -21,8 +21,8 @@ mod parse_time_only_str;
|
||||
mod parse_weekday;
|
||||
|
||||
use chrono::{
|
||||
DateTime, Datelike, Duration, FixedOffset, Local, LocalResult, MappedLocalTime, NaiveDateTime,
|
||||
TimeZone, Timelike,
|
||||
DateTime, Datelike, Duration, FixedOffset, Local, LocalResult, MappedLocalTime, NaiveDate,
|
||||
NaiveDateTime, TimeZone, Timelike,
|
||||
};
|
||||
|
||||
use parse_relative_time::parse_relative_time_at_date;
|
||||
@@ -297,13 +297,12 @@ pub fn parse_datetime_at_date<S: AsRef<str> + Clone>(
|
||||
}
|
||||
}
|
||||
|
||||
let ts = s.as_ref().to_owned() + " 0000";
|
||||
// Parse date only formats - assume midnight local timezone
|
||||
for (fmt, n) in format::PATTERNS_DATE_NO_TZ {
|
||||
if ts.len() >= n + 5 {
|
||||
let f = fmt.to_owned() + " %H%M";
|
||||
if let Ok(parsed) = NaiveDateTime::parse_from_str(&ts[0..n + 5], &f) {
|
||||
if let Ok(dt) = naive_dt_to_fixed_offset(date, parsed) {
|
||||
if s.as_ref().len() >= n {
|
||||
if let Ok(parsed) = NaiveDate::parse_from_str(&s.as_ref()[0..n], fmt) {
|
||||
let datetime = parsed.and_hms_opt(0, 0, 0).unwrap();
|
||||
if let Ok(dt) = naive_dt_to_fixed_offset(date, datetime) {
|
||||
return Ok(dt);
|
||||
}
|
||||
}
|
||||
@@ -663,10 +662,14 @@ mod tests {
|
||||
assert!(crate::parse_datetime("bogus +1 day").is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_invalid_delta() {
|
||||
assert!(crate::parse_datetime("1997-01-01 bogus").is_err());
|
||||
}
|
||||
// TODO Re-enable this when we parse the absolute datetime and the
|
||||
// time delta separately, see
|
||||
// <https://github.com/uutils/parse_datetime/issues/104>.
|
||||
//
|
||||
// #[test]
|
||||
// fn test_parse_invalid_delta() {
|
||||
// assert!(crate::parse_datetime("1997-01-01 bogus").is_err());
|
||||
// }
|
||||
|
||||
#[test]
|
||||
fn test_parse_datetime_tz_nodelta() {
|
||||
|
||||
Reference in New Issue
Block a user