En passant UTC DateTime à l'API Web HttpGet résultats de la Méthode de l'heure locale
Je suis en train de passer d'une date UTC comme un paramètre de chaîne de requête à l'API Web de méthode. L'URL ressemble à
/api/order?endDate=2014-04-01T00:00:00Z&zoneId=4
La signature de la méthode ressemble à
[HttpGet]
public object Index(int zoneId, DateTime? endDate = null)
La date est de venir en 31/03/2014 8:00:00 PM
mais j'aimerais qu'il vienne en tant que 01/04/2014 12:00:00 AM
Mon JsonFormatter.SerializerSettings
ressemble à ceci
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
DateFormatHandling = DateFormatHandling.IsoDateFormat
};
EDIT #1:
J'ai remarqué que quand je POSTE 2014-04-01T00:00:00Z
il va sérialiser à l'UTC DateTime genre en C#. Cependant, j'ai trouvé un travail autour de faire endDate.Value.ToUniversalTime()
à le convertir, bien que je trouve bizarre la façon dont il fonctionne pour un POSTE, mais pas un GET.
- Remarque: la sérialisation JSON paramètres ne sont pas pertinents pour les paramètres liés à partir de l'URI.
Vous devez vous connecter pour publier un commentaire.
La requête de la chaîne de valeur de paramètre que vous envoyez
2014-04-01T00:00:00Z
est l'heure UTC. Donc, la même chose se traduit à la fois en fonction de votre horloge locale et si vous appelezToUniversalTime()
, il est converti en arrière à l'UTC.Alors, quelle est exactement la question? Si la question est: pourquoi est-ce qui se passe si envoyées sous forme de chaîne de requête, mais pas quand il est affiché dans le corps de la requête, la réponse à cette question est qu'ASP.NET l'API Web lie le chemin de l'URI, de chaîne de requête, etc. en utilisant modèle de liaison et le corps à l'aide de liaison de paramètre. Pour ce dernier, il utilise un support de formateur. Si vous envoyez JSON, JSON médias formateur est utilisé et il est basé sur JSON.NET.
Depuis que vous avez spécifié
DateTimeZoneHandling.Utc
, elle utilise ce paramètre et vous obtenez la date de fois que vous le souhaitez. BTW, si vous modifiez ce paramètre pourDateTimeZoneHandling.Local
, puis vous verrez le même comportement que la liaison de modèle.Si vous voulez que la conversion soit transparent, vous pouvez utiliser un custom
TypeConverter
:et d'un grillage à l'aide de:
Ensuite le paramètre de chaîne de requête sera instancié comme
DateTimeKind.Utc
.J'ai fini juste à l'aide de la
ToUniversalTime()
méthode en tant que paramètres venir.