@using System.Globalization
@code {
public enum DateDisplayFormat
{
Relative,
Localized
}
[Parameter, EditorRequired]
public DateTimeOffset DateTimeOffset { get; set; }
[Parameter]
public DateDisplayFormat Format { get; set; }
[Parameter(CaptureUnmatchedValues = true)]
public Dictionary? InputAttributes { get; set; }
private static string ToTimeAgo(DateTimeOffset date) => ToTimeAgo(DateTimeOffset.UtcNow - date);
private static string ToTimeAgo(DateTime date) => ToTimeAgo(DateTimeOffset.UtcNow - date);
private static string ToTimeAgo(TimeSpan diff) =>
diff.TotalSeconds > 0 ? $"{TimeString(diff)} ago" : $"in {TimeString(diff.Negate())}";
private static string TimeString(TimeSpan timeSpan)
{
if (timeSpan.TotalMinutes < 1)
{
return $"{(int)timeSpan.TotalSeconds} second{Plural((int)timeSpan.TotalSeconds)}";
}
if (timeSpan.TotalHours < 1)
{
return $"{(int)timeSpan.TotalMinutes} minute{Plural((int)timeSpan.TotalMinutes)}";
}
return timeSpan.Days < 1
? $"{(int)timeSpan.TotalHours} hour{Plural((int)timeSpan.TotalHours)}"
: $"{(int)timeSpan.TotalDays} day{Plural((int)timeSpan.TotalDays)}";
}
private static string Plural(int value)
{
return value == 1 ? string.Empty : "s";
}
private string GetDisplayDate() =>
Format == DateDisplayFormat.Relative
? ToTimeAgo(DateTimeOffset)
: DateTimeOffset.ToString("g", CultureInfo.InvariantCulture);
}