【问题标题】:Formatting an SQL timestamp with PHP使用 PHP 格式化 SQL 时间戳
【发布时间】:2011-01-19 05:03:20
【问题描述】:

我有一个带有时间戳字段的 mySQL 数据库。它目前只有一个条目,而我正在测试,它是

2010-02-20 13:14:09

我正在从数据库中提取并使用

echo date("m-d-Y",$r['newsDate'])

我的最终结果显示为

12-31-69

有人知道为什么吗?

编辑: 编辑: 忽略那个编辑...notepad++ 的 FTP 插件超时,不幸的是,它在无法同步时不会显示错误。

【问题讨论】:

  • 啊...没有意识到 mySQL 是 UNIX 时间编码的...那是有道理的。
  • 如果$r['timestamp'] 为空,您将获得系统用作纪元时间起点的任何时间。 (通常是 01-01-70 或 12-31-69)

标签: php mysql date timestamp


【解决方案1】:

date 函数需要 UNIX timestamp 作为它的第二个参数——这意味着您必须将从数据库获取的日期转换为 UNIX 时间戳,这可以使用 strtotime 完成:

$db = '2010-02-20 13:14:09';
$timestamp = strtotime($db);
echo date("m-d-Y", $timestamp);

你会得到:

02-20-2010


您将'2010-02-20 13:14:09' 字符串传递给date 函数;该字符串不是有效的 UNIX 时间戳。

'12-31-69' 可能是 1970-01-01,在您的语言环境中; 1970-01-01 是 Epoch -- 对应于 0 UNIX Timestamp 的日期。

【讨论】:

  • 不知道为什么这被否决 - 这是正确的。您可以使用 Urda 建议的 strtotime php 函数或 UNIX_TIMESTAMP SQL 方法
  • @Simon :其实我也想知道 ;;我猜我没有正确回答这个问题,并且想知道“正确理解它的方式”是什么^^;;感谢您的留言:-)
  • 如果我也想显示时间怎么办?
  • 你可以使用类似date("G:i", $timestamp)的东西——更多信息参见手册php.net/manual/de/function.date.php
【解决方案2】:

对于初学者,php date() 函数期望秒作为第二个变量。这就是为什么您的日期显示错误的原因。在那个问题上检查这个source

然后它为我们提供了问题的答案,为了让 PHP 正确格式化 SQL 时间戳中的日期,我们只需稍微更改查询...

SELECT author, `when`

改成...

SELECT author, UNIX_TIMESTAMP(`when`)

然后使用 PHP 日期函数,并使用存储上述 SQL 查询结果的变量。

【讨论】:

    【解决方案3】:

    您可以改用 MySQL 的 date_format() 函数:

    SELECT date_format(timestampfield, '%m-%d-%Y') FROM table etc....
    

    这将使您不必将时间戳往返转换为 unix 时间,然后再转换回 PHP 中的普通日期字符串。一个日期时间格式化调用,而不是两个。

    【讨论】:

      【解决方案4】:

      我认为这对newble很有用:

      从 MYSQL 格式的日期开始的基本减法 1 小时示例:

      $to='2013-25-10 22:56:00'; //curr time
      $timestamp = strtotime($to); //convert to Unix timestamp
      $timestamp = $timestamp-3600; //subtract 1 hour (3600 this is 1 hour in seconds)
      echo date("Y-m-d H:i:s",$timestamp); //show new date
      

      【讨论】:

        【解决方案5】:

        编辑:检查后,MySQL 似乎将 timestamp 作为字符串返回给 PHP,所以这个答案是假的 :)

        无论如何,您获得 1969 年日期的原因可能是您将零 unix 时间从 UTC 转换为本地时间。 unix 时间是自 1970 年以来的秒数。因此值 0 表示 1970 年。您很可能生活在具有负偏移量的时区,例如 GMT-6,最终为 31-12-69。

        【讨论】:

          【解决方案6】:

          好的,我为此苦苦挣扎了一个星期(更长,但我休息了一下)。

          我在表格中有两个特定字段

          创建日期 > 时间戳 > current_timestamp 编辑日期 > 时间戳 > current_timestamp

          他们要么撤出 1969 年 12 月 31 日,要么什么都没有……烦人……非常烦人

          在 mysql 查询中我做了:

                      unix_timestamp(creationDate) AS creationDate
                      unix_timestamp(editDate) AS editDate
          

          在 php 转换中我做了:

              $timestamp = $result_ar['creationDate'];
              $creationDate = date("Y-M-d (g:i:s a)", $timestamp)
                      echo($creationDate);
          
              $editstamp = $result_ar['editDate'];
              $editDate = date("Y-M-d (g:i:s a)", $editstamp)
                      echo($editDate);
          

          这解决了我返回的问题

                      2010-Jun-28 (5:33:39 pm)
                      2010-Jun-28 (12:09:46 pm)
          

          分别。

          我希望这对某人有所帮助..

          【讨论】:

            猜你喜欢
            • 2015-11-28
            • 1970-01-01
            • 2019-02-17
            • 1970-01-01
            • 2019-06-18
            • 2018-08-09
            • 1970-01-01
            相关资源
            最近更新 更多