PHP& MySQL返回相同时间戳的不同日期

时间:2012-12-09 06:03:23

标签: php mysql date time format

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

这是我目前使用的代码及其输出。提供的时间戳代表日期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 :美国/芝加哥(CDT)

2 个答案:

答案 0 :(得分:2)

您的PHP和MySQL不同意时间。使用时间转换器:

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

结果为“2012年12月31日星期一,23:30:00(格林威治标准时间-6)”,因此您的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中允许的时区值列表,没有列出“America / Chicago(CDT)”,因此您应该找出它设置为该伪造值的位置,因为它可能会导致其他问题。

答案 1 :(得分: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天相同。