44 lines
1.3 KiB
C#
44 lines
1.3 KiB
C#
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;
|
|
}
|
|
}
|