This is an automated email from the ASF dual-hosted git repository. alamb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push: new fb36dd980 Fix: Added support to cast string without time (#3494) fb36dd980 is described below commit fb36dd980b398deabe5547af114982326b97e078 Author: Wenjun L <47608857+csph...@users.noreply.github.com> AuthorDate: Mon Jan 9 22:59:07 2023 +0100 Fix: Added support to cast string without time (#3494) * Fix: Added support casting strings without time to timestamp * Fix: Added support casting strings without time to timestamp Co-authored-by: Wenjun Liu <wenjun.gael....@gmail.com> --- arrow-cast/src/parse.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arrow-cast/src/parse.rs b/arrow-cast/src/parse.rs index 6de336351..e885ec5b6 100644 --- a/arrow-cast/src/parse.rs +++ b/arrow-cast/src/parse.rs @@ -37,6 +37,7 @@ use chrono::prelude::*; /// * `1997-01-31T09:26:56.123` # close to RCF3339 but no timezone offset specified /// * `1997-01-31 09:26:56.123` # close to RCF3339 but uses a space and no timezone offset /// * `1997-01-31 09:26:56` # close to RCF3339, no fractional seconds +/// * `1997-01-31` # close to RCF3339, only date no time // /// Internally, this function uses the `chrono` library for the /// datetime parsing @@ -121,6 +122,14 @@ pub fn string_to_timestamp_nanos(s: &str) -> Result<i64, ArrowError> { return Ok(ts.timestamp_nanos()); } + // without a timezone specifier as a local time, only date + // Example: 2020-09-08 + if let Ok(dt) = NaiveDate::parse_from_str(s, "%Y-%m-%d") { + if let Some(ts) = dt.and_hms_opt(0, 0, 0) { + return Ok(ts.timestamp_nanos()); + } + } + // Note we don't pass along the error message from the underlying // chrono parsing because we tried several different format // strings and we don't know which the user was trying to @@ -494,6 +503,19 @@ mod tests { naive_datetime_whole_secs.timestamp_nanos(), parse_timestamp("2020-09-08 13:42:29").unwrap() ); + + // ensure without time work + // no time, should be the nano second at + // 2020-09-08 0:0:0 + let naive_datetime_no_time = NaiveDateTime::new( + NaiveDate::from_ymd_opt(2020, 9, 8).unwrap(), + NaiveTime::from_hms_opt(0, 0, 0).unwrap(), + ); + + assert_eq!( + naive_datetime_no_time.timestamp_nanos(), + parse_timestamp("2020-09-08").unwrap() + ) } #[test]