【问题标题】:PHP strtotime is off by one dayPHP strtotime 关闭了一天
【发布时间】:2014-07-02 19:16:27
【问题描述】:
//Convert string to unix timestamp
strtotime( "04/05/2014" );

//Insert into database, convert from unix timestamp first
$sql = "INSERT INTO database ( date ) VALUES ( FROM_UNIXTIME(:date) )";

当我期望它是 2014-04-05 00:00:00 时,它以 2014-04-04 15:00:00 保存到数据库中

我做错了什么?

【问题讨论】:

  • 这是一种将日期转换为新格式的奇怪方法。
  • 你在哪个时区?
  • 似乎没有遵守 GMT
  • 一天没关,好像关了7个小时

标签: php mysql timestamp unix-timestamp strtotime


【解决方案1】:

Unix 时间戳是一个固定的时间点。但是,MM/DD/YYYY 日期是依赖于时区的相对数据。

当你这样做时:

strtotime( "04/05/2014" );

...您告诉 PHP 计算对应于 PHP 时区午夜的时间戳。然后你这样做:

FROM_UNIXTIME(:date)

...并告诉 MySQL 计算与时间戳对应的本地时间(关于 MySQL 时区)。因此发生了转变。


SQL 中的时区转换很困难,所以我会不惜一切代价避免它们。我会为 MySQL 提供一个已经包含适当本地时间的字符串,例如:2014-04-05 或 2014-04-05 00:00:00。该字符串很容易从 PHP 中计算出来。

关于 PHP,要么明确设置时区:

$ts = strtotime( "04/05/2014 +02:00" );

...或根据自己的喜好调整默认区域:

date_default_timezone_set('Europe/Madrid');

我还建议您熟悉 DateTime 类 - 它比旧的时间戳更强大。

【讨论】:

  • 我会很感激关于否决票的解释。我对 PHP 日期处理特别感兴趣,我很想纠正我写的任何错误信息。
  • 我也对否决票的原因感兴趣,因为我认为 Alvaro 对观察到的行为提供了有效的解释,即 MySQL FROM_UNIXTIME() 函数使用“当前时区”(即数据库会话中time_zone变量的设置)在评估返回值时。
  • @ÁlvaroG.Vicario 很好的解释。非常感谢。
【解决方案2】:

date_default_timezone_set('America/Los_Angeles');

因为这个设置你的 时区,它会工作


享受:)

【讨论】:

  • 谢谢。尽管您的回答很直接,但 Alvaro 提供的解释帮助我理解了全局。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2017-08-03
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多