@@ -77,6 +77,7 @@ mod format {
77
77
pub const YYYYMMDDHHMM_UTC_OFFSET : & str = "%Y%m%d%H%MUTC%z" ;
78
78
pub const YYYYMMDDHHMM_ZULU_OFFSET : & str = "%Y%m%d%H%MZ%z" ;
79
79
pub const YYYYMMDDHHMM_HYPHENATED_OFFSET : & str = "%Y-%m-%d %H:%M %z" ;
80
+ pub const YYYYMMDDHHMMSS_HYPHENATED_OFFSET : & str = "%Y-%m-%d %H:%M:%S %#z" ;
80
81
pub const YYYYMMDDHHMMS_T_SEP : & str = "%Y-%m-%dT%H:%M:%S" ;
81
82
pub const UTC_OFFSET : & str = "UTC%#z" ;
82
83
pub const ZULU_OFFSET : & str = "Z%#z" ;
@@ -154,9 +155,16 @@ pub fn parse_datetime_at_date<S: AsRef<str> + Clone>(
154
155
// similar
155
156
156
157
// Formats with offsets don't require NaiveDateTime workaround
158
+ //
159
+ // HACK: if the string ends with a single digit preceded by a + or -
160
+ // sign, then insert a 0 between the sign and the digit to make it
161
+ // possible for `chrono` to parse it.
162
+ let pattern = Regex :: new ( r"([\+-])(\d)$" ) . unwrap ( ) ;
163
+ let s = pattern. replace ( s. as_ref ( ) , "${1}0${2}" ) ;
157
164
for fmt in [
158
165
format:: YYYYMMDDHHMM_OFFSET ,
159
166
format:: YYYYMMDDHHMM_HYPHENATED_OFFSET ,
167
+ format:: YYYYMMDDHHMMSS_HYPHENATED_OFFSET ,
160
168
format:: YYYYMMDDHHMM_UTC_OFFSET ,
161
169
format:: YYYYMMDDHHMM_ZULU_OFFSET ,
162
170
] {
@@ -230,16 +238,7 @@ pub fn parse_datetime_at_date<S: AsRef<str> + Clone>(
230
238
// offsets, so instead we replicate parse_date behaviour by getting
231
239
// the current date with local, and create a date time string at midnight,
232
240
// before trying offset suffixes
233
- //
234
- // HACK: if the string ends with a single digit preceded by a + or -
235
- // sign, then insert a 0 between the sign and the digit to make it
236
- // possible for `chrono` to parse it.
237
- let pattern = Regex :: new ( r"([\+-])(\d)$" ) . unwrap ( ) ;
238
- let ts = format ! (
239
- "{}0000{}" ,
240
- date. format( "%Y%m%d" ) ,
241
- pattern. replace( s. as_ref( ) , "${1}0${2}" )
242
- ) ;
241
+ let ts = format ! ( "{}0000{}" , date. format( "%Y%m%d" ) , s) ;
243
242
for fmt in [
244
243
format:: UTC_OFFSET ,
245
244
format:: ZULU_OFFSET ,
@@ -370,7 +369,7 @@ mod tests {
370
369
371
370
#[ cfg( test) ]
372
371
mod offsets {
373
- use chrono:: Local ;
372
+ use chrono:: { Local , NaiveDate } ;
374
373
375
374
use crate :: parse_datetime;
376
375
use crate :: ParseDateTimeError ;
@@ -413,6 +412,17 @@ mod tests {
413
412
Err ( ParseDateTimeError :: InvalidInput )
414
413
) ;
415
414
}
415
+
416
+ #[ test]
417
+ fn test_datetime_with_offset ( ) {
418
+ let actual = parse_datetime ( "1997-01-19 08:17:48 +0" ) . unwrap ( ) ;
419
+ let expected = NaiveDate :: from_ymd_opt ( 1997 , 1 , 19 )
420
+ . unwrap ( )
421
+ . and_hms_opt ( 8 , 17 , 48 )
422
+ . unwrap ( )
423
+ . and_utc ( ) ;
424
+ assert_eq ! ( actual, expected) ;
425
+ }
416
426
}
417
427
418
428
#[ cfg( test) ]
0 commit comments