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

如何使用数据注解格式化C#中的DateTimeOffset属性?

解决DateTimeOffset在API JSON响应中的格式化问题

针对你需要在保留DateTimeOffset类型用于程序内计算的同时,让API返回指定格式(如2011-01-25T11:53:22.010Z)JSON的需求,可根据你使用的JSON序列化库选择以下方案:

一、使用System.Text.Json(.NET Core 3.0+ 默认序列化库)

通过自定义JsonConverter并配合数据注解[JsonConverter]实现格式控制:

1. 自定义DateTimeOffset转换器

using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;

public class DateTimeOffsetUtcZConverter : JsonConverter<DateTimeOffset>
{
    // 目标格式:包含三位毫秒 + UTC标识Z
    private const string TargetFormat = "yyyy-MM-dd'T'HH:mm:ss.fffZ";

    public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 反序列化时解析目标格式的字符串
        return DateTimeOffset.ParseExact(reader.GetString(), TargetFormat, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
    {
        // 序列化时转为UTC时间并按目标格式输出
        writer.WriteStringValue(value.UtcDateTime.ToString(TargetFormat, CultureInfo.InvariantCulture));
    }
}

2. 在属性上添加数据注解

直接在需要格式化的DateTimeOffset属性上标记转换器:

[JsonConverter(typeof(DateTimeOffsetUtcZConverter))]
public DateTimeOffset Time1 { get; set; }

[JsonConverter(typeof(DateTimeOffsetUtcZConverter))]
public DateTimeOffset Time2 { get; set; }

可选:全局配置(无需逐个属性加注解)

如果所有DateTimeOffset属性都需要统一格式,可在Startup/Program.cs中全局配置:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new DateTimeOffsetUtcZConverter());
    });

二、使用Newtonsoft.Json(Json.NET)

若项目使用Newtonsoft.Json,可结合[JsonConverter]注解和内置转换器实现:

1. 直接使用内置IsoDateTimeConverter

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTimeOffset Time1 { get; set; }

[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTimeOffset Time2 { get; set; }

然后在全局配置中指定格式:

var jsonSettings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter>
    {
        new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.fffZ",
            DateTimeStyles = DateTimeStyles.AdjustToUniversal
        }
    }
};

// ASP.NET中全局配置方式
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.fffZ",
            DateTimeStyles = DateTimeStyles.AdjustToUniversal
        });
    });

以上方案均保留了DateTimeOffset的类型特性,不影响程序内的日期计算逻辑,仅在JSON序列化/反序列化阶段处理格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:57:27