public static DateTime AsUtc (this IDateTime dateTime)
{
if (dateTime.IsUniversalTime)
return DateTime.SpecifyKind (dateTime.Value, DateTimeKind.Utc);
if (!string.IsNullOrEmpty (dateTime.TZID))
{
var zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull (dateTime.TZID) ?? DateTimeZoneProviders.Tzdb.GetZoneOrNull (TimeZoneMapper.WindowsToIana (dateTime.TZID));
if (zone != null)
{
var localDateTime = LocalDateTime.FromDateTime (dateTime.Value);
var zonedDateTime = zone.AtLeniently (localDateTime);
var utcDateTime = zonedDateTime.ToDateTimeUtc();
return utcDateTime;
}
}
// fallback
return DateTime.SpecifyKind (dateTime.Value, DateTimeKind.Local).ToUniversalTime();
}
}