一尘不染

将UTC DateTime传递到Web API HttpGet方法将导致本地时间

json

我正在尝试将UTC日期作为查询字符串参数传递给Web API方法。网址看起来像

/api/order?endDate=2014-04-01T00:00:00Z&zoneId=4

该方法的签名看起来像

[HttpGet]
public object Index(int zoneId, DateTime? endDate = null)

日期是,31/03/2014 8:00:00 PM但我希望日期是01/04/2014 12:00:00 AM

JsonFormatter.SerializerSettings看起来像这样

new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    DateFormatHandling = DateFormatHandling.IsoDateFormat
};

编辑#1:我注意到我发布时2014-04-01T00:00:00Z,它将序列化为C#中的UTC
DateTime类型。但是endDate.Value.ToUniversalTime(),尽管我发现它对POST(而不是GET)的工作方式很奇怪,但是我发现可以进行转换。


阅读 234

收藏
2020-07-27

共1个答案

一尘不染

您要发送的查询字符串参数值2014-04-01T00:00:00Z是UTC时间。因此,相同的内容将根据您的本地时钟转换为时间,如果您调用ToUniversalTime(),它将转换回UTC。

那么,到底是什么问题?如果问题是如果作为查询字符串发送而不是在请求正文中发送时为什么会发生这种情况,那么该问题的答案是ASP.NET Web API使用
模型绑定 将URI路径,查询字符串等 绑定 ,而主体使用 参数绑定
。对于后者,它使用媒体格式化程序。如果发送JSON,则使用JSON媒体格式化程序,它基于JSON.NET。

由于您已指定DateTimeZoneHandling.Utc,因此它将使用该设置,并获得所需的日期时间类型。顺便说一句,如果将此设置更改为DateTimeZoneHandling.Local,那么您将看到与模型绑定相同的行为。

2020-07-27