1- use chrono:: { DateTime , Duration , LocalResult , NaiveDate , NaiveDateTime , TimeZone } ;
1+ use chrono:: { DateTime , Duration , LocalResult , NaiveDateTime , TimeZone } ;
22use chrono_tz:: Tz ;
33use cubenativeutils:: CubeError ;
4+ use lazy_static:: lazy_static;
45use regex:: Regex ;
6+
57pub struct QueryDateTimeHelper { }
68
7- use lazy_static:: lazy_static;
89lazy_static ! {
910 static ref DATE_TIME_LOCAL_MS_RE : Regex =
1011 Regex :: new( r"^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\d$" ) . unwrap( ) ;
1112 static ref DATE_TIME_LOCAL_U_RE : Regex =
1213 Regex :: new( r"^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\d\d\d\d$" ) . unwrap( ) ;
1314 static ref DATE_RE : Regex = Regex :: new( r"^\d\d\d\d-\d\d-\d\d$" ) . unwrap( ) ;
1415}
16+
1517impl QueryDateTimeHelper {
1618 pub fn parse_native_date_time ( date : & str ) -> Result < NaiveDateTime , CubeError > {
1719 let formats = & [
@@ -28,8 +30,9 @@ impl QueryDateTimeHelper {
2830 }
2931 }
3032
31- if let Ok ( d) = NaiveDate :: parse_from_str ( date, "%Y-%m-%d" ) {
32- return Ok ( d. and_hms_opt ( 0 , 0 , 0 ) . unwrap ( ) ) ;
33+ // Fallback as RFC3339/ISO8601 with 'Z' timezone
34+ if let Ok ( dt) = DateTime :: parse_from_rfc3339 ( date) {
35+ return Ok ( dt. naive_utc ( ) ) ;
3336 }
3437
3538 Err ( CubeError :: user ( format ! ( "Can't parse date: '{}'" , date) ) )
@@ -153,6 +156,8 @@ impl QueryDateTimeHelper {
153156#[ cfg( test) ]
154157mod tests {
155158 use super :: * ;
159+ use chrono:: NaiveDate ;
160+
156161 #[ test]
157162 fn test_parse_native_date_time ( ) {
158163 assert_eq ! (
@@ -190,5 +195,20 @@ mod tests {
190195 . and_hms_milli_opt( 12 , 10 , 15 , 345 )
191196 . unwrap( )
192197 ) ;
198+ // Test parsing with 'Z' timezone (UTC)
199+ assert_eq ! (
200+ QueryDateTimeHelper :: parse_native_date_time( "2024-01-01T10:15:00Z" ) . unwrap( ) ,
201+ NaiveDate :: from_ymd_opt( 2024 , 1 , 1 )
202+ . unwrap( )
203+ . and_hms_opt( 10 , 15 , 0 )
204+ . unwrap( )
205+ ) ;
206+ assert_eq ! (
207+ QueryDateTimeHelper :: parse_native_date_time( "2024-01-01T10:15:00.123Z" ) . unwrap( ) ,
208+ NaiveDate :: from_ymd_opt( 2024 , 1 , 1 )
209+ . unwrap( )
210+ . and_hms_milli_opt( 10 , 15 , 0 , 123 )
211+ . unwrap( )
212+ ) ;
193213 }
194214}
0 commit comments