【问题标题】:PHP date() format when inserting into datetime in MySQL在 MySQL 中插入日期时间时的 PHP date() 格式
【发布时间】:2011-01-13 23:51:53
【问题描述】:

如果我想将结果插入到 MySQL datetime 类型列中,传递给 PHP 中 date() 函数的正确格式是什么?

我一直在尝试date('Y-M-D G:i:s'),但每次都插入“0000-00-00 00:00:00”。

【问题讨论】:

  • 由于您没有提供迄今为止的参数,您是否真的要记录当前时间?

标签: php mysql


【解决方案1】:

问题是您使用'M''D',它们是文本表示,MySQL 期望格式为2010-02-06 19:30:13 的数字表示

试试:date('Y-m-d H:i:s'),它使用数字等价物。

编辑:将G 切换为H,虽然它可能没有影响,但您可能希望使用带前导0 的24 小时格式。

【讨论】:

  • 这必须是任何人都需要的最常见的日期时间格式之一。应该是内置的 php 全局或日期函数本身的一部分(例如,'c'、'r')
  • 为什么不是这样我不知道。我必须参考每个堆栈溢出。单身的。运作。时间。
  • 来这里比在我的代码中搜索这样的用法要快。
  • 刚刚想到了一个可爱的助记符来记住格式:“Your my date not 他的”。适用于很多层面:)
  • 应该有一个 php 简写,就像 ISO 8601 和 RFC 2822 一样
【解决方案2】:

来自php的date() manual page的cmets:

<?php $mysqltime = date ('Y-m-d H:i:s', $phptime); ?>

您的“Y”是正确的 - 那是一整年,但“M”是三个字符的月份,而“m”是一个两位数的月份。 'D' 而不是 'd' 的问题相同。 'G' 是 1 或 2 位数的小时,其中 'H' 在需要时总是以 0 开头。

【讨论】:

  • 谢谢@Pekka - 我记得你和我有大致相同的代表 - 你一直很活跃。
  • 是的,我现在工作很多,所以这是我最喜欢的消遣:) 这将再次改变。
【解决方案3】:

这是另一种解决方案:如果您在 PHP 中将日期作为时间戳,则绕过 PHP 处理它,并让数据库使用 FROM_UNIXTIME 函数来处理它。

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+

【讨论】:

  • 这是一个优雅的解决方案。谢谢 :)
  • @trejder,谁告诉你用mysql做比用php做快?用 PHP 做会更好,因为数据库通常是瓶颈,你想尽快进出
  • @Pacerier 如果您的数据库构建不佳,或者运行太多小查询而不是更强大的有效单个查询,或者在很多情况下您依赖ORM 来管理数据库。具有良好索引关系数据库的可靠 SQL 并不慢。
  • @mopsyd,数据库是瓶颈,因为scaling it horizontally 需要复杂性。将其与无需任何代码更改即可在全球范围内复制的网络服务器进行比较。
  • 如果查询失败,记录在某处,并且您必须对其进行调试,那么时间戳比@tim-lytle 描述的格式化日期字符串更难读取。
【解决方案4】:

我使用以下 PHP 代码创建了一个变量,我将其插入到 MySQL DATETIME 列中。

$datetime = date_create()->format('Y-m-d H:i:s');

这将保存服务器的当前日期和时间。

【讨论】:

    【解决方案5】:

    用 PHP 格式化 MySQL 日期时间

    $date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
    

    【讨论】:

      【解决方案6】:

      将时间戳格式化为 MySQL DATETIME 列:

      strftime('%Y-%m-%d %H:%M:%S',$timestamp);
      

      【讨论】:

        【解决方案7】:
        $date_old = '23-5-2016 23:15:23'; 
        //Date for database
        $date_for_database = date ('Y-m-d H:i:s'", strtotime($date_old));
        
        //Format should be like 'Y-m-d H:i:s'`enter code here`
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit您的回答添加一些解释,并解决您的格式问题。
        【解决方案8】:

        如果您不使用时间戳,则无需使用 PHP 中的 date() 方法。如果dateposted 是日期时间列,您可以像这样插入当前日期:

        $db->query("INSERT INTO table (dateposted) VALUES (now())");
        

        【讨论】:

        • 感谢分享这种方法。这是迄今为止我见过的最简单的方法。
        【解决方案9】:

        我使用这个函数(PHP 7)

        function getDateForDatabase(string $date): string {
            $timestamp = strtotime($date);
            $date_formated = date('Y-m-d H:i:s', $timestamp);
            return $date_formated;
        }
        

        旧版本的 PHP (PHP

        function getDateForDatabase($date) {
            $timestamp = strtotime($date);
            $date_formated = date('Y-m-d H:i:s', $timestamp);
            return $date_formated;
        }
        

        【讨论】:

        • 我对你的答案投了赞成票,因为它在我编辑了第一行之后就起作用了; function getDateForDatabase(string $date) : string {function getDateForDatabase($date) { 为什么类型声明会抛出错误我不知道足够的 PHP 来告诉。
        • "传递给 getDateForDatabase() 的参数 1 必须是字符串的实例,给定的字符串," - 我的输入是字符串,
        【解决方案10】:

        这一直让我疯狂寻找一个简单的答案。最后,我创建了这个函数,它似乎可以捕获所有输入,并给出一个正确或至少有效且可检查的良好 SQL 字符串。如果是 1999-12-31,它可能是错误的,但不会在 MySQL 中引发严重错误。

        function MakeSQLDate($date) {
            if (is_null($date)) {
                //use 1999-12-31 as a valid date or as an alert
                return date('Y-m-d', strtotime('1999-12-31'));
            }
        
            if (($t = strtotime($date)) === false) {
                //use 1999-12-31 as a valid date or as an alert
                return date('Y-m-d', strtotime('1999-12-31'));
            } else {
                return date('Y-m-d H:i:s', strtotime($date));
            }
        }
        

        【讨论】:

        • 如果您必须检查null,那么您的上游数据有问题!
        【解决方案11】:

        在 PHP7+ 中使用 DateTime 类:

        function getMysqlDatetimeFromDate(int $day, int $month, int $year): string
        {
         $dt = new DateTime();
         $dt->setDate($year, $month, $day);
         $dt->setTime(0, 0, 0, 0); // set time to midnight
        
         return $dt->format('Y-m-d H:i:s');
        }
        

        【讨论】:

          【解决方案12】:

          接受答案的一个小补充:如果数据库 datetime 存储为 UTC(我总是这样做),您应该使用 gmdate('Y-m-d H:i:s') 而不是 date("Y-m-d H:i:s")

          或者,如果您希望让 MySQL 处理所有事情,正如一些答案所建议的那样,我会插入 MySQL 的 UTC_TIMESTAMP,结果相同。

          注意:我理解的问题是指当前时间。

          【讨论】:

          • 好答案。所有其他答案似乎都忽略了围绕时区的微妙问题。我的意思是,你怎么知道你的 SQL 服务器的时区,或者你的网络服务器,或者用户?对 date() 或 NOW() 的裸调用看起来像是时区错误磁铁。
          • @ChrisNadovich,mysql的时区可以用“SELECT @@global.time_zone;”来显示。默认为“SYSTEM”,服务器的 TZ。 “0:00”是UTC。对于 apache,您可以使用 SSI 的 ''。 PHP 可能会有所不同。对于用户,终端中的“date +%Z”(但任何进程都可以覆盖它)。
          • 嗯,当然,@bruno。然而,根本不谈论时区似乎是这里“首选”答案中的一个缺陷。我的意思是,如果我们可以使用 'Ymd H:i:se' 并让 SQL 自动存储一个明确的时间,因为它会自动处理 Y、m、d、H、我和 s。
          • 是的@ChrisNadovich 对我来说,唯一明确的系统是让服务器使用UTC。然后在客户端进行转换,仅供用户使用。服务器上的任何不同设置都意味着我们无法保证两条记录的相对顺序(想想冬季/夏季时间更改前 1m 插入的记录,100 万之后插入的第二条记录,服务器时钟在中间倒退 1 小时)。
          【解决方案13】:

          这是一种更准确的方法。它将小数放在秒后,从而提供更高的精度。

          $now = date('Y-m-d\TH:i:s.uP', time());
          

          注意.uP

          更多信息:https://stackoverflow.com/a/6153162/8662476

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-26
            • 1970-01-01
            • 2017-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-20
            相关资源
            最近更新 更多