繁体   English   中英

如何使用 Npgsql 从 Postgresql 检索 UTC 日期时间

[英]How can you retrieve a UTC DateTime from Postgresql using Npgsql

我正在使用“带时区的时间戳”列类型并将我的日期时间设置为:

INSERT INTO mytable(col1)
VALUES(timestamp with time zone '2020-07-16 17:45:00.000000+00');

每当我尝试检索我的 DateTimes 时,它们都会被转换为“本地”类型。

这不是我想要的,它设置为 UTC 日期时间,我希望它作为 UTC 返回,我不希望它转换为本地进入数据库,也不返回......这样做使得无法到达 UTC不会造成歧义。

我试过设置“PGTZ”环境变量; 连接打开时,我还执行了以下sql:

Connection.ExecuteAsync( "SET TIMEZONE TO 'UTC'" );

我试过的任何东西似乎都不起作用,根据各种帖子,它似乎是设计的: https : //github.com/npgsql/npgsql/issues/347

这对我来说似乎完全错误,但我希望有人能指出我的解决方法。

我正在使用 .net5/asp.net 和 Dapper(不是 EFCore)和 Npgsql 4.1.5 版。

Postgresql timestamptz实际上并不存储时区,它只是存储 UTC 时的值。 这意味着'2020-07-16 17:45:00.000000+00'不会在输入时转换为 UTC。 如果没有指定时区,它将从TimeZone设置轮换到UTC 在检索时,它会使用TimeZone设置旋转回该时区。 我怀疑您的设置没有发生在时间戳检索发生的同一会话中。 我会尝试类似SELECT timestamp_fld AT TIME ZONE 'UTC'

这确实是设计使然,并且在常规文本查询中查询 timestamptz 值时与 PostgreSQL 匹配。 如果您使用启动 psql 或 pgadmin 并选择一个时间戳列,您将看到基于您的TimeZone会话参数的本地时间戳。

正如@adrian-klaver 所提到的,timestamptz 并不是将时区存储在数据库中——而是在基于TimeZone参数将时间戳值读取和写入数据库时​​应用时区转换。 如果您不想要任何此类转换,请考虑切换到时间戳(不带时区),并按照约定将所有时间戳设为 UTC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM