Skip to content

Commit f259135

Browse files
committed
Fix UtcDatetime en/decoding
1 parent 1c1fcca commit f259135

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

src/decoder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ fn decode_bson<R: Read + ?Sized>(reader: &mut R, tag: u8) -> DecoderResult<Bson>
215215
Some(TimeStamp) => read_i64(reader).map(Bson::TimeStamp),
216216
Some(UtcDatetime) => {
217217
let time = try!(read_i64(reader));
218-
Ok(Bson::UtcDatetime(DateTime::from_utc(NaiveDateTime::from_timestamp(time, 0), UTC)))
218+
Ok(Bson::UtcDatetime(DateTime::from_utc(NaiveDateTime::from_timestamp(time / 1000, 0), UTC)))
219219
},
220220
Some(Deprecated) |
221221
Some(Undefined) |

src/encoder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ fn encode_bson<W: Write + ?Sized>(writer: &mut W, key: &str, val: &Bson) -> Enco
162162
try!(writer.write_u8(From::from(subtype)));
163163
writer.write_all(data).map_err(From::from)
164164
},
165-
&Bson::UtcDatetime(ref v) => write_i64(writer, v.timestamp()),
165+
&Bson::UtcDatetime(ref v) => write_i64(writer, v.timestamp() * 1000),
166166
&Bson::Null => Ok(())
167167
}
168168
}

tests/modules/encoder.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
extern crate bson;
2+
extern crate chrono;
23

34
use bson::{Document, Bson, encode_document};
5+
use chrono::UTC;
6+
use chrono::offset::TimeZone;
47

58
#[test]
69
fn test_encode_floating_point() {
@@ -43,3 +46,16 @@ fn test_encode_array() {
4346

4447
assert_eq!(&buf[..], &dst[..]);
4548
}
49+
#[test]
50+
fn test_encode_utc_date_time() {
51+
let src = UTC.timestamp(1286705410, 0);
52+
let dst = [18, 0, 0, 0, 9, 107, 101, 121, 0, 208, 111, 158, 149, 43, 1, 0, 0, 0];
53+
54+
let mut doc = Document::new();
55+
doc.insert("key".to_owned(), Bson::UtcDatetime(src));
56+
57+
let mut buf = Vec::new();
58+
encode_document(&mut buf, &doc).unwrap();
59+
60+
assert_eq!(&buf[..], &dst[..]);
61+
}

0 commit comments

Comments
 (0)