从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
相关产品推荐
相关产品推荐

