Skip to content

Commit 0df27ee

Browse files
committed
fix sign error in timezones
Merge branch 'issue_13' Closes #13
2 parents 14f3972 + 5cdd534 commit 0df27ee

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

src/parser.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,17 @@ fn parse_timestamp(m: &str) -> ParseResult<(Option<time::Timespec>, &str)> {
265265
}
266266
Some(c) => {
267267
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..]),
270271
_ => {
271272
return Err(ParseErr::InvalidUTCOffset);
272273
}
273274
};
274275
let hours = i32::from_str(&irest[0..2]).map_err(ParseErr::IntConversionErr)?;
275276
let minutes = i32::from_str(&irest[3..5]).map_err(ParseErr::IntConversionErr)?;
276277
rest = &irest[5..];
277-
minutes + hours * 60 * sign
278+
minutes * sign + hours * 60 * sign
278279
}
279280
};
280281
tm = tm + time::Duration::minutes(i64::from(utc_offset_mins));
@@ -420,8 +421,16 @@ mod tests {
420421

421422
#[test]
422423
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");
424425
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);
425434
}
426435

427436
#[test]
@@ -493,22 +502,22 @@ mod tests {
493502
assert_eq!(msg.timestamp, Some(482196050));
494503
assert_eq!(msg.timestamp_nanos, Some(520000000));
495504

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 - - - -")
497506
.expect("Should parse empty message");
498507
assert_eq!(msg.timestamp, Some(482167250));
499508
assert_eq!(msg.timestamp_nanos, Some(520000000));
500509

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 - - - -")
502511
.expect("Should parse empty message");
503512
assert_eq!(msg.timestamp, Some(482167250));
504513
assert_eq!(msg.timestamp_nanos, Some(0));
505514

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 - - - -")
507516
.expect("Should parse empty message");
508517
assert_eq!(msg.timestamp, Some(1061676855));
509518
assert_eq!(msg.timestamp_nanos, Some(3000));
510519

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 - - - -");
512521
assert!(msg.is_err(), "expected parse fail");
513522
}
514523

0 commit comments

Comments
 (0)