System.TimeProvider is an abstraction of time that provides a point in time as a DateTimeOffset value. By using TimeProvider, you can make sure your code is testable and predictable. TimeProvider was introduced in .NET 8.
Default Implementation
By default, TimeProvider uses DateTimeOffset.UtcNow as its time source.
Console.WriteLine($"Local: {TimeProvider.System.GetLocalNow()}");
Console.WriteLine($"Utc: {TimeProvider.System.GetUtcNow()}");
Custom Implementation
public class CustomTimeProvider: TimeProvider
{
public override DateTimeOffset GetUtcNow() => DateTimeOffset.UtcNow.AddHours(1);
}
builder.Services.AddSingleton(TimeProvider.System);
builder.Services.AddSingleton<TimeProvider, CustomTimeProvider>();
public class MyService
{
private readonly TimeProvider _timeProvider;
public MyService(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}
public void DoSomething()
{
var now = _timeProvider.Now;
Console.WriteLine(now);
}
}
FakeTimeProvider Implementation
dotnet add package Microsoft.Extensions.TimeProvider.Testing
FakeTimeProvider fakeTimeProvider = new();
fakeTimeProvider.SetUtcNow(fakeTimeProvider.GetUtcNow().AddHours(1));
MyService service = new (timeProvider);
service.DoSomething();