关于时区的那些事
C#中的时区
先来看两种图:


可以看出时区utcnow显示的utc时间,而now显示的就是本地时间,而跨国的项目中为了保证时间的一致性,统一采用的utc时间,然后前台转换为本地时间进行显示。

postgresql数据库
postgresql数据库支持时区格式存储,如

这是因为 PostgreSQL 在将时间戳类型的值从客户端转换为服务器内部的格式时,会自动将其转换为postgresql中设置的时区,从而保持时间的一致性。

如果你配置文件是其他时区的设置,比如GMT (格林尼治标准时间) :UTC+0时区,那么数据库中存储的就是+0数据。
1 | 2023-01-10 03:15:57+00 |
如果你希望插入一个特定时区的时间戳,可以通过在 timestamp with time zone 值后面添加时区偏移量的方式来表示。例如:
1 | INSERT INTO mytable (mytimestamp) VALUES ('2023-05-22 00:12:22.238828+00'); |
这个例子插入的时间戳时区偏移量是 +08 和 +03,表示东八区时间和东三区。在这种情况下,插入的值会被转换为postgresql配置文件中设置的时区的utc时间,并存储到 mytable 表中(在数据库中存储的时间戳总是以 UTC 时间格式存储)。
时区查询

注意,在 PostgreSQL 中,当你查询一个 timestamp with time zone 类型的字段时,它会根据客户端设置的时区自动转换为本地时间。如果你想以其他时区的形式查询,可以使用 AT TIME ZONE 关键字来指定时区,例如:
1 | SELECT mytimestamp AT TIME ZONE 'UTC' FROM mytable; |
这个例子以 UTC 时区的形式查询 mytable 表中的 mytimestamp 字段。你可以将 UTC 替换为其他时区来查询该时区下的时间。
当你设置了其他时区,查出来的结果就是那个时区的时间,很智能。
但是你插入时间的值时,还是按照你数据库配置文件的时区的,不会因为set time zone而改变。 如果你的数据库配置文件中的时区是东八区,那么即使你执行了 set time zone “Africa/Bujumbura”;,在你插入 TIMESTAMP WITH TIME ZONE 类型的数据时,也会自动将其转换为东八区的时间,并存储在数据库中。
tips: 修改了配置文件一定要重启数据库,否则还是原来的时区显示和插入。





