Skip to content

前端传输时间类型数据处理

前端传输数据过来,如果时间类型的数据为空或者为null ,那就自动将时间转变换成当前的时间,如果时间类型不正确,那就自动转换时间类型

JsonStringDateTimeConverter

C

/// <summary>
/// 时间转换器:将 JSON 中的时间字符串解析为 DateTime,并格式化为 yyyy-MM-dd HH:mm:ss 输出。
/// 若值为 null 或空字符串,则自动赋值为当前 UTC 时间。
/// </summary>
public class JsonStringDateTimeConverter  : JsonConverter<DateTime>
{
    private readonly string _format = "yyyy-MM-dd HH:mm:ss";

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 1. 处理 JSON null 值
        if (reader.TokenType == JsonTokenType.Null)
            return DateTime.UtcNow;

        // 2. 获取字符串值
        var str = reader.GetString();
        if (string.IsNullOrEmpty(str))
            return DateTime.UtcNow;

        // 3. 按指定格式解析
        if (DateTime.TryParseExact(str, _format, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt))
            return dt;

        // 4. 如果格式不匹配,尝试宽松解析(兼容 ISO 8601 等)
        if (DateTime.TryParse(str, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
            return dt;

        // 5. 如果完全无法解析,抛出明确异常(或可返回默认值)
        throw new JsonException($"无法解析日期时间字符串: '{str}',期望格式: {_format}");
    }

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

Program.cs

C

#region 时间配置
// 全局配置方式 
builder.Services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new JsonStringDateTimeConverter());
     });
#endregion