using System;
using System.Text;
namespace OmiLAXR.Extensions
{
public static class Time_Ext
{
///
/// Formats a DateTimeOffset as an xAPI-compliant ISO 8601 UTC timestamp.
///
public static string ToRfc3339(this DateTimeOffset dto)
{
return dto.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
}
///
/// Formats a DateTime as an xAPI-compliant ISO 8601 UTC timestamp.
///
public static string ToRfc3339(this DateTime dateTime)
{
// Ensure UTC, then format with milliseconds
return dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
}
///
/// Converts a TimeSpan to ISO 8601 duration format (e.g., "PT1H2M3S").
///
public static string ToIso8601(this TimeSpan timeSpan)
{
if (timeSpan == TimeSpan.Zero)
return "PT0S";
var sb = new StringBuilder();
sb.Append("P");
if (timeSpan.Days > 0)
sb.Append($"{timeSpan.Days}D");
if (timeSpan.Hours > 0 || timeSpan.Minutes > 0 || timeSpan.Seconds > 0 || timeSpan.Milliseconds > 0)
{
sb.Append("T");
if (timeSpan.Hours > 0)
sb.Append($"{timeSpan.Hours}H");
if (timeSpan.Minutes > 0)
sb.Append($"{timeSpan.Minutes}M");
if (timeSpan.Seconds > 0 || timeSpan.Milliseconds > 0)
{
var seconds = timeSpan.Seconds + timeSpan.Milliseconds / 1000.0;
sb.Append($"{seconds:0.###}S");
}
}
return sb.ToString();
}
}
}