ASP.NET Core/C#中如何在Swagger接收dd-MM-yyyy格式的DateTime?
实现ASP.NET Core接口接收自定义格式的DateTime(dd-MM-yyyy)
方法一:直接接收字符串并手动解析
这是最直接的方式,先将路由参数接收为字符串,再手动解析成DateTime类型,同时做格式校验:
using System.Globalization; [HttpGet("{date}")] public ActionResult<int> ToMarsDate(string date) { if (!DateTime.TryParseExact(date, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate)) { return BadRequest("日期格式错误,请使用 dd-MM-yyyy 格式(如 10-06-2023)"); } // 这里使用 parsedDate 执行火星日期转换逻辑 return Ok(/* 转换结果 */); }
方法二:全局自定义模型绑定器
如果多个接口都需要接收dd-MM-yyyy格式的日期,可以全局注册自定义模型绑定器,让框架自动解析:
1. 创建自定义模型绑定器
using System.Globalization; using Microsoft.AspNetCore.Mvc.ModelBinding; public class DdMmYyyyDateTimeBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueResult == ValueProviderResult.None) return Task.CompletedTask; bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueResult); var dateStr = valueResult.FirstValue; if (!DateTime.TryParseExact(dateStr, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date)) { bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "日期格式错误,请使用 dd-MM-yyyy 格式"); return Task.CompletedTask; } bindingContext.Result = ModelBindingResult.Success(date); return Task.CompletedTask; } }
2. 创建绑定器提供者
using Microsoft.AspNetCore.Mvc.ModelBinding; public class DdMmYyyyDateTimeBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); if (context.Metadata.ModelType == typeof(DateTime)) return new DdMmYyyyDateTimeBinder(); return null; } }
3. 注册到全局服务
在Program.cs中添加绑定器注册:
builder.Services.AddControllers(options => { // 插入到绑定器列表的最前面,优先使用自定义绑定器 options.ModelBinderProviders.Insert(0, new DdMmYyyyDateTimeBinderProvider()); });
之后你的原接口代码可以直接保留DateTime参数,框架会自动按dd-MM-yyyy格式解析:
[HttpGet("{date}")] public ActionResult<int> ToMarsDate(DateTime date) { // date 已自动解析为正确格式的 DateTime 对象 return Ok(/* 转换结果 */); }
方法三:局部自定义绑定属性
如果只想让特定接口或参数使用该格式,可以创建自定义绑定属性,按需标记:
1. 创建自定义绑定属性
using Microsoft.AspNetCore.Mvc; public class DdMmYyyyDateTimeAttribute : ModelBinderAttribute { public DdMmYyyyDateTimeAttribute() { BinderType = typeof(DdMmYyyyDateTimeBinder); } }
2. 在参数上标记属性
[HttpGet("{date}")] public ActionResult<int> ToMarsDate([DdMmYyyyDateTime] DateTime date) { // date 已按指定格式解析 return Ok(/* 转换结果 */); }
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

