Skip to content

Commit 5cf8d5a

Browse files
committed
Merge pull request #11 from matsimitsu/fix_datetime_encoding
Fix UtcDatetime en/decoding
2 parents c55a217 + d43af3b commit 5cf8d5a

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

src/decoder.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ use std::io::{self, Read};
2525
use std::{str, error, fmt};
2626

2727
use byteorder::{self, LittleEndian, ReadBytesExt};
28-
use chrono::{DateTime, NaiveDateTime, UTC};
28+
use chrono::{UTC};
29+
use chrono::offset::TimeZone;
2930

3031
use spec::{self, BinarySubtype};
3132
use bson::{Bson, Array, Document};
@@ -215,7 +216,7 @@ fn decode_bson<R: Read + ?Sized>(reader: &mut R, tag: u8) -> DecoderResult<Bson>
215216
Some(TimeStamp) => read_i64(reader).map(Bson::TimeStamp),
216217
Some(UtcDatetime) => {
217218
let time = try!(read_i64(reader));
218-
Ok(Bson::UtcDatetime(DateTime::from_utc(NaiveDateTime::from_timestamp(time, 0), UTC)))
219+
Ok(Bson::UtcDatetime(UTC.timestamp(time / 1000, (time % 1000) as u32 * 1000000)))
219220
},
220221
Some(Deprecated) |
221222
Some(Undefined) |

src/encoder.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use std::io::{self, Write};
2525
use std::iter::IntoIterator;
2626
use std::{mem, error, fmt};
27+
use chrono::Timelike;
2728

2829
use byteorder::{self, LittleEndian, WriteBytesExt};
2930

@@ -162,7 +163,9 @@ fn encode_bson<W: Write + ?Sized>(writer: &mut W, key: &str, val: &Bson) -> Enco
162163
try!(writer.write_u8(From::from(subtype)));
163164
writer.write_all(data).map_err(From::from)
164165
},
165-
&Bson::UtcDatetime(ref v) => write_i64(writer, v.timestamp()),
166+
&Bson::UtcDatetime(ref v) => {
167+
write_i64(writer, (v.timestamp() * 1000) + (v.nanosecond() / 1000000) as i64)
168+
},
166169
&Bson::Null => Ok(())
167170
}
168171
}

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)