php 时间戳查询数据库,PHP可以安全地使用unix时间戳来查询mysql数据库吗?

关于处理日期有很多建议。我想澄清一下。假设:

用户正在将记录插入数据库

为该记录生成插入日期的Unix时间戳

现在,用户希望查询数据库中的日期间隔:

用户在其本地时区中提供2个日期

使用这些值将时区转换为UTC并获取时间戳

根据转换后的2个整数查询数据库中的记录(例如,其中日期大于等于第一个,日期小于等于第二个)

再次将检索到的时间戳转换为本地时区进行显示

我知道这在PHP中是可能的,但在本例中不需要关心MySQL的时区设置——只有PHP。系统将是64位的,因此存储日期的空间不足不是问题。但是…

这是否会引发其他严重问题,如DST变更或其他问题?

什么让你怀疑这些问题?因为您不确定MySQL如何处理这些时间戳,例如数据库中的那些时间戳属于哪个时区?您是将日期存储为Unix时间戳还是如何存储它们?

我天生多疑。因为我不知道日期和时间处理的一切,所以我很自然地去寻找答案,以确保一切都正常。不,我将Unix时间戳存储为大整数而不是时间戳字段。我不想让MySQL知道我们在处理日期问题。

然后看看@tadeck的答案。

别介意-记住,必须使用基于MySQL的日期函数,所以我必须将时间戳存储为时间戳。

Unix时间戳与时区无关。

这也是您可以更改此步骤的原因:

use these values to convert timezone to UTC and get the timestamp

在这方面:

convert values to Unix timestamp

尽管在数据库(如mysql)中存储时间戳非常简单。如果要执行以下操作,可以确保php具有unix时间戳:

使用FROM_UNIXTIME()mysql函数保存值(给unix timestamp作为参数,根据mysql的设置接收datetime)。

使用UNIX_TIMESTAMP()mysql函数(给出字段名或参数值)检索值,根据mysql的设置,根据数据库中存储的日期时间获取unix时间戳(integer)。

只需记住使用TIMESTAMP列类型来存储时间戳。这样,时间将以独立于时区的方式存储,仅根据MySQL的设置显示。

关于mysql的版本你是对的,但是…我希望能够独立于MySQL进行操作。在您的情况下,我是否能够独立于MySQL的时区设置安全地工作?

@马吕斯:我只是说,TIMESTAMP与包含unix时间戳的INT非常相似,不存在时区问题。请参阅偶比较(这实际上是整个新讨论的主题):stackoverflow.com/a/7029306/548696和stackoverflow.com/a/331655/548696。当涉及到独立于mysql做事情时,那么一些抽象层可能包括php和mysql之间的转换(比如在不同的表单中),你不会完全隐藏在mysql中。使用TIMESTAMP还可以使用与日期时间相关的函数、分组等。

谢谢你的解释。我想我可以不使用MySQL。那是…直到你提醒我分组的时候:)我想我必须存储时间戳。

t检查Unix时间戳是否与时区无关是正确的。

但是,在整个应用程序中使用时间戳时,您应该将数据库中的时间戳作为纯整数存储和使用。在应用程序级别(在PHP中)转换为本地时区或从本地时区转换。这允许您只关注PHP中的时区,而不关注2个系统中的时区。它还简化了在应用程序级别为单个用户设置时区的过程。

谢谢,但重点是当使用TIMESTAMP列时,日期时间也以时区独立格式存储,这不会以任何方式限制您允许用户以自己的方式设置时区。mysql的TIMESTAMP列专门为存储时间戳而设计。虽然对存储时间戳有两种不同的看法:一种认为应该使用INT,另一种认为应该使用TIMESTAMP(认为应该使用DATETIME当然是不正确的;)。

我很欣赏这种观点,但时间戳只是个提示。所以当在SQL中进行比较时,int是可以的。我喜欢在应用程序级别执行的任何本地转换。这样MySQL的时区设置就不相关了。

不过,我确实把它们存得很大。

@马茨:我理解这些论点。我还喜欢将时间戳存储为INTs,直到我真正了解到在某个时候我通常需要在数据库层上解释时间戳(例如,我需要使用一个与日期时间相关的SQL函数),然后我真的需要TIMESTAMP而不是整数。下面是另一条评论:stackoverflow.com/questions/12529411/…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值