C# 如何使用Npgsql从Postgresql检索UTC日期时间
我使用“timestamp with time zone”列类型,并将日期时间设置为:C# 如何使用Npgsql从Postgresql检索UTC日期时间,c#,postgresql,datetime,npgsql,C#,Postgresql,Datetime,Npgsql,我使用“timestamp with time zone”列类型,并将日期时间设置为: INSERT INTO mytable(col1) VALUES(timestamp with time zone '2020-07-16 17:45:00.000000+00'); 每当我尝试检索日期时间时,它们都会被转换为“本地”类型 这不是我想要的,它设置为UTC日期时间,我希望它返回为UTC,我不希望它转换为本地数据进入数据库,也不希望它返回。。。这样做就不可能在不引起歧义的情况下到达UTC 我已尝
INSERT INTO mytable(col1)
VALUES(timestamp with time zone '2020-07-16 17:45:00.000000+00');
每当我尝试检索日期时间时,它们都会被转换为“本地”类型
这不是我想要的,它设置为UTC日期时间,我希望它返回为UTC,我不希望它转换为本地数据进入数据库,也不希望它返回。。。这样做就不可能在不引起歧义的情况下到达UTC
我已尝试设置“PGTZ”环境变量;当连接打开时,我还执行了以下sql:
Connection.ExecuteAsync( "SET TIMEZONE TO 'UTC'" );
我尝试过的任何东西似乎都不起作用,而且似乎是根据各种帖子设计的,比如:
这对我来说似乎是完全错误的,但我希望有人能为我指出解决这个问题的方法
我使用的是.net5/asp.net和Dapper(不是EFCore)以及Npgsql版本4.1.5。Postgresql
timestamptz
实际上并不存储时区,它只存储UTC时的值。这意味着'2020-07-16 17:45:00.000000+00'
在输入时不会转换为UTC。如果没有指定的时区,它将从时区设置旋转到UTC
。在检索时,虽然它将使用时区
设置旋转回该时区。我怀疑您的设置不是在进行时间戳检索的同一会话中进行的。我会尝试类似于时区“UTC”的SELECT timestamp\u fld
Postgresqltimestamp TZ
实际上并不存储时区,它只存储UTC时的值。这意味着'2020-07-16 17:45:00.000000+00'
在输入时不会转换为UTC。如果没有指定的时区,它将从时区设置旋转到UTC
。在检索时,虽然它将使用时区
设置旋转回该时区。我怀疑您的设置不是在进行时间戳检索的同一会话中进行的。我会尝试类似于时区“UTC”的SELECT timestamp\u fld
这确实是经过设计的,并且在常规文本查询中查询timestamptz值时匹配PostgreSQL。如果使用fire up psql或pgadmin并选择timestamptz列,您将看到基于时区的本地时间戳
正如@adrian klaver所提到的,timestamptz不是关于在数据库中存储时区的,而是关于在基于timezone
参数向数据库读取和写入时间戳值时应用时区转换。如果您不希望有任何这样的转换,考虑切换到时间戳(没有时区),并按惯例将所有时间戳作为UTC。 < P>这是设计中的,并且在查询常规文本查询中的TimeStPtz值时,匹配PostgreSQL。如果使用fire up psql或pgadmin并选择timestamptz列,您将看到基于时区的本地时间戳
正如@adrian klaver所提到的,timestamptz不是关于在数据库中存储时区的,而是关于在基于timezone
参数向数据库读取和写入时间戳值时应用时区转换。如果你不想要任何这样的转换,考虑切换到时间戳(没有时区),并按惯例将所有时间戳作为UTC。谢谢@ Shay,我读到,如果你想存储UTC值,你应该使用<代码>时间戳和时区< /代码>,但是我没有考虑到,因为我通过代码控制事物,那么在设置值之前,我可以确保它的UTC。我必须说,在所有dbs中,postgres在这方面似乎过于复杂,容易出错,因此感谢您的澄清。我同意PG有点混乱(尽管FWIW似乎只是非常严格地遵循SQL标准)。您可能希望阅读带有或不带时区的时间戳;我真的推荐使用“UTC按惯例”谢谢@ Shay,我读到,如果你想存储UTC值,你应该使用<代码>时间戳带时区< /代码>,但是我没有考虑到我通过代码控制事情,那么我可以在设置值之前确保它的UTC。我必须说,在所有dbs中,postgres在这方面似乎过于复杂,容易出错,因此感谢您的澄清。我同意PG有点混乱(尽管FWIW似乎只是非常严格地遵循SQL标准)。您可能希望阅读带有或不带时区的时间戳;我真的建议您选择“UTC按惯例”