【问题标题】:How to strtotime a timestamp, OR how best to deal with SQL dates?如何 strtotime 时间戳,或者如何最好地处理 SQL 日期?
【发布时间】:2011-01-11 17:44:23
【问题描述】:

在我的 PHP 应用程序中,当我使用 PHP 的 date() 命令格式化它们时,我从 MySQL 数据库中获取日期。我想整理一下并将其完全移动到视图中,而不是检索。但是我遇到了一些问题。

当从数据库中获取日期时,我在运行strtotime() 后将其传递给应用程序的其余部分,以便date() 函数可以使用它们。这是一个好主意吗?还是我错过了更好更明显的东西?我处理的日期几乎都是DATE 类型,而不是DATETIME

所以,我得到了日期,并且可以使用date() 在网页上显示它。但有时,我会从数据库中获取一些内容,仅将其插入到数据库的其他位置,并且不得不在后端寻找需要date() 的地方,这违背了将其分离到视图中的目的。我的检索函数有用地返回strtotime($date_from_db),然后我在另一个表中创建新条目......并且所有新条目都必须通过验证和准备函数。这就是问题所在。我通过查看strtotime() 是否为 0000-00-00 以外的其他内容来验证和准备日期。但是我不能在时间戳上运行strtotime();在我跑的测试中,如果给了我 1969 年 12 月 31 日。所以我的问题:

  1. 是否有可能以某种方式在时间戳上运行 strtotime()
  2. 如果不是,是否有一种简单的方法可以知道变量是否为时间戳?所以我可以简单地在它上面运行date(),而不是处理strtotime()?除了看看它是否出现在 1969 年 12 月 31 日,因为我不知道我是否可以相信失败是一致的。除非那是一件有效的事情吗?
  3. 我这样做完全错了吗?

【问题讨论】:

    标签: php mysql date strtotime


    【解决方案1】:

    作为一般方法,我很想:

    1. 使用 MySQL 的 datetime 类型存储日期/时间值,因为这将允许您在 MySQL 中有意义地查询数据,而无需使用 >= "timestampvalueX" 等。

    2. 在 PHP 脚本中使用时间戳格式保存所有“实时”日期信息。

    因此,您可能希望以该格式存储所有与日期/时间相关的信息作为目标。您可以简单地将其转换为 PHP 可以在查询本身中使用的格式(使用 UNIX_TIMESTAMP)或通过分解 YYYY-MM-DD HH:MM:SS 格式并使用 PHP 的 mktime 创建“标准”时间戳。 (尽管您可能希望使用 checkdate 进行验证。)

    回到您的具体问题:

    1. 如果通过了时间戳,strotime 将失败。

    2. 作为临时措施,您可以编写一个函数来检查提供的值是否为 10 位整数,如果是,则假定它是本机时间戳。 (if(is_int($value) && strlen($value) == 10)...)

    3. 听起来有点乱,所以作为一个合理的短期目标,您可能应该尝试标准化 MySQL 和 PHP 中的使用。

    【讨论】:

      【解决方案2】:

      查询时间戳时让mySQL处理。

      http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

      查询将检索格式化为您需要的时间戳,从而使您不必对字符串进行任何处理。

      【讨论】:

      • 我曾想过,但后来有人说视图应该在视图(即 PHP)中处理,而不是在查询中处理。我想,是否使用 MySQL 进行格式化和简单的数学运算是一个永恒的问题。
      【解决方案3】:

      但我不能在时间戳上运行 strtotime();在我跑的测试中,如果给了我 1969 年 12 月 31 日。

      12/31/1969 是 UNIX 纪元 1-1-1970 的开始,带有时区偏移。

      在时间戳上运行 strtotime() 将返回 0,当您通过 date() 运行它时,它会以 1-1-1970 UTC 结束。检查 strtotime 结果为 0 应该可以。

      【讨论】:

      • 啊哈。但是稍微澄清一下 - 失败的strtotime() 返回false,但我可以轻松地检查它以备不时之需......不过,对于验证来说并没有那么多。 :)
      【解决方案4】:

      简而言之,在从数据库返回的时间戳前添加一个“@”符号,您可以像使用普通时间戳一样使用它。建议将此解决方案作为尽可能减少提问者熟悉的技术和方法的一种手段(以最小化努力/混淆)。

      您的数据库返回一个时间戳的版本,它是一个字符串,而 PHP 时间戳是一个时间戳对象。

      使用“@”技巧,您可以始终如一地编码。无论您是从 PHP 处理时间戳对象还是从 MYSQL 返回的字符串都无关紧要。

      $ts1 = time();       //a PHP timestamp object
      $ts2 = '1628100056'; //a string, like one coming back from a timestamp field in a MYSQL DB
      
      //see here how they are both treated the same...
      $date1 = date('Y-m-d',strtotime('@'.$ts1));
      $date2 = date('Y-m-d',strtotime('@'.$ts2));
      
      echo "from object: ".$date1;
      echo "<BR>";
      echo "from string: ".$date2;
      

      应该从时间戳字段中检索数据库中的时间戳:

      SELECT UNIX_TIMESTAMP(my_timestamp_field) FROM my_table;
      

      【讨论】:

        猜你喜欢
        • 2020-06-13
        • 2013-06-13
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 2020-10-03
        • 1970-01-01
        相关资源
        最近更新 更多