diff options
Diffstat (limited to 'src/csharp/Grpc.Core/Internal/Timespec.cs')
-rw-r--r-- | src/csharp/Grpc.Core/Internal/Timespec.cs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/csharp/Grpc.Core/Internal/Timespec.cs b/src/csharp/Grpc.Core/Internal/Timespec.cs index 32a9c93f77..887eae5dd7 100644 --- a/src/csharp/Grpc.Core/Internal/Timespec.cs +++ b/src/csharp/Grpc.Core/Internal/Timespec.cs @@ -179,6 +179,41 @@ namespace Grpc.Core.Internal 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 { |