DateTimeDetector 0.0.13
dotnet add package DateTimeDetector --version 0.0.13
NuGet\Install-Package DateTimeDetector -Version 0.0.13
<PackageReference Include="DateTimeDetector" Version="0.0.13" />
<PackageVersion Include="DateTimeDetector" Version="0.0.13" />
<PackageReference Include="DateTimeDetector" />
paket add DateTimeDetector --version 0.0.13
#r "nuget: DateTimeDetector, 0.0.13"
#:package DateTimeDetector@0.0.13
#addin nuget:?package=DateTimeDetector&version=0.0.13
#tool nuget:?package=DateTimeDetector&version=0.0.13
DateTimeDetector
A Roslyn analyzer that detects usage of System.DateTime and suggests replacing it with System.DateTimeOffset.
Why?
DateTime does not store time zone information, which can lead to subtle bugs — especially in distributed systems, serialization, and database interactions. DateTimeOffset preserves the offset from UTC and is generally the safer default choice.
See:
- Microsoft: Choosing between DateTime, DateTimeOffset, TimeSpan, and TimeZoneInfo
- The case for DateTimeOffset
Installation
dotnet add package DateTimeDetector
Rules
| Rule ID | Category | Severity | Description |
|---|---|---|---|
| DT001 | Reliability | Warning | Prefer DateTimeOffset over DateTime |
Examples
// ❌ Flagged by DT001
DateTime now = DateTime.Now;
DateTime created = new DateTime();
List<DateTime> timestamps = new();
// ✅ After applying the code fix
DateTimeOffset now = DateTimeOffset.Now;
DateTimeOffset created = new DateTimeOffset();
List<DateTimeOffset> timestamps = new();
What gets detected
The analyzer flags any reference to System.DateTime including:
- Variable declarations:
DateTime x = ... - Parameters:
void Method(DateTime value) - Return types:
DateTime GetTime() - Properties and fields:
DateTime Created { get; set; } - Static member access:
DateTime.Now,DateTime.UtcNow - Object creation:
new DateTime() - Generic type arguments:
List<DateTime>
Custom types named DateTime in other namespaces are not flagged — only System.DateTime.
Limitations
- Constructor argument signatures differ between
DateTimeandDateTimeOffset(e.g.,new DateTime(2024, 1, 1)has no directDateTimeOffsetequivalent without an offset parameter). The analyzer will flag these, but the code fix may produce code that needs manual adjustment. - Some
DateTime-specific members (e.g.,DateTime.Today) have noDateTimeOffsetequivalent. The fix replaces the type name but you may need to adjust member access.
Suppressing the diagnostic
If you intentionally need DateTime (e.g., for interop), suppress per-site:
#pragma warning disable DT001
DateTime required = SomeLegacyApi();
#pragma warning restore DT001
Or in .editorconfig:
[*.cs]
dotnet_diagnostic.DT001.severity = none
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.