| | | 1 | | namespace ProjectTemplate.Infrastructure.Data; |
| | | 2 | | |
| | | 3 | | internal static class PersistenceTimestamp |
| | | 4 | | { |
| | | 5 | | internal const int Precision = 3; |
| | | 6 | | |
| | | 7 | | private const long _ticksPerMillisecond = TimeSpan.TicksPerMillisecond; |
| | | 8 | | |
| | | 9 | | internal static DateTime UtcNow() |
| | | 10 | | { |
| | 162 | 11 | | return NormalizeUtc(DateTime.UtcNow); |
| | | 12 | | } |
| | | 13 | | |
| | | 14 | | internal static DateTime NormalizeUtc(DateTime value) |
| | | 15 | | { |
| | 262 | 16 | | DateTime utcValue = value.Kind switch |
| | 262 | 17 | | { |
| | 234 | 18 | | DateTimeKind.Utc => value, |
| | 8 | 19 | | DateTimeKind.Local => value.ToUniversalTime(), |
| | 20 | 20 | | DateTimeKind.Unspecified => DateTime.SpecifyKind(value, DateTimeKind.Utc), |
| | 0 | 21 | | _ => DateTime.SpecifyKind(value, DateTimeKind.Utc) |
| | 262 | 22 | | }; |
| | | 23 | | |
| | 262 | 24 | | long normalizedTicks = utcValue.Ticks - (utcValue.Ticks % _ticksPerMillisecond); |
| | | 25 | | |
| | 262 | 26 | | return new DateTime(normalizedTicks, DateTimeKind.Utc); |
| | | 27 | | } |
| | | 28 | | |
| | | 29 | | internal static DateTimeOffset NormalizeUtc(DateTimeOffset value) |
| | | 30 | | { |
| | 6 | 31 | | DateTimeOffset utcValue = value.ToUniversalTime(); |
| | 6 | 32 | | long normalizedTicks = utcValue.Ticks - (utcValue.Ticks % _ticksPerMillisecond); |
| | | 33 | | |
| | 6 | 34 | | return new DateTimeOffset(normalizedTicks, TimeSpan.Zero); |
| | | 35 | | } |
| | | 36 | | } |