Zoi*_*nks 17 c# format datetime asp.net-web-api
所以我有一个用C#编写的WebAPI 2控制器,它带有一个DateTime类型的查询参数.这是一个API,它根据日期过滤器返回数据存储中的所有值.比如,让我们说:
public MyThing GetThing([FromUri]DateTime startTime)
{
// filter and return some results
}
Run Code Online (Sandbox Code Playgroud)
我遇到了两个问题:
简而言之,我想弄清楚如何确保这一点
WebAPI 2提供了很好的格式化JSON的钩子,我确实使用了它,因此只需在JSON体中返回一个DateTime,就可以根据需要使用ISO8601格式进行格式化,并且在[FromBody] JSON体中正确理解它.我找不到绕URI处理的方法,我真的很想!
小智 6
您可以使用modelbinder将传入数据转换为模型.
GetThings([ModelBinder(typeof(UtcDateTimeModelBinder)), FromUri] DateTime dt){//do somthing}
public class UtcDateTimeModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
if (bindingContext.ModelMetadata.ModelType == typeof(DateTime))
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var str = valueProviderResult.AttemptedValue;
return DateTime.Parse(str).ToUniversalTime();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
以这种方式,您可以将其设置为DateTime的默认模型.
ModelBinders.Binders.Add(typeof(DateTime), new UtcDateTimeModelBinder());
Run Code Online (Sandbox Code Playgroud)
Why not using DateTimeOffset instead of DateTime if you want to keep UTC offset? Here are some code working with JSON serialization:
Api Controller:
public class ValuesController : ApiController
{
public object Get(DateTimeOffset dt)
{
return new {
Input = dt,
Local = dt.LocalDateTime,
Utc = dt.UtcDateTime
};
}
}
Run Code Online (Sandbox Code Playgroud)
Razor View sample code (assuming you have the default api route created in a MVC + Web API Visual studio template )
<a href="@Url.RouteUrl("DefaultApi",new {httproute = "",controller = "values",dt = DateTimeOffset.UtcNow})">Utc Now</a>
Run Code Online (Sandbox Code Playgroud)
Rendered as:
<a href="/api/values?dt=06%2F26%2F2018%2009%3A37%3A24%20%2B00%3A00">Utc Now</a>
Run Code Online (Sandbox Code Playgroud)
And you can call your API with datetime offset:
2018-06-26T08:25:48Z: http://localhost:1353/api/values?dt=2018-06-26T08:25:48Z
{"Input":"2018-06-26T08:25:48+00:00","Local":"2018-06-26T10:25:48+02:00","Utc":"2018-06-26T08:25:48Z"}
2018-06-26T08:25:48+01:00: http://localhost:1353/api/values?dt=2018-06-26T08%3A25%3A48%2B01%3A00 (note that : and + must be url encoded)
{"Input":"2018-06-26T08:25:48+01:00","Local":"2018-06-26T09:25:48+02:00","Utc":"2018-06-26T07:25:48Z"}
Run Code Online (Sandbox Code Playgroud)
小智 1
1.
您应该检查参数“startTime”的时区(应该是您的服务器/计算机的时区)。
Web API 提供的 DateTime 是正确的,它仅取决于您的时区。
2.
创建 Json DateTime 序列化器以生成 ISO8601 格式的日期。
| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |