implemented FromDateTime

pull/2643/head
Jan Tattermusch 9 years ago
parent f6410f54bc
commit 4113ba5420
  1. 15
      src/csharp/Grpc.Core.Tests/Internal/TimespecTest.cs
  2. 35
      src/csharp/Grpc.Core/Internal/Timespec.cs

@ -41,9 +41,22 @@ namespace Grpc.Core.Internal.Tests
public class TimespecTest public class TimespecTest
{ {
[Test] [Test]
public void Now() public void Now_IsInUtc()
{
Assert.AreEqual(DateTimeKind.Utc, Timespec.Now.ToDateTime().Kind);
}
[Test]
public void Now_AgreesWithUtcNow()
{ {
var timespec = Timespec.Now; var timespec = Timespec.Now;
var utcNow = DateTime.UtcNow;
TimeSpan difference = utcNow - timespec.ToDateTime();
// This test is inherently a race - but the two timestamps
// should really be way less that a minute apart.
Assert.IsTrue(difference.TotalSeconds < 60);
} }
[Test] [Test]

@ -179,6 +179,41 @@ namespace Grpc.Core.Internal
return tv_sec.ToInt64() > 0 ? DateTime.MaxValue : DateTime.MinValue; return tv_sec.ToInt64() > 0 ? DateTime.MaxValue : DateTime.MinValue;
} }
} }
public static Timespec FromDateTime(DateTime dateTime)
{
if (dateTime == DateTime.MaxValue)
{
return Timespec.InfFuture;
}
if (dateTime == DateTime.MinValue)
{
return Timespec.InfPast;
}
Preconditions.CheckArgument(dateTime.Kind == DateTimeKind.Utc, "dateTime");
try
{
TimeSpan timeSpan = dateTime - UnixEpoch;
long ticks = timeSpan.Ticks;
IntPtr seconds = new IntPtr(ticks / TicksPerSecond); // possible OverflowException
// (x % m + m) % m is workaround for modulo semantics with negative numbers.
int nanos = (int)(((ticks % TicksPerSecond + TicksPerSecond) % TicksPerSecond) * NanosPerTick);
return new Timespec(seconds, nanos);
}
catch (OverflowException)
{
return dateTime > UnixEpoch ? Timespec.InfFuture : Timespec.InfPast;
}
catch (ArgumentOutOfRangeException)
{
return dateTime > UnixEpoch ? Timespec.InfFuture : Timespec.InfPast;
}
}
internal static int NativeSize internal static int NativeSize
{ {

Loading…
Cancel
Save