2012-12-09 49 views
3

我遇到了一个有点令人沮丧的问题,我有一种感觉,有一个简单的解决方案。当我将相同的UNIX时间戳传递给PHP date和MySQL FROM_UNIXTIME方法时,它们返回两个完全不同的日期。我想从MySQL返回一个与PHP返回的值相匹配的值。PHP和MySQL正在为相同的时间戳返回不同的日期

这是我目前使用的代码以及它的输出。提供的时间戳代表日期Tue, 01 Jan 2013 (01/01/2013)。另外供参考,这里是格式值。

MySQL的格式

  • 引用%j年(001..366)的=日。
  • %m =月份,数字(00..12)。
  • %y =年份,数字(两位数字)。

PHP格式

  • Z = 0(0到365)开始的一年中的天。
  • m =一个月的数字表示,前导零(01到12)。
  • y =一年的两位数表示(例如:99或03)。

MySQL查询

SELECT FROM_UNIXTIME(1357018200, '%j-%m-%y'); 
-> 366-12-12 

PHP代码

echo date('z-m-y', 1357018200); 
-> 0-01-13 

任何帮助将不胜感激,感谢您的时间。 :)

其他信息

  • MySQL版本:5.5.23
  • MySQL的system_time_zone:CDT
  • MySQL的TIME_ZONE:SYSTEM
  • PHP date_default_timezone_get:美洲/ C hicago(CDT)
+4

我认为这可能是一个时区问题。检查什么时区MySQL('show variables like'%time_zone';')和PHP使用(['date_default_timezone_get'](http://php.net/manual/en/function.date-default-timezone-get.php) )。 – vstm

+0

是的 - 以及发布这些变量,你可以发布你正在使用的MySQL版本。 – Danack

+0

我已经使用时区信息和SQL版本更新了帖子。 :) – Artail

回答

2

您的PHP和MySQL在时间上并不一致。使用时间转换器在:

http://www.4webhelp.net/us/timestamp.php?action=stamp&stamp=1357018200&timezone=-6

给出结果“周一,2012年12月31日,23:30:00(北京时间),”所以你的PHP是给错误的结果。尽管你已经给出了PHP运行的时区,你可以通过运行来检查:

date_default_timezone_set ("America/Chicago"); 
echo date('z-m-y', 1357018200)."\r\n"; 

应该给出“365-12-12”。

我想这可能是某些事情是在其他地方错误地设置时区,或者可能是“America/Chicago(CDT)”是您的php.ini文件中早期版本的PHP中的旧设置。

查看http://php.net/manual/en/timezones.america.php允许的时区值列表中没有列出“美国/芝加哥(CDT)”,因此您应该找出它被设置为该伪造值的位置,因为它可能会导致其他问题。

+0

MySQL返回'2012-12-09'和'00:45:19'。 PHP返回'Sun,09年12月9日00:45:19 -0600'。 – Artail

+0

强制它设置时区确实使其返回预期值,这很奇怪,因为我的脚本中没有一个与时区混淆。非常感谢你的帮助! – Artail

1

一旦你得到了你的时区的问题整理出来,回答您的实际问题是:

function sqlStyleDate($timestamp){ 

    $dayOfYear = date("z", $timestamp) + 1; 
    $year = date("y", $timestamp); 
    $month = date("n", $timestamp); 

    $result = "$dayOfYear-$year-$month"; 

    return $result; 
} 

echo sqlStyleDate(1357018200)."\r\n"; 

,将转换PHP的0-365天一年,为同MySQL的1-366一年中的一天。

+0

您应该将其编辑到您现有的答案中,因为它潜藏在问题的核心,并且是正确的。 – Charles

相关问题