3

我遇到了一个有点令人沮丧的问题,我觉得有一个简单的解决方案。当我将相同的 UNIX 时间戳传递给 PHPdate和 MySQLFROM_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 时区:系统
  • PHP date_default_timezone_get : 美国/芝加哥 (CDT)
4

2 回答 2

2

您的 PHP 和 MySQL 在时间上不一致。在以下位置使用时间转换器:

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

给出结果“2012 年 12 月 31 日星期一 23:30:00 (GMT -6)”,因此您的 PHP 给出了错误的结果。尽管您已经给出了 PHP 运行的时区,但您可以通过运行来仔细检查:

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

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

我想可能是某些东西在其他地方错误地设置了时区,或者“美国/芝加哥(CDT)”可能是您的 php.ini 文件中旧版本 PHP 中的旧设置。

查看来自http://php.net/manual/en/timezones.america.php的允许时区值列表,没有列出“America/Chicago (CDT)”,因此您应该弄清楚它的设置位置虚假价值,因为它可能会导致其他问题。

于 2012-12-09T06:20:16.707 回答
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 天相同。

于 2012-12-09T07:12:16.380 回答