@@ -189,13 +189,11 @@ pub fn string_to_datetime<T: TimeZone>(
189
189
let parser = TimestampParser :: new ( bytes) ;
190
190
let date = parser. date ( ) . ok_or_else ( || err ( "error parsing date" ) ) ?;
191
191
if bytes. len ( ) == 10 {
192
- let offset = timezone. offset_from_local_date ( & date) ;
193
- let offset = offset
192
+ let datetime = date. and_time ( NaiveTime :: from_hms_opt ( 0 , 0 , 0 ) . unwrap ( ) ) ;
193
+ return timezone
194
+ . from_local_datetime ( & datetime)
194
195
. single ( )
195
- . ok_or_else ( || err ( "error computing timezone offset" ) ) ?;
196
-
197
- let time = NaiveTime :: from_hms_opt ( 0 , 0 , 0 ) . unwrap ( ) ;
198
- return Ok ( DateTime :: from_local ( date. and_time ( time) , offset) ) ;
196
+ . ok_or_else ( || err ( "error computing timezone offset" ) ) ;
199
197
}
200
198
201
199
if !parser. test ( 10 , b'T' ) && !parser. test ( 10 , b't' ) && !parser. test ( 10 , b' ' ) {
@@ -213,28 +211,24 @@ pub fn string_to_datetime<T: TimeZone>(
213
211
}
214
212
215
213
if bytes. len ( ) <= tz_offset {
216
- let offset = timezone. offset_from_local_datetime ( & datetime ) ;
217
- let offset = offset
214
+ return timezone
215
+ . from_local_datetime ( & datetime )
218
216
. single ( )
219
- . ok_or_else ( || err ( "error computing timezone offset" ) ) ?;
220
- return Ok ( DateTime :: from_local ( datetime, offset) ) ;
217
+ . ok_or_else ( || err ( "error computing timezone offset" ) ) ;
221
218
}
222
219
223
220
if bytes[ tz_offset] == b'z' || bytes[ tz_offset] == b'Z' {
224
- let offset = timezone. offset_from_local_datetime ( & datetime) ;
225
- let offset = offset
226
- . single ( )
227
- . ok_or_else ( || err ( "error computing timezone offset" ) ) ?;
228
- return Ok ( DateTime :: from_utc ( datetime, offset) ) ;
221
+ return Ok ( timezone. from_utc_datetime ( & datetime) ) ;
229
222
}
230
223
231
224
// Parse remainder of string as timezone
232
225
let parsed_tz: Tz = s[ tz_offset..] . trim_start ( ) . parse ( ) ?;
233
- let offset = parsed_tz. offset_from_local_datetime ( & datetime ) ;
234
- let offset = offset
226
+ let parsed = parsed_tz
227
+ . from_local_datetime ( & datetime )
235
228
. single ( )
236
229
. ok_or_else ( || err ( "error computing timezone offset" ) ) ?;
237
- Ok ( DateTime :: < Tz > :: from_local ( datetime, offset) . with_timezone ( timezone) )
230
+
231
+ Ok ( parsed. with_timezone ( timezone) )
238
232
}
239
233
240
234
/// Accepts a string in RFC3339 / ISO8601 standard format and some
0 commit comments