Skip to content

Commit b1a7eef

Browse files
committed
[#579] Timestamp encoding precision
1 parent e6a4c2f commit b1a7eef

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

src/Types/Encoder.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,11 +383,21 @@ public static void AddKnownDescribed(Descriptor descriptor, CreateDescribed ctor
383383
/// <returns></returns>
384384
public static long DateTimeToTimestamp(DateTime dateTime)
385385
{
386-
#if (NANOFRAMEWORK_1_0)
387-
return (long)((dateTime.Ticks - epochTicks) / TicksPerMillisecond);
388-
#else
389-
return (long)((dateTime.ToUniversalTime().Ticks - epochTicks) / TicksPerMillisecond);
386+
DateTime utc = dateTime;
387+
#if !NANOFRAMEWORK_1_0
388+
if (dateTime.Kind == DateTimeKind.Local)
389+
{
390+
utc = dateTime.ToUniversalTime();
391+
}
390392
#endif
393+
long ticks = utc.Ticks - epochTicks;
394+
long ms = ticks / TicksPerMillisecond;
395+
long remainder = ticks % TicksPerMillisecond;
396+
if (remainder >= TicksPerMillisecond / 2)
397+
{
398+
ms++;
399+
}
400+
return ms;
391401
}
392402

393403
/// <summary>

test/Test.Amqp.Net/AmqpCodecTests.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,22 @@ public void AmqpCodecListTest()
282282
EnsureEqual((IList)described.Value, (IList)described4.Value);
283283
}
284284

285+
[TestMethod()]
286+
public void AmqpCodecTimestampTest()
287+
{
288+
DateTime now = DateTime.UtcNow;
289+
now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, DateTimeKind.Utc);
290+
long ms = Encoder.DateTimeToTimestamp(now);
291+
DateTime value = Encoder.TimestampToDateTime(ms);
292+
Assert.AreEqual(now, value);
293+
294+
value = Encoder.TimestampToDateTime(Encoder.DateTimeToTimestamp(DateTime.MaxValue));
295+
Assert.AreEqual(DateTime.MaxValue, value);
296+
297+
value = Encoder.TimestampToDateTime(Encoder.DateTimeToTimestamp(DateTime.MinValue));
298+
Assert.AreEqual(DateTime.MinValue, value);
299+
}
300+
285301
[TestMethod()]
286302
public void AmqpCodecTimestampRangeTest()
287303
{
@@ -839,7 +855,7 @@ static void EnsureEqual(Map map1, Map map2)
839855

840856
static void EnsureEqual(DateTime d1, DateTime d2)
841857
{
842-
Assert.IsTrue(Math.Abs((d1.ToUniversalTime() - d2.ToUniversalTime()).TotalMilliseconds) < 5, "Datetime difference is greater than 5ms.");
858+
Assert.IsTrue(Math.Abs((d1 - d2).TotalMilliseconds) < 5, "Datetime difference is greater than 5ms.");
843859
}
844860

845861
static void EnsureEqual(object x, object y)

0 commit comments

Comments
 (0)