我正在构建一个ASP.NET Core Web API,我最近发现了一个关于DateTime值绑定的问题。
实际上,我有一个minimumDate
和一个maximumDate
属性可以在某个资源中进行过滤。它们是一个Filtering
对象的一部分,它只是通过模型绑定在控制器上填充。
问题是请求是这样发送的:
minimumDate=2014-01-20T00:00:00.000Z&maximumDate=2014-03-21T00:00:00.000Z
并在控制器上进行调试时获取:
MinimumDate = 19/01/2014 22:00:00
MaximumDate = 20/03/2014 21:00:00
这显然是错误的。预期是:
MinimumDate = 20/01/2014 00:00:00
MaximumDate = 21/03/2014 00:00:00
它在最短和最大日期都减少了一天,而且它正在弄乱时间部分。
我一开始认为它与文化和全球化有关,但这已经在启动配置方法中设置为:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-BR");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("pt-BR");
所以我怀疑这是原因。
我做错了什么?如何通过模型绑定正确地将日期发送到API?
编辑我设法通过以下方式手动解析日期时间对象来解决问题:
filtering.MinimumDate = DateTime.Parse(this.Request.Query["minimumDate"], null, System.Globalization.DateTimeStyles.RoundtripKind);
filtering.MaximumDate = DateTime.Parse(this.Request.Query["maximumDate"], null, System.Globalization.DateTimeStyles.RoundtripKind);
换句话说,绕过模型绑定器。不过,我想知道:为什么模型绑定会在这里出现这种奇怪的行为?
答案 0 :(得分:3)
对我而言,在幕后使用Json.net的模型绑定器将您的UTC时间转换为BRT(UTC-3)的本地时间,这就是您看到日期和时间更改的原因。您应该能够将JsonSerializerSettings属性更新为:
new JsonSerializerSettings
{
.....
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
.....
}
在你的情况下应该注意正确的模型绑定。