EonaCat.DeterministicTime
1.0.0
Prefix Reserved
dotnet add package EonaCat.DeterministicTime --version 1.0.0
NuGet\Install-Package EonaCat.DeterministicTime -Version 1.0.0
<PackageReference Include="EonaCat.DeterministicTime" Version="1.0.0" />
<PackageVersion Include="EonaCat.DeterministicTime" Version="1.0.0" />
<PackageReference Include="EonaCat.DeterministicTime" />
paket add EonaCat.DeterministicTime --version 1.0.0
#r "nuget: EonaCat.DeterministicTime, 1.0.0"
#:package EonaCat.DeterministicTime@1.0.0
#addin nuget:?package=EonaCat.DeterministicTime&version=1.0.0
#tool nuget:?package=EonaCat.DeterministicTime&version=1.0.0
EonaCat.DeterministicTime
EonaCat.DeterministicTime is a .NET library for deterministic, testable, and replayable time.
It replaces DateTime.UtcNow, Stopwatch, Timer, and Task.Delay with deterministic equivalents and supports advanced features like:
scheduling, time scaling, replay, NTP offsets, ASP.NET Framework integration. ASP.NET Core integration.
Installation
dotnet add package EonaCat.DeterministicTime
ASP.NET Core integration (optional)
dotnet add package DeterministicTime.AspNetCore
ASP.NET Framework integration (optional)
dotnet add package DeterministicTime.AspNetFramework
ASP.NET 4.8 → add DeterministicTime.AspNetFramework and register HttpModule in web.config:
<system.web>
<httpModules>
<add name="DeterministicTime" type="DeterministicTimeHttpModule"/>
</httpModules>
</system.web>
Basic Usage
using DeterministicTime;
DateTime now = DeterministicTime.UtcNow;
DateTime localNow = DeterministicTime.Now;
Freeze Time
using (TimeScope.Frozen(DateTime.Parse("2025-01-01T00:00:00Z")))
{
Console.WriteLine(DeterministicTime.UtcNow); // frozen
}
Scale Time
using (TimeScope.Scaled(10)) // 10x faster
{
// all timers and delays scale 10x
}
Advance Time Manually
DeterministicTime.Advance(TimeSpan.FromHours(2));
Offset Time
using (TimeScope.Offset(TimeSpan.FromMinutes(5)))
{
// all UtcNow calls are offset by 5 minutes
}
Deterministic Stopwatch
var sw = DeterministicStopwatch.StartNew();
// do work
sw.Stop();
Console.WriteLine(sw.Elapsed);
Deterministic Timer
int fired = 0;
DeterministicTimer.Start(TimeSpan.FromSeconds(10), () => fired++);
DeterministicTime.Advance(TimeSpan.FromSeconds(10));
Console.WriteLine(fired); // 1
Deterministic Delay
bool completed = false;
await DeterministicDelay.For(TimeSpan.FromSeconds(5)).ContinueWith(_ => completed = true);
DeterministicTime.Advance(TimeSpan.FromSeconds(5));
Console.WriteLine(completed); // true
Deterministic Scheduler
var scheduler = DeterministicScheduler.Global;
scheduler.Every(TimeSpan.FromMinutes(1), () => Console.WriteLine("Tick"));
DeterministicTime.Advance(TimeSpan.FromMinutes(5)); // fires 5 times
Time Recording & Replay
Record
using var recording = TimeRecording.Start();
// run code
recording.Save("run.json");
Replay
using (TimeReplay.Load("run.json"))
{
// deterministic replay of UtcNow calls
}
NTP Synchronization
using (NtpSynchronization.Sync(myNtpProvider))
{
// deterministic time aligned with NTP
}
Distributed Time Source
IDistributedTimeCoordinator coordinator = ...;
DeterministicTime.Push(new DistributedTimeSource(coordinator));
Console.WriteLine(DeterministicTime.UtcNow);
ASP.NET Core Middleware
app.UseDeterministicTime();
Each request runs in its own deterministic scope
Works with frozen/scaled time and timers
Advanced Features Summary
Deterministic UtcNow & Now
Stopwatch replacement
One-shot and repeated timers
Task.Delay replacement
Time scaling, freezing, offset
Scheduler for background jobs
Recording & replay for testing
NTP synchronization & distributed clocks
ASP.NET Core integration
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| .NET Framework | net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- EonaCat.Json (>= 1.2.0)
-
.NETStandard 2.1
- EonaCat.Json (>= 1.2.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on EonaCat.DeterministicTime:
| Package | Downloads |
|---|---|
|
EonaCat.DeterministicTime.AspNetFramework
ASP.NET 4.8 integration for DeterministicTime. |
|
|
EonaCat.DeterministicTime.AspNetCore
ASP.NET Core integration for DeterministicTime. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 282 | 12/15/2025 |