using System.Globalization; namespace StellaOps.Scanner.Core.Utility; public static class ScannerTimestamps { private const long TicksPerMicrosecond = TimeSpan.TicksPerMillisecond / 1000; public static DateTimeOffset Normalize(DateTimeOffset value) { var utc = value.ToUniversalTime(); var ticks = utc.Ticks - (utc.Ticks % TicksPerMicrosecond); return new DateTimeOffset(ticks, TimeSpan.Zero); } public static DateTimeOffset UtcNow(TimeProvider? provider = null) => Normalize((provider ?? TimeProvider.System).GetUtcNow()); public static string ToIso8601(DateTimeOffset value) => Normalize(value).ToString("yyyy-MM-dd'T'HH:mm:ss.ffffff'Z'", CultureInfo.InvariantCulture); public static bool TryParseIso8601(string? value, out DateTimeOffset timestamp) { if (string.IsNullOrWhiteSpace(value)) { timestamp = default; return false; } if (DateTimeOffset.TryParse( value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var parsed)) { timestamp = Normalize(parsed); return true; } timestamp = default; return false; } }