You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:47:48