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

如何在Jil Options中指定含固定三位毫秒的DateTime序列化格式?

Jil序列化DateTime强制保留三位毫秒的解决方案

问题场景

API要求序列化DateTime时必须保留完整三位毫秒(即使末尾为零)。例如:

  • 原时间戳2022-04-29 15:19:41.300,预期序列化结果为2022-04-29T22:19:41.300Z
  • 使用Newtonsoft通过自定义IsoDateTimeConverter已解决该问题,但切换到Jil处理大对象序列化时,Jil会自动截断毫秒末尾的零,输出2022-04-29T22:19:41.3Z,不符合要求。

已实现的Newtonsoft修复代码

public static void ServiceJsonSettings(HttpConfiguration config, IServiceMetadata serviceMetadata)
{
    config.Formatters.Insert(0, new JsonNewtonsoftJilFallbackFormatter());
    IsoDateTimeConverter dateConverter = new IsoDateTimeConverter
    {
        DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'",
        DateTimeStyles = DateTimeStyles.AdjustToUniversal
    };
    config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(dateConverter);
}

当前Jil序列化配置

public static readonly Options JilOptions = new Options(excludeNulls: true, includeInherited: true,
            serializationNameFormat: SerializationNameFormat.CamelCase, dateFormat: DateTimeFormat.ISO8601);

核心疑问

是否可以在Jil的Options中直接指定自定义日期格式"yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z"?

解决方案

Jil的Options类不支持直接传入自定义日期格式字符串,其dateFormat参数仅接受内置的DateTimeFormat枚举值。要实现强制保留三位毫秒的需求,可通过以下两种方式:

方案1:全局注册自定义日期格式化器

实现IFormatter<DateTime>接口替换默认序列化逻辑,确保输出固定三位毫秒:

public class FixedMillisecondDateTimeFormatter : IFormatter<DateTime>
{
    public void Serialize(DateTime value, TextWriter writer, Options options)
    {
        var utcValue = value.ToUniversalTime();
        writer.Write($"\"{utcValue:yyyy-MM-dd'T'HH:mm:ss.fffZ}\"");
    }

    public DateTime Deserialize(TextReader reader, Options options)
    {
        var dateStr = reader.ReadToEnd().Trim('"');
        return DateTime.Parse(dateStr, options.Culture, DateTimeStyles.AdjustToUniversal);
    }
}

注册到Jil配置中:

public static readonly Options JilOptions = new Options(
    excludeNulls: true, 
    includeInherited: true,
    serializationNameFormat: SerializationNameFormat.CamelCase,
    dateFormat: DateTimeFormat.ISO8601)
    .RegisterFormatter(new FixedMillisecondDateTimeFormatter());

方案2:局部字段自定义序列化

如果仅需针对特定字段处理,可在序列化时手动格式化DateTime值:

var targetObj = new 
{
    EventTime = yourDateTime.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.fffZ"),
    // 其他字段...
};
var json = JSON.Serialize(targetObj, JilOptions);

内容的提问来源于stack exchange,提问作者Shani Bhati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:41:00