【问题标题】:Strtotime() doesn't work with dd/mm/YYYY formatStrtotime() 不适用于 dd/mm/YYYY 格式
【发布时间】:2010-05-23 13:41:54
【问题描述】:

我真的很喜欢strtotime() 功能,但用户手册没有完整描述支持的日期格式。 strtotime('dd/mm/YYYY') 不起作用,它只适用于 mm/dd/YYYY 格式。

如果我有dd/mm/YYYY 格式的日期,如何将其转换为YYYY-mm-dd? 我可以通过使用explode() 函数来做到这一点,但我认为有更好的解决方案。

【问题讨论】:

  • 您实际上不需要将其转换为“YYYY-mm-dd”格式来解析它 - 您只需将其更改为“dd-mm-YYYY”即可str_replace('/', '-', $date);

标签: php


【解决方案1】:

这是简化的解决方案:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

结果:

2010-05-25

The strtotime documentation 读作:

m/d/ydmy 格式的日期可通过查看分隔符来消除歧义各种组件:如果分隔符是斜线 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则欧洲 dmy 格式假设。

【讨论】:

  • @Web Logic 我无法理解 strtotime() 函数的默认格式,如果我写 strtotimr('01-01-2010'),它将理解为 dd-mm-YYYY 或 mm -dd-YYYY 格式?
  • 如果你测试它:echo date('Y-m-l', strtotime('01-01-2010')); 结果是2010-01-Friday。所以最后一天,取决于您如何为 date 函数指定日期格式。
  • 虽然您在此处发布的内容是正确的并回答了用户的问题 - 这是解决实际问题的一种迂回方式。为了让 strtotime() 正确解析格式为“dd/mm/yy”的日期,您需要将“/”替换为“-”。因此,您只需要答案的前两行:$date = '25/05/2010'; $date = str_replace('/', '-', $date); 附加行不是解决您的问题所必需的。
  • 只有当日期 >12 时才正确: $date='1/2/34'; //2034 年 2 月 1 日 echo date('d M Y', strtotime($date)); //2034 年 1 月 2 日
  • date('Ymd H:i:s', strtotime('26/05/17'); 给出 2026-05-17 但它是 2017 年 5 月 26 日......它适用于26.05.17
【解决方案2】:

您可以使用 DateTime::createFromFormat 解析自定义格式(自 PHP 5.3 起)的日期

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(旁白:! 用于将未指定的值重置为 Unix 时间戳,即时间为午夜。)


如果您不想(或不能)使用 PHP 5.3,那么在Date Formats 手册页上列出了 strtotime 接受的可用日期/时间格式的完整列表。该页面更全面地描述了 m/d/Y 被推断为 d/m/Y 的事实(但您可以,如这里的答案中所述,使用 d-m-Yd.m.Yd\tm\tY)。


过去,我还求助于另一个答案中提到的快速str_replace,以及将日期字符串自解析为另一种格式,例如

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

【讨论】:

    【解决方案3】:

    这是解决许多问题的好方法:

    function datetotime ($date, $format = 'YYYY-MM-DD') {
    
        if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
        if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
        if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);
    
        if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
        if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
        if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);
    
        if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
        if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
        if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);
    
        return mktime(0, 0, 0, $month, $day, $year);
    
    }
    

    【讨论】:

      【解决方案4】:

      来自 STRTOTIME 文章 注意:

      m/d/y 或 d-m-y 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜线 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 d-m-y 格式。

      就这么简单。

      【讨论】:

      • 我们可以实现它,因为它们不会给出错误,但是当我检查 $t$t1 时显示不同的结果。我是这样检查的。 $t=strtotime(date('d-m-Y'));$t1=strtotime(date('m/d/Y'));
      【解决方案5】:

      $srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

      这对你有用。 您将字符串转换为自定义日期格式,您可以在其中指定给 PHP 的字符串的原始格式是什么。 现在它是日期格式,您可以将其转换为 PHP 的默认日期格式,这与 MySQL 使用的相同。

      【讨论】:

      • 最干净最好的解决方案
      【解决方案6】:

      应该是最快的

      false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))
      

      如果格式看起来不正确,这将返回 false,但它不会检查日期是否有效

      【讨论】:

        【解决方案7】:

        我尝试将 ddmmyy 格式转换为 date("Y-m-d" 格式,但是当我直接传递 ddmmyy =date('dmy') 时不起作用

        然后意识到它必须是 yyyy-mm-dd 格式。使用子串来组织

        $strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  
        

        然后传递给date("Y-m-d",strtotime($strParam));

        成功了!

        【讨论】:

          【解决方案8】:

          我还没有找到更好的解决方案。你可以使用explode()preg_match_all()等。

          我有一个像这样的静态辅助函数

          class Date {
          
              public static function ausStrToTime($str) {
                  $dateTokens = explode('/', $str);
                  return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 
          
              }
          
          }
          

          可能有一个更好的名称,但我使用ausStrToTime(),因为它适用于澳大利亚日期(我经常处理,作为澳大利亚人)。更好的名称可能是标准化名称,但我不确定那是什么。

          【讨论】:

            【解决方案9】:

            您是否从数据库中获取此值?如果是这样,请考虑在数据库中对其进行格式化(例如,在 mysql 中使用 date_format)。如果不是,那么爆炸值可能是最好的选择,因为 strtotime 似乎并不欣赏 dd/mm/yyyy 值。

            【讨论】:

              【解决方案10】:

              如果你知道它在 dd/mm/YYYY 中,你可以这样做:

                  $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
                  $match = array();
                  if (preg_match($regex, $date, $match)) {
                      if (strlen($match[3]) == 2) {
                          $match[3] = '20' . $match[3];
                      }
                      return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
                  }
                  return strtotime($date);
              

              它将匹配 d/m/YY 或 dd/mm/YYYY(或两者的任意组合)形式的日期...

              如果您想支持更多的分隔符而不仅仅是 /,您可以将正则表达式更改为:

                  $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';
              

              然后将您想要的任何字符添加到[/-] 位(注意,- 字符必须放在最后)

              【讨论】:

              • 当然,您的正则表达式应该使用\d 表示十进制数字,而不是[/d] 表示正斜杠或d 字符
              【解决方案11】:

              这种解决方法比explode更简单、更优雅:

              $my_date = str_replace("/", ".", $my_date);
              $my_date = strtotime($my_date);
              $my_date = date("Y-m-d", $my_date);
              

              您不必知道获取日期的格式,但如果它带有斜杠,它们将被替换为句号,并且它被 strtotime 视为欧洲。

              【讨论】:

                【解决方案12】:

                就这么简单

                date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
                

                【讨论】:

                  【解决方案13】:

                  最简单的解决办法是这样的:

                  $date    = '07/28/2010';
                  $newdate = date('Y-m-d', strtotime($date));
                  

                  【讨论】:

                  • 这是错误的。该问题与 dd/mm/yyyy 输入明确相关。
                  【解决方案14】:

                  这是我正在使用的解决方案,即使有前导零。

                  <?php
                   $date = '05/05/2017';
                   $date = str_replace('/', '-', $date);
                   $date = date('Y-m-d', strtotime($date));
                  
                   echo $date;
                  ?>
                  

                  【讨论】:

                    【解决方案15】:

                    $date_info = '20/02/2019'; echo date('Y-m-d', strtotime(str_replace('/', '-', $date_info) ));

                    【讨论】:

                      【解决方案16】:

                      如果没有任何效果,试试这个。

                      $date = '25/05/2010'; //dd/mm/YYYY
                      $dateAr = explode('/',);
                      $date = $dateAr[2].'-'.$dateAr[1].'-'.$dateAr[0]; //YYYY-mm-dd
                      

                      【讨论】:

                        【解决方案17】:
                        {{ date('d F Y',strtotime($a->dates)) }}
                        

                        替代使用 laravel

                        \Carbon\Carbon::parse($a->dates)->format('d F Y') }}
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-01-24
                          • 1970-01-01
                          • 2015-09-25
                          • 2016-01-02
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-08-31
                          相关资源
                          最近更新 更多