ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php-“ date_part(‘epoch’,now()at time zone’UTC’)“与在PostgreSQL中的” now()at time zone’UTC’“不同的时间

2019-11-06 19:30:27  阅读:368  来源: 互联网

标签:timezone postgresql datetime php


我正在将基于Web的前端编写到数据库(PHP / Postgresql)中,我需要在其中存储各种日期/时间.该时间应始终在本地时间在客户端输入,并也在本地时间显示.出于存储目的,我将所有日期/时间存储为整数(UNIX时间戳)并标准化为UTC.一个特定的字段有一个限制,即将来不允许填写时间戳,因此我尝试了数据库约束…

CONSTRAINT not_future 
    CHECK (timestamp-300 <= date_part('epoch', now() at time zone 'UTC'))

如果浏览器和服务器之间的时间稍微不同步,则-300将有5分钟的余地.
问题是,提交当前时间时,此约束始终失败.我已经完成测试,发现以下内容.

在PostgreSQL客户端中:

SELECT now()-返回正确的本地时间

SELECT date_part(‘epoch’,now())-返回UTC的unix时间戳(通过将值输入到PHP中的date函数中以对其对我的时区的补偿进行校正来进行测试)

SELECT date_part(‘epoch’,now()at time zone’UTC’)-返回以两个时区向西偏移的unix时间戳,例如我在格林尼治标准时间2,得到GMT-2时间戳.

我已经清楚地知道,删除“在时区’UTC’”会解决我的问题,但是我的问题是,“ epoch”是否旨在返回AFAIK始终位于UTC的unix时间戳,为什么? UTC中已经存在的“时代”会被纠正吗?这是一个错误,还是我在这里缺少有关已定义/正常行为的信息.

解决方法:

“时区’UTC’的now()”值是您当前的时间,该时间已移至UTC,然后转换为TIMESTAMP WITHOUT TIME ZONE.

因此,您给“ date_part”一个没有时区的TIMESTAMP(换句话说,未知时区),并期望在已知时区收到它与固定时间戳之间的秒差(“ EPOCH”,1970-01-01 00: 00:00 UTC).

Postgres需要TIMESTAMP WITH TIME ZONE进行计算.因此,它将您的值转换为时区’UTC’assuming it’s at your time zone并计算差值.

就像是:

select ((now() at time zone 'UTC') at time zone '<your_time_zone>') at time zone 'UTC';

标签:timezone,postgresql,datetime,php
来源: https://codeday.me/bug/20191106/2000459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有