Skip to content

Commit 1d51bf6

Browse files
committed
Fix treatment of leap seconds
1 parent 7943d9b commit 1d51bf6

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

rmp/src/encode/mod.rs

+11-6
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,13 @@ pub fn write_timestamp<W: RmpWrite>(wr: &mut W, timestamp: Timestamp) -> Result<
136136
wr.write_data_u32(secs as u32)?;
137137
},
138138
Timestamp::T64(timedate) => {
139-
let secs = timedate.timestamp();
140-
let nsecs = timedate.timestamp_subsec_nanos();
141-
if secs < 0 || secs > 0x3_ffff_ffff || nsecs > crate::MAX_NSECS {
139+
let mut secs = timedate.timestamp();
140+
let mut nsecs = timedate.timestamp_subsec_nanos();
141+
if nsecs > crate::MAX_NSECS {
142+
nsecs %= 1_000_000_000;
143+
secs += 1;
144+
}
145+
if secs < 0 || secs > 0x3_ffff_ffff {
142146
return Ok(false)
143147
}
144148
write_marker(wr, Marker::FixExt8).map_err(|e| e.0)?;
@@ -147,10 +151,11 @@ pub fn write_timestamp<W: RmpWrite>(wr: &mut W, timestamp: Timestamp) -> Result<
147151
wr.write_data_u64(data)?;
148152
},
149153
Timestamp::T96(timedate) => {
150-
let secs = timedate.timestamp();
151-
let nsecs = timedate.timestamp_subsec_nanos();
154+
let mut secs = timedate.timestamp();
155+
let mut nsecs = timedate.timestamp_subsec_nanos();
152156
if nsecs > crate::MAX_NSECS {
153-
return Ok(false)
157+
nsecs %= 1_000_000_000;
158+
secs += 1;
154159
}
155160
write_marker(wr, Marker::Ext8).map_err(|e| e.0)?;
156161
wr.write_data_u8(12)?;

0 commit comments

Comments
 (0)