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

从PostgreSQL用C#获取UTC日期时自动加时的原因排查

问题分析与解决

核心问题根源

你PostgreSQL里存的"2023-01-30 17:54:15.13-06"是UTC-6时区的本地时间,转换成UTC时间就是17:54:15加上6小时,正好是23:54:15——这就是C#里DateCreatedUtc显示的数值。原因是你的数据库字段应该是timestamptz(带时区类型),PostgreSQL驱动自动把带时区的存储时间转成了UTC时间返回给C#,而你误以为数据库存的是UTC时间。

具体解决办法

1. 核对数据库字段类型

  • 要是想存纯UTC时间,把字段改成timestamp(不带时区),存入时直接写UTC时间,别带偏移量。
  • 如果用timestamptz,数据库会自动把存储的时间转成UTC存储,读取时C#驱动默认返回UTC的DateTime(Kind属性为Utc)。

2. 调整实体映射类型

如果需要保留原始的时区偏移信息,别用DateTime映射字段,改用DateTimeOffset。这样C#里拿到的会是包含17:54:15 -06:00的完整时间对象,后续可以按需转成UTC或服务器本地时区。

3. 修改转换代码(以DateTimeOffset为例)

换成DateTimeOffset后,转服务器时区的代码可以这么写:

var assignmentDate = selectedAttempt?.DateCreatedUtc ?? DateTimeOffset.MinValue;
var dateInServerTimezone = assignmentDate.ToLocalTime().ToString(dateFormat, CultureInfo.InvariantCulture);

要是需要先转UTC再转本地:

var utcDate = assignmentDate.UtcDateTime;
var dateInServerTimezone = TimeZoneInfo.ConvertTimeFromUtc(utcDate, TimeZoneInfo.Local).ToString(dateFormat, CultureInfo.InvariantCulture);

4. 检查写入逻辑

确保往数据库写数据时,要么直接写UTC时间(对应timestamp字段),要么明确指定时区偏移(对应timestamptz字段),避免驱动自动转换导致时间偏差。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:05:15