php日期\默认\时区\设置时间()VS mysql now()

php日期\默认\时区\设置时间()VS mysql now(),php,mysql,sql,database,Php,Mysql,Sql,Database,我正在开发网上购物系统。只有英国客户可以从该网站下订单 我想知道哪种方法对我最好 日期默认时区设置(“欧洲/伦敦”); $time=time() 或 现在使用mysql函数() 有时,客户可以选择交货或收款的时间 注意:在英国,我们每年更改两次时间 如果时间被发送到数据库,请使用NOW();更少的开销,并且服务器时区希望总是正确的,并且比PHP的时区更易变。如果我们只是讨论显示,而没有实际执行数据库工作,那么仅仅为了获取时间而运行mysql查询是过分的。在PHP中,我通常执行以下操作: date

我正在开发网上购物系统。只有英国客户可以从该网站下订单

我想知道哪种方法对我最好

日期默认时区设置(“欧洲/伦敦”); $time=time()

现在使用mysql函数()

有时,客户可以选择交货或收款的时间


注意:在英国,我们每年更改两次时间

如果时间被发送到数据库,请使用NOW();更少的开销,并且服务器时区希望总是正确的,并且比PHP的时区更易变。如果我们只是讨论显示,而没有实际执行数据库工作,那么仅仅为了获取时间而运行mysql查询是过分的。

在PHP中,我通常执行以下操作:

date_default_timezone_set('GMT');
然后,在连接到MySQL服务器时,我执行以下查询:

'SET time_zone = "' . date_default_timezone_get() . '";'
这确保了PHP和MySQL使用相同的时区,因此
NOW()
date('Y-m-dh:i:s')
都应该产生相同的结果


关于白天的变化,它们应该不是问题(如果你不断更新你的软件)。

在这个问题上,一个重要的考虑因素是PHP和MySQL之间的时间是否相同

如果两者在同一台机器上运行,那么答案很可能是“是”,但如果它们在不同的机器上,那么它们很可能实际上是不同的

考虑这样一个场景:使用MySQL
NOW()
函数将日期写入数据库,另外还有一个查询,要求在过去24小时内输入所有条目,并使用PHP date函数在查询中构建时间。如果PHP服务器上的时间与SQL服务器不同步,则可能会丢失报告中的记录(或者连续几天将记录加倍,具体取决于不同步的方式)。这可能会导致交货延误等

这样做的结果是,您应该注意与日期(尤其是日期时间)的使用保持一致。使用PHP还是MySQL日期功能并不重要,但应该尝试使用与更新相同的平台进行查询

当然,它并不总是以这种方式变得至关重要,而且你可以实事求是地对待它——有时候回到数据库,仅仅为了找出时间是什么,实在太不方便了!但重要的时候,你应该小心


当然,如果两个系统在同一台服务器上,这不是问题,但您不应该假设总是这样。

UNIX\u时间戳总是产生相同的时间戳,因为UNIX时间戳忽略了时区。它总是以1971年1月1日的格林尼治标准时间为基础。@Evert:True,同样的事情也发生在
time()
上。应该用一个
NOW()
和一个
date()
调用来代替它,但你明白了@Alix否,
time()
将时区考虑在内。但是,如果您使用
DateTime
类设置时间戳,则不会考虑时区(它假定所有时间戳为GMT):
newdatetime('@583848395493')@Michael:对不起,你错了
time()
-返回自Unix纪元(1970年1月1日00:00:00 GMT)以来以秒为单位测量的当前时间。@Alix如果我听起来像是在指责,我道歉。我运行了一个测试,您是对的,
time()
忽略默认时区。我一直使用时间()很多,而且从来没有任何时区问题,所以假设它考虑了时区…但是我使用<代码>日期()>代码>来输出日期,这可能是原因。code>TIMESTAMP
保存带有时区的日期和时间,而
DATETIME
date
对时区一无所知。为了降低时间戳的吸引力,它可以存储的范围要小得多(
时间戳的“1970-01-01 00:00:01”UTC到“2038-01-19 03:14:07”UTC,而
时间戳的“1000-01-01”到
日期的“9999-12-31”和
日期时间的“9999-12-31”)。