TimeProvider
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace System
{
[global::System.Runtime.CompilerServices.NullableContext(1)]
[global::System.Runtime.CompilerServices.Nullable(0)]
[ExcludeFromCodeCoverage]
internal abstract class TimeProvider
{
[global::System.Runtime.CompilerServices.NullableContext(0)]
private sealed class SystemTimeProvider : TimeProvider
{
internal SystemTimeProvider()
{
}
}
private static readonly long MinDateTicks = DateTime.MinValue.Ticks;
private static readonly long MaxDateTicks = DateTime.MaxValue.Ticks;
public static TimeProvider System { get; } = new SystemTimeProvider();
public virtual TimeZoneInfo LocalTimeZone => TimeZoneInfo.Local;
public virtual long TimestampFrequency => Stopwatch.Frequency;
public virtual DateTimeOffset GetUtcNow()
{
return DateTimeOffset.UtcNow;
}
public DateTimeOffset GetLocalNow()
{
DateTimeOffset utcNow = GetUtcNow();
TimeZoneInfo localTimeZone = LocalTimeZone;
if (localTimeZone == null)
throw new InvalidOperationException();
TimeSpan utcOffset = localTimeZone.GetUtcOffset(utcNow);
long num = utcNow.Ticks + utcOffset.Ticks;
if ((ulong)num > (ulong)MaxDateTicks)
num = ((num < MinDateTicks) ? MinDateTicks : MaxDateTicks);
return new DateTimeOffset(num, utcOffset);
}
public virtual long GetTimestamp()
{
return Stopwatch.GetTimestamp();
}
public virtual Task Delay(TimeSpan delay, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.Delay(delay, cancellationToken);
}
public virtual void CancelAfter(CancellationTokenSource source, TimeSpan delay)
{
source.CancelAfter(delay);
}
public TimeSpan GetElapsedTime(long startingTimestamp, long endingTimestamp)
{
long timestampFrequency = TimestampFrequency;
if (timestampFrequency <= 0)
throw new InvalidOperationException();
return new TimeSpan((long)((double)(endingTimestamp - startingTimestamp) * (10000000 / (double)timestampFrequency)));
}
public TimeSpan GetElapsedTime(long startingTimestamp)
{
return GetElapsedTime(startingTimestamp, GetTimestamp());
}
}
}