【问题标题】:parse a date string解析日期字符串
【发布时间】:2011-07-21 12:45:53
【问题描述】:

我在 post 变量中有这个字符串

'03/21/2011'

我需要通过php解析并转成这种格式

'2011-03-21'

我正在使用 php,我需要这种格式,所以我可以运行这个查询

SELECT prospect as 'Prospect', company as 'Company', industry as 'Industry', created_at as 'Original Date Submitted', software as 'Software', warm_transfer as 'Warm Transfer', UserName as 'Sales Rep' FROM mercury_leads join user on UserID=user_id WHERE created_at BETWEEN '2011-01-01' AND '2011-03-22'

【问题讨论】:

标签: php mysql string parsing datetime


【解决方案1】:

如果你想在 PHP 中处理它,最好的办法是使用 strtotime() 函数,它将字符串转换为时间,然后可以使用 date() 函数进行操作。

所以你会做这样的事情:

$dateStr = date('Y-m-d', strtotime('03/21/2011'));

使用strtotime() 的好处是您不必担心传入的字符串的确切格式。只要它是半合理的,它就会转换它。

因此它可以处理 03/21/20113-21-201103-21-11,无需任何修改或特殊处理案例。

【讨论】:

  • 解决方案非常适合这个问题。但是,请注意它无法解析非常合理的格式 d/m/Y。
  • 从 strtotime 文档看来,如果 / 用作分隔符,它假设 m/d/y ,如果 - 或 d-m-y 。用作分隔符。
  • 听起来不错。当然,这意味着它实际上无法解析3-21-2011。这就是为什么我更喜欢date_create_from_format(因为如果你要求它可以解析这样的格式),但显然没有什么可以捕捉到(例如)d-m-Y 时的意外d <= 12。就我个人而言,我发现strtotime 更有助于解析像“上周一”这样的短语。
【解决方案2】:

你甚至可以从 mysql 解析它

select str_to_date('03/21/2011','%m/%d/%Y')

【讨论】:

    【解决方案3】:
    $date = '03/21/2011';
    $timestamp = strtotime($date);
    $sqlDate = date('Y-m-d', $timestamp);
    

    这应该可以满足您的需求。

    strtotime

    date

    【讨论】:

      【解决方案4】:
      $items=explode('/','03/21/2011');
      $time=mktime(0,0,0,$items[0],$items[1],$items[2]);
      $isodate=date('Y-m-d',$time);
      

      【讨论】:

        【解决方案5】:

        虽然有很多方法可以做到这一点,但我认为最容易理解和适用于所有日期转换的是:

        $date = date_create_from_format('n/d/Y', $date)->format('Y-n-d');
        

        它是明确的,您永远不必怀疑 m/d 或 d/m 等。

        【讨论】:

          【解决方案6】:

          你可以在这里看到它

          http://www.codegod.de/WebAppCodeGod/PHP-convert-string-to-date--AID597.aspx

          或者使用 PHP 5.3 的 Date 类

          【讨论】:

            【解决方案7】:

            STR_TO_DATE(created_at, '%m/%d/%Y') as 'Original Date Submitted'。

            【讨论】:

              【解决方案8】:

              答案 1:

              你可以使用这样的东西

              $dateStr = date('Y-m-d', strtotime($someDate));
              

              骗子

              这对代码的可读性不是很好,因为它不允许您显式解析某种格式并在代码中使其显而易见。例如,对于外部程序员来说,您的代码对于 $someDate 的格式并不明显,因为 strtotime 解析多种格式。

              专业版

              但是,如果 $someDate 可能会发生变化,并且您希望代码继续尝试规范化各种格式,这是一个不错的选择

              骗子

              如果您的数据格式不受支持。例如,当尝试解析非美国日期格式的日期时,意味着月份和日期被切换,但格式使用正斜杠 (21/04/78) m/d/y 或 dmy 格式的日期通过查看来消除歧义在各个组件之间的分隔符处:如果分隔符是斜线 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 d-m-y 格式。

              答案 2:

              要真正使您的代码清楚地了解您正在解析的日期并验证传入的数据是否使用正确的格式,我将使用 date_create_from_format。这里有一些代码可以提供帮助:

              $server_date_str='06-10-2013 16:00:09';
              
              $server_date_time = DateTime::createFromFormat('d-m-Y H:i:s',$server_date_str);
              
              // check the format 
              
              if ( !($server_date_time instanceof DateTime) ) {
              
                $error_array = DateTime::getLastErrors();
              
                throw new Exception( implode(" - ",$error_array['errors']) );
              
              }
              
              //convert DateTime object to Unix time stamp
              
              $server_time = strtotime($server_date_time->format('d-m-Y H:i:s'));
              
              //convert Unix timestamp to date string of the format 2012-10-21
              $dateStr = date('Y-m-d', $server_time);
              

              此链接更详细地解释了此示例:

              http://boulderapps.co/parse-a-date-by-a-specific-date-format-in-php

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-02-15
                • 2014-02-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-17
                • 2018-04-18
                相关资源
                最近更新 更多