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

WebAPI中DateTimeOffset解析异常:DateTime传输后被重置1小时

解决Web API接收DateTimeOffset时偏移被重置的问题

这个问题其实挺常见的——看起来你的API在序列化/反序列化过程中默认把DateTimeOffset转成UTC了,但你想要保留原始的时区偏移信息对吧?咱们一步步来解决:

1. 检查并修改API的JSON序列化配置

不同的ASP.NET版本用的序列化库不同,对应配置方式也不一样:

针对ASP.NET Framework(默认用Json.NET)

打开项目里的App_Start/WebApiConfig.cs,在注册配置的地方添加序列化设置,强制保留时区偏移:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 其他配置...
        
        // 关键设置:保留DateTimeOffset的原始时区偏移
        config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundTripKind;
    }
}

针对ASP.NET Core(默认用System.Text.Json)

在Program.cs(或旧版的Startup.cs)的服务注册环节,配置Json选项:

var builder = WebApplication.CreateBuilder(args);

// 注册控制器并配置Json序列化
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 保留DateTimeOffset的原始偏移信息
        options.JsonSerializerOptions.DateTimeOffsetHandling = JsonDateTimeOffsetHandling.RoundtripKind;
    });

var app = builder.Build();
// 其他中间件配置...

2. 确保实体类字段类型为DateTimeOffset

确认你的Person类中Birthday字段的类型是DateTimeOffset,而不是DateTime——如果是DateTime类型,反序列化时会自动转换为UTC或本地时间,导致偏移丢失:

public class Person
{
    // 必须是DateTimeOffset类型,才能完整保留时区偏移
    public DateTimeOffset Birthday { get; set; }
}

3. 数据库存储也要适配时区偏移

如果是把数据存入数据库,要确保对应的字段类型支持存储时区信息:

  • 比如SQL Server要用datetimeoffset类型,而不是datetime或datetime2,否则存入时会自动转成UTC并丢失原始偏移。

补充说明:为什么会出现这个转换?

你发送的2000-01-26T00:00:00+01:00和API收到的2000-01-25T23:00:00+00:00其实是同一个时间瞬间,只是用不同的时区表示而已。默认情况下,很多JSON序列化库会把带偏移的时间转成UTC存储,但如果你需要保留用户提交的原始时区偏移,上面的配置就能帮你实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:31:08