Skip to content

Commit d43af3b

Browse files
committed
Improve accuracy for UtcDatetime conversion from timestamp
1 parent f259135 commit d43af3b

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-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 / 1000, 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() * 1000),
166+
&Bson::UtcDatetime(ref v) => {
167+
write_i64(writer, (v.timestamp() * 1000) + (v.nanosecond() / 1000000) as i64)
168+
},
166169
&Bson::Null => Ok(())
167170
}
168171
}

0 commit comments

Comments
 (0)