Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

663
Vistas
CosmosDB: problema de DateTimeOffset con consultas UTC

Hay problemas para trabajar con DateTimeOffset en CosmosDb. Refiriéndose a la guía de trabajo con ellos en Microsoft Docs , dice...

Para convertir un DateTime local a UTC, el desplazamiento debe conocerse/almacenarse como una propiedad en el JSON y el cliente puede utilizar el desplazamiento para calcular el valor de UTC DateTime.

Así que estoy almacenando mis fechas en mis documentos con el formato "2021-04-23T12:15:00+01:00" . Esto funciona muy bien al consultar y mostrar a los usuarios localmente. Sin embargo, encuentro problemas al realizar consultas en estos DateTimes...

En mi servidor haré una consulta así...

Consulta Linq

 .Where(x => x.ExpiresAt.UtcDateTime <= DateTime.UtcNow)

Si caduca a las = "2021-04-23T12:15:00+01:00"

Y la hora UTC ahora = "2021-04-23T11:15:00+00:00"

Entonces esperaría que la consulta devuelva un artículo. Sin embargo, no se devuelven elementos hasta una hora después, casi como si la extensión .UtcDateTime no funcionara. Si ese es el caso, ¿cómo se comparan DateTimeOffsets como este? Los documentos de Microsoft hacen que parezca que necesita otro campo solo para almacenar el desplazamiento y no puede usarlo en línea con la fecha y hora en sí. Me gusta...

 { "expiresAt":"2021-04-23T11:15:00", "expiresAtOffset":"1" }

Seguramente lo estoy malinterpretando, ¿verdad?

Nota: He intentado usar una consulta SQL en lugar de linq así...

 "SELECT * FROM c WHERE c.expiresAt <= \"2021-04-23T11:58:05\""

Pero sigue siendo el mismo problema, porque el problema es que el valor del cosmos es el que necesita convertir y ver los documentos , no hay forma de convertir el valor del cosmos en un tiempo UTC ...

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Otra pregunta sobre StackOverflow sugirió almacenarlo con la abreviatura Z. Lo intenté y parece estar funcionando más o menos como quiero, pero no perfecto. Todas las fechas ahora se almacenan como valores DateTime con una Z añadida. Luego, al usar los DTO de DateTimeOffset, convertirá el valor de manera adecuada en el cliente. Sin embargo, tuve que cambiar la configuración de serialización, así...

 var jsonSerializerSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ" };

Luego agregué que al crear el DocumentClient...

 new DocumentClient(serviceEndpoint, authKey, serializerSettings: jsonSerializerSettings);

El único problema que tengo con esto es que tengo correos electrónicos que deben enviarse desde el servidor con tiempos en ellos. Estas horas son incorrectas porque el servidor no sabe cómo convertirlas a la hora local del cliente.

over 4 years ago · Santiago Trujillo Denunciar

0

En mi experiencia, esta combinación funciona para lograr la felicidad con Cosmos y datetimes en .NET:

  • Modele fechas y horas como valores ISO 8601 como se sugiere en los documentos
  • Use el tipo DateTime .NET, no DateTimeOffset
  • Asegúrese de que las fechas y horas completas estén serializadas en el formato exacto yyyy-MM-ddTHH:mm:ss.fffffffZ
  • Guarde siempre los valores UTC, nunca las horas locales
  • Si el valor representa algo que ocurre en una zona horaria específica, almacene la zona horaria de la IANA junto con el valor. Luego use esto para convertir antes de mostrarlo a los usuarios.
  • Use métodos basados en Stream ( muestra ) en .NET SDK 3 y System.Text.Json para un control directo sobre la serialización y para un valor predeterminado que funcione como se esperaba.
  • Evite LINQ, en su lugar, construya consultas a partir de cadenas usando QueryDefinition
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda