在你的问题中,我没有看到exact型的starts_at
.你真的应该包括这些信息,这是解决问题的关键.我得猜猜.
PostgreSQL always在内部存储timestamp with time zone
类型的UTC时间.输入和输出(显示)调整为当前timezone
设置或给定时区.AT TIME ZONE
的效果也随基础数据类型而变化.见:
如果从类型timestamp [without time zone]
中提取date
,则会得到当前时区的日期.输出中的日期将与timestamp
值的显示相同.
如果从类型timestamp with time zone
(简称timestamptz
)中提取date
,则首先"应用"时区偏移.您仍然可以获得当前时区的日期,该日期与时间戳的display一致.在欧洲部分地区,同样的时间点也会转化为第二天,比如加利福尼亚州的下午4点多.要获取特定时区的日期,请先申请AT TIME ZONE
.
因此,你在问题顶部描述的内容与你的例子相矛盾.
假设starts_at
是101,服务器上的时间设置为本地时间.测试方法:
SELECT now();
它的显示时间和你墙上的时钟一样吗?如果是(并且数据库服务器在正确的时间运行),则当前会话的timezone
设置与本地时区一致.如果没有,您可能希望访问postgresql.conf
或客户机中的timezone
设置.Details in the manual.
请注意,timezone
偏移量与时间戳文本中显示的sign偏移量相反.见:
让你的本地约会从starts_at
开始
SELECT starts_at::date
相当于:
SELECT date(starts_at)
顺便说一句,你的当地时间现在是UTC-7,而不是UTC-8,因为夏令时是有效的(不属于人类更Illuminate 的 idea ).
太平洋标准时间(PST)通常比UTC(世界时区)早8小时(大于timestamp
个值),但在夏时制期间(如现在)可能是7小时.这就是为什么在您的示例中timestamptz
显示为2012-06-21 02:00:00
103.构造AT TIME ZONE 'PST'
考虑了夏令时.这两个表达式产生不同的结果(一个在冬季,一个在夏季),并可能在播放时产生不同的日期:
SELECT '2012-06-21 01:00:00'::timestamp AT TIME ZONE 'PST'
, '2012-12-21 01:00:00'::timestamp AT TIME ZONE 'PST'