TIMESTAMP WITHOUT TIME ZONE存储当地的 date-time (aka。挂历日期和挂钟时间)。就PostgreSQL所知,它的时区是未指定的(尽管你的应用程序可能知道它是什么)。因此,PostgreSQL在输入或输出时不进行与时区相关的转换。如果该值被作为'2011-07-01 06:30:30'输入到数据库中,那么无论您稍后在哪个时区显示它,它仍然会显示2011年,07月,01日,06小时,30分钟和30秒(以某种格式)。此外,你在输入中指定的任何偏移量或时区都会被PostgreSQL忽略,因此'2011-07-01 06:30:30+00'和'2011-07-01 06:30:30+05'与'2011-07-01 06:30:30'相同。
对于Java开发人员:它类似于java.time.LocalDateTime.
TIMESTAMP WITH TIME ZONE存储UTC时间线上的一个点。它看起来如何(多少小时,多少分钟,等等)取决于你所在的时区,但它总是指相同的“物理”瞬间(比如一个实际物理事件的时刻)。的
输入在内部转换为UTC,这就是它的存储方式。为此,输入的偏移量必须是已知的,因此当输入不包含显式偏移量或时区(如'2011-07-01 06:30:30')时,它被假定为位于PostgreSQL会话的当前时区,否则将使用显式指定的偏移量或时区(如'2011-07-01 06:30:30+05')。显示的结果转换为PostgreSQL会话的当前时区。
对于Java开发人员:它类似于java.time.Instant(虽然分辨率较低),但对于JDBC和JPA 2.2,您应该将其映射到java.time.OffsetDateTime(当然也可以映射到java.util.Date或java.sql.Timestamp)
有人说这两个TIMESTAMP变体都存储UTC日期-时间。有点,但在我看来,这样说很令人困惑。TIMESTAMP WITHOUT TIME ZONE像TIMESTAMP WITH TIME ZONE一样存储,使用UTC时区呈现的TIMESTAMP WITH TIME ZONE给出的年、月、日、小时、分、秒和微秒与本地日期-时间中的相同。但它并不代表UTC解释中所说的时间线上的点,它只是本地日期-时间字段编码的方式。(这是时间线上的一组点,因为实际时区不是UTC;我们不知道它是什么。)
create table public.testts (tz timestamp with time zone, tnz timestamp without time zone);
insert into public.testts values(now(), now());
select * from public.testts;
如果你有类似的问题,我有Angular / Typescript / Node API / PostgreSql中的时间戳精度环境,希望我的完整答案和解决方案将帮助你。