@@ -265,16 +265,17 @@ fn parse_timestamp(m: &str) -> ParseResult<(Option<time::Timespec>, &str)> {
265
265
}
266
266
Some ( c) => {
267
267
let ( sign, irest) = match c {
268
- '+' => ( 1 , & rest[ 1 ..] ) ,
269
- '-' => ( -1 , & rest[ 1 ..] ) ,
268
+ // Note: signs are backwards as per RFC3339
269
+ '-' => ( 1 , & rest[ 1 ..] ) ,
270
+ '+' => ( -1 , & rest[ 1 ..] ) ,
270
271
_ => {
271
272
return Err ( ParseErr :: InvalidUTCOffset ) ;
272
273
}
273
274
} ;
274
275
let hours = i32:: from_str ( & irest[ 0 ..2 ] ) . map_err ( ParseErr :: IntConversionErr ) ?;
275
276
let minutes = i32:: from_str ( & irest[ 3 ..5 ] ) . map_err ( ParseErr :: IntConversionErr ) ?;
276
277
rest = & irest[ 5 ..] ;
277
- minutes + hours * 60 * sign
278
+ minutes * sign + hours * 60 * sign
278
279
}
279
280
} ;
280
281
tm = tm + time:: Duration :: minutes ( i64:: from ( utc_offset_mins) ) ;
@@ -420,8 +421,16 @@ mod tests {
420
421
421
422
#[ test]
422
423
fn test_with_time_offset_nonzero ( ) {
423
- let msg = parse_message ( "<1>1 2015-01-01T00:00:00+ 10:00 - - - - -" ) . expect ( "Should parse empty message" ) ;
424
+ let msg = parse_message ( "<1>1 2015-01-01T00:00:00- 10:00 - - - - -" ) . expect ( "Should parse empty message" ) ;
424
425
assert_eq ! ( msg. timestamp, Some ( 1420106400 ) ) ;
426
+ // example from RFC 3339
427
+ let msg1 = parse_message ( "<1>1 2015-01-01T18:50:00-04:00 - - - - -" ) . expect ( "Should parse empty message" ) ;
428
+ let msg2 = parse_message ( "<1>1 2015-01-01T22:50:00Z - - - - -" ) . expect ( "Should parse empty message" ) ;
429
+ assert_eq ! ( msg1. timestamp, msg2. timestamp) ;
430
+ // example with fractional minutes
431
+ let msg1 = parse_message ( "<1>1 2019-01-20T00:46:39+05:45 - - - - -" ) . expect ( "Should parse empty message" ) ;
432
+ let msg2 = parse_message ( "<1>1 2019-01-19T11:01:39-08:00 - - - - -" ) . expect ( "Should parse empty message" ) ;
433
+ assert_eq ! ( msg1. timestamp, msg2. timestamp) ;
425
434
}
426
435
427
436
#[ test]
@@ -493,22 +502,22 @@ mod tests {
493
502
assert_eq ! ( msg. timestamp, Some ( 482196050 ) ) ;
494
503
assert_eq ! ( msg. timestamp_nanos, Some ( 520000000 ) ) ;
495
504
496
- let msg = parse_message ( "<1>1 1985-04-12T19:20:50.52- 04:00 host - - - -" )
505
+ let msg = parse_message ( "<1>1 1985-04-12T19:20:50.52+ 04:00 host - - - -" )
497
506
. expect ( "Should parse empty message" ) ;
498
507
assert_eq ! ( msg. timestamp, Some ( 482167250 ) ) ;
499
508
assert_eq ! ( msg. timestamp_nanos, Some ( 520000000 ) ) ;
500
509
501
- let msg = parse_message ( "<1>1 1985-04-12T19:20:50- 04:00 host - - - -" )
510
+ let msg = parse_message ( "<1>1 1985-04-12T19:20:50+ 04:00 host - - - -" )
502
511
. expect ( "Should parse empty message" ) ;
503
512
assert_eq ! ( msg. timestamp, Some ( 482167250 ) ) ;
504
513
assert_eq ! ( msg. timestamp_nanos, Some ( 0 ) ) ;
505
514
506
- let msg = parse_message ( "<1>1 2003-08-24T05:14:15.000003- 07:00 host - - - -" )
515
+ let msg = parse_message ( "<1>1 2003-08-24T05:14:15.000003+ 07:00 host - - - -" )
507
516
. expect ( "Should parse empty message" ) ;
508
517
assert_eq ! ( msg. timestamp, Some ( 1061676855 ) ) ;
509
518
assert_eq ! ( msg. timestamp_nanos, Some ( 3000 ) ) ;
510
519
511
- let msg = parse_message ( "<1>1 2003-08-24T05:14:15.000000003- 07:00 host - - - -" ) ;
520
+ let msg = parse_message ( "<1>1 2003-08-24T05:14:15.000000003+ 07:00 host - - - -" ) ;
512
521
assert ! ( msg. is_err( ) , "expected parse fail" ) ;
513
522
}
514
523
0 commit comments