public class JsonDateTimeConverter : JsonConverter<DateTime>
{
// Lista de formatos de fecha/hora que se aceptan durante la deserialización
private static readonly string[] acceptedFormats = new[]
{
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd"
};
/// <summary>
/// Lógica para leer y convertir una cadena JSON a un objeto DateTime.
/// Intenta varios formatos definidos y luego un parseo por defecto si es necesario.
/// </summary>
/// <param name="reader">El lector JSON que contiene la cadena de fecha/hora.</param>
/// <param name="typeToConvert">El tipo al que se está convirtiendo (DateTime).</param>
/// <param name="options">Opciones de serialización JSON.</param>
/// <returns>Un objeto DateTime representando la fecha/hora leída.</returns>
/// <exception cref="JsonException">Lanza una excepción si no se puede convertir la cadena a DateTime.</exception>
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string value = reader.GetString();
foreach (var format in acceptedFormats)
{
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
{
return date;
}
}
// Último intento: usar TryParse estándar por si llega en otro formato aceptado por el sistema
if (DateTime.TryParse(value, out DateTime parsedDate))
{
return parsedDate;
}
throw new JsonException($"No se pudo convertir el valor '{value}' a DateTime.");
}
/// <summary>
/// Lógica para serializar un objeto DateTime a una cadena en formato ISO 8601.
/// </summary>
/// <param name="writer">El escritor JSON donde se escribirá la cadena de fecha/hora.</param>
/// <param name="value">El objeto DateTime que se va a serializar.</param>
/// <param name="options">Opciones de serialización JSON.</param>
/// <exception cref="NotSupportedException">Lanza una excepción si se intenta serializar un valor nulo.</exception>
/// <remarks>Siempre escribe en formato ISO 8601 para consistencia.</remarks>
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss"));
}
}