Saltar al contenido

Serialización JSON Date y DateTime en c# y newtonsoft

Te damos la bienvenida a nuestra comunidad, aquí vas a hallar la resolución que necesitas.

Solución:

Como mencioné en un comentario, no hay una representación de fecha estándar en JSON. El ISO8601 es el de facto estándar, es decir, la mayoría de la gente comenzó a usar esto hace algunos años. ISO8601 hace no requieren milisegundos. Si el otro extremo los requiere, está violando el estándar de facto.

Json.NET usa IOS8601 desde la versión 4.5. El actual es 10.0.3. El siguiente código:

JsonConvert.SerializeObject(DateTime.Now)

devoluciones

"2017-09-08T19:01:55.714942+03:00"

En mi máquina. Observe el desplazamiento de la zona horaria. Eso también es parte del estándar. Z significa UTC.

puede especifique su propio formato de hora, siempre que sea el correcto. En este caso, debe ser yyyy-MM-ddTHH:mm:ss.fffZ. Observe la fff por milisegundos yHH por 24 horas.

El siguiente código

var settings=new JsonSerializerSettingsDateFormatString ="yyyy-MM-ddTHH:mm:ss.fffZ";
var json=JsonConvert.SerializeObject(DateTime.Now,settings);

devoluciones

"2017-09-08T19:04:14.480Z"

El formato string hace no forzar una traducción de zona horaria. Puede decirle a Json.NET que trate la hora como Local o Utc a través de la configuración DateTimeZoneHandling:

var settings=new JsonSerializerSettings
                              DateFormatString ="yyyy-MM-ddTH:mm:ss.fffZ",
                              DateTimeZoneHandling=DateTimeZoneHandling.Utc;
var json=JsonConvert.SerializeObject(DateTime.Now,settings);

Devoluciones :

"2017-09-08T16:08:19.290Z"

ACTUALIZAR

Como explica Matt Johnson, Z es solo un literal, mientras que K genera cualquiera Z o una compensación, dependiendo de la DateTimeZoneHandling entorno.

El formato string yyyy-MM-ddTH:mm:ss.fffK con DateTimeZoneHandling.Utc:

var settings=new JsonSerializerSettings
                              DateFormatString ="yyyy-MM-ddTH:mm:ss.fffK",
                              DateTimeZoneHandling=DateTimeZoneHandling.Utc;
var json=JsonConvert.SerializeObject(DateTime.Now,settings);

Volverá:

2017-09-11T9:10:08.293Z

cambiando a DateTimeZoneHandling.Utc regresará

2017-09-11T12:15:12.862+03:00

Que, por cierto, es el defecto comportamiento de Json.NET, además de la forzada precisión de milisegundos.

Finalmente, .NET no tiene un Date-solo tipo aún. DateTime se utiliza tanto para fechas como para valores de fecha y hora. Puede obtener la parte de la fecha de un DateTime con la propiedad DateTime.Date. Puede recuperar la fecha actual con DateTime.Today.

La hora del día está representada por el tipo Intervalo de tiempo. Puede extraer la hora del día de un valor DateTime con DateTime.TimeOfDay. Timespan no es estrictamente un tipo de hora del día, ya que puede representar más de 24 horas.

Qué fue eso aún?

El soporte para fecha explícita, TimeOfDay está llegando a través del proyecto CoreFX Lab. Este contiene características “experimentales” que son extremadamente es probable que aparezca en .NET Runtime como compatibilidad con UTF8, fecha, cadena, canales. Algunos de estos ya aparecen como paquetes NuGet independientes.

Ya se pueden usar las clases System.Time, ya sea copiando el código o agregándolos a través de la fuente NuGet experimental.

Obtenga el formato de hora universal actual a json y viceversa:

DateTime currentDateTime = DateTime.Now.ToUniversalTime();
var jsonDateTime = GetJSONFromUserDateTime(currentDateTime);
DateTime getDateTime = GetUserDateTimeFromJSON(jsonDateTime);

Aquí están ambos métodos:

/// 
/// Convert UserDateTime(9/7/2018 8:37:20 AM) to JSON datetime(1536309440373) format
/// 
/// 
/// 
public static string GetJSONFromUserDateTime(DateTime givenDateTime)

    string jsonDateTime = string.Empty;
    if (givenDateTime != null)
    
        JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
        
            DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
        ;
        jsonDateTime = JsonConvert.SerializeObject(givenDateTime, microsoftDateFormatSettings);
        jsonDateTime = jsonDateTime.Replace(""\/Date(", "").Replace(")\/"", "");
    
    return jsonDateTime;


/// 
/// Convert JSON datetime(1536309440373) to user datetime(9/7/2018 8:37:20 AM)
/// 
/// 
/// 
public static dynamic GetUserDateTimeFromJSON(string jsonDateTime)

    dynamic userDateTime = null;
    if (!string.IsNullOrEmpty(jsonDateTime))
    
        JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
        
            DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
        ;
        userDateTime = JsonConvert.DeserializeObject(""\/Date(" + jsonDateTime + ")\/"", microsoftDateFormatSettings);
    
    return userDateTime;

Si tienes alguna cuestión o disposición de enriquecer nuestro artículo puedes ejecutar una interpretación y con placer lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *