UTC时间与本地时间转换问题

复制代码
using System.Text.Json;
using System.Text.Json.Serialization;

namespace NDTInspHubCore.WebAPI.Converters
{
    /// <summary>
    /// UTC时间到本地时间的转换器
    /// </summary>
    public class UtcToLocalDateTimeConverter : JsonConverter<DateTime>
    {
        /// <summary>
        /// 读取JSON并转换为UTC时间
        /// </summary>
        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            return DateTime.Parse(reader.GetString()!).ToUniversalTime();
        }

        /// <summary>
        /// 将UTC时间转换为本地时间并写入JSON
        /// </summary>
        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
        }
    }

    /// <summary>
    /// UTC时间到本地时间的转换器(可空)
    /// </summary>
    public class UtcToLocalNullableDateTimeConverter : JsonConverter<DateTime?>
    {
        /// <summary>
        /// 读取可空JSON并转换为UTC时间
        /// </summary>
        public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.Null)
            {
                return null;
            }
            return DateTime.Parse(reader.GetString()!).ToUniversalTime();
        }

        /// <summary>
        /// 将可空UTC时间转换为本地时间并写入JSON
        /// </summary>
        public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
        {
            if (value.HasValue)
            {
                writer.WriteStringValue(value.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
            }
            else
            {
                writer.WriteNullValue();
            }
        }
    }
}

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

export const formatUTCTime = (time) => {
  return dayjs.utc(time).local().format('YYYY-MM-DD HH:mm:ss')
}

export const formatLocalTime = (time) => {
  return dayjs(time).format('YYYY-MM-DD HH:mm:ss')
}

export const convertLocalToUTC = (time) => {
  return dayjs(time).utc().format('YYYY-MM-DD HH:mm:ss')
}

program.cs

复制代码
                .AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.WriteIndented = false;
                    options.JsonSerializerOptions.Converters.Add(new UtcToLocalDateTimeConverter());
                    options.JsonSerializerOptions.Converters.Add(new UtcToLocalNullableDateTimeConverter());
                });

    /// <summary>
    /// 配置映射关系
    /// </summary>
    public class AutoMapperConfig : Profile
    {
        /// <summary>
        /// 配置映射关系
        /// </summary>
        public AutoMapperConfig()
        {
            // 全局时间转换:UTC到本地时间
            CreateMap<DateTime, DateTime>().ConvertUsing(d => d.ToLocalTime());
            CreateMap<DateTime?, DateTime?>().ConvertUsing(d => d.HasValue ? d.Value.ToLocalTime() : (DateTime?)null);
            
        }
    }

API 返回序列化 json 时处理,在.NET Core的JSON全局转换中,系统识别UTC时间的关键在于DateTime结构的Kind属性及数据传输的隐式约定

优化方案:显式时区处理

方案一:数据库层标注时区(推荐)
相关推荐
不会敲代码13 小时前
手写 Mini React:从 JSX 到虚拟 DOM 再到 render,搞懂 React 底层原理
前端·javascript·react.js
你不是我我4 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
雪碧聊技术4 小时前
大模型爆火!Java后端如何抓住Agent全栈开发的风口
java·大模型·agent·全栈开发
milo.qu4 小时前
RockyLinux9.7 docker部署Jisti Meet
linux·docker·容器
kyriewen4 小时前
你的代码仓库变成“毛线团”了?Monorepo 用 Turborepo 拆成“乐高积木”
前端·javascript·面试
GanGanGanGan_4 小时前
CentOS 7.9 glibc 2.17 源码编译升级到 glibc 2.31
linux·运维·centos·glibc
身如柳絮随风扬4 小时前
你知道什么是 Ajax 吗?—— 从入门到原理,一篇彻底搞懂
前端·ajax·okhttp
charlie1145141914 小时前
嵌入式Linux驱动开发——class 和 device 模型 - 自动创建设备节点的幕后机制
linux·运维·驱动开发
旷世奇才李先生5 小时前
Vue3\+TypeScript 2026实战——企业级前端项目架构搭建与性能优化全指南
前端·架构·typescript
Beginner x_u5 小时前
前端八股整理(工程化 02)|CommonJS/ESM、Webpack Loader/Plugin 与Vite 对比
前端·webpack·node.js·plugin·loader