using System.Text.Json; using System.Text.Json.Serialization; namespace Mercados.Api.Utils { /// /// Un convertidor de JSON personalizado para asegurar que los objetos DateTime /// se serialicen al formato ISO 8601 en UTC (con el designador 'Z'). /// public class UtcDateTimeConverter : JsonConverter { /// /// Lee un valor DateTime desde el lector JSON y lo convierte a UTC. /// /// El lector JSON. /// El tipo a convertir. /// Las opciones de serialización JSON. /// El valor DateTime en UTC. public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // Al leer un string de fecha, nos aseguramos de que se interprete como UTC return reader.GetDateTime().ToUniversalTime(); } /// /// Escribe un valor DateTime en formato UTC como una cadena en el escritor JSON. /// /// El escritor JSON. /// El valor DateTime a escribir. /// Las opciones de serialización JSON. public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { // Antes de escribir el string, especificamos que el 'Kind' es Utc. // Si ya es Utc, no hace nada. Si es Local o Unspecified, lo trata como si fuera Utc. // Esto es seguro porque sabemos que todas nuestras fechas en la BD son UTC. var utcValue = DateTime.SpecifyKind(value, DateTimeKind.Utc); writer.WriteStringValue(utcValue); } } }