40 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Text.Json;
 | |
| using System.Text.Json.Serialization;
 | |
| 
 | |
| namespace Mercados.Api.Utils
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Un convertidor de JSON personalizado para asegurar que los objetos DateTime
 | |
|     /// se serialicen al formato ISO 8601 en UTC (con el designador 'Z').
 | |
|     /// </summary>
 | |
|     public class UtcDateTimeConverter : JsonConverter<DateTime>
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Lee un valor DateTime desde el lector JSON y lo convierte a UTC.
 | |
|         /// </summary>
 | |
|         /// <param name="reader">El lector JSON.</param>
 | |
|         /// <param name="typeToConvert">El tipo a convertir.</param>
 | |
|         /// <param name="options">Las opciones de serialización JSON.</param>
 | |
|         /// <returns>El valor DateTime en UTC.</returns>
 | |
|         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();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Escribe un valor DateTime en formato UTC como una cadena en el escritor JSON.
 | |
|         /// </summary>
 | |
|         /// <param name="writer">El escritor JSON.</param>
 | |
|         /// <param name="value">El valor DateTime a escribir.</param>
 | |
|         /// <param name="options">Las opciones de serialización JSON.</param>
 | |
|                 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);
 | |
|                 }
 | |
|     }
 | |
| } |