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

如何使用Refit序列化DateOnly?日期范围筛选选DateOnly还是DateTime?

日期范围筛选:DateOnly vs DateTime选择及序列化问题解决

一、DateOnly是无时间日期筛选的最优选择

DateOnly完全适配无需处理时间的日期场景,比DateTime更合适:

  • 语义明确:专门为仅日期场景设计,代码可读性更高,不会让其他开发者困惑是否需要处理时间部分。
  • 避免边界错误:DateTime默认带00:00:00时间戳,用它做结束日期筛选时,容易漏掉当天非凌晨的数据;DateOnly则直接代表完整的一天,不会出现这类歧义。

二、解决DateOnly的序列化问题(适配System.Text.Json与Refit)

1. 为System.Text.Json添加DateOnly自定义转换器

由于默认的System.Text.Json不支持DateOnly序列化,需要实现自定义转换器:

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string DefaultDateFormat = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateOnly.ParseExact(reader.GetString()!, DefaultDateFormat);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(DefaultDateFormat));
    }
}

注册转换器到Json序列化配置:

var jsonOptions = new JsonSerializerOptions();
jsonOptions.Converters.Add(new DateOnlyJsonConverter());

2. 在Refit中配置自定义序列化选项

将上面的Json配置传入Refit的设置,让Refit使用带DateOnly支持的序列化器:

var refitSettings = new RefitSettings
{
    ContentSerializer = new SystemTextJsonContentSerializer(jsonOptions)
};

// 初始化Refit API客户端
var apiClient = RestService.For<IMyApiInterface>("https://your-api-base-url", refitSettings);

内容的提问来源于stack exchange,提问作者Rupesh Plant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:45:47