代码之家  ›  专栏  ›  技术社区  ›  Tom

用PHP将一种日期格式转换为另一种日期格式

  •  297
  • Tom  · 技术社区  · 14 年前

    有没有一种简单的方法可以在PHP中将一种日期格式转换为另一种日期格式?

    我有这个:

    $old_date = date('y-m-d-h-i-s');            // works
    
    $middle = strtotime($old_date);             // returns bool(false)
    
    $new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00
    

    但我当然希望它能返回当前日期,而不是黎明时分。我做错什么了?

    15 回复  |  直到 5 年前
        1
  •  267
  •   Pekka    14 年前

    的第二个参数 date() 需要是一个适当的时间戳(从1970年1月1日起的秒数)。您正在传递一个日期()无法识别的字符串。

    你可以使用 strtotime() 将日期字符串转换为时间戳。但是,即使strtotime()也无法识别 y-m-d-h-i-s 格式。

    php 5.3及以上

    使用 DateTime::createFromFormat . 它允许您使用 数据() 语法-解析传入的字符串日期。

    php 5.2及以下

    您必须手动使用 substr() 把结果交给 mktime() 这将为您建立一个时间戳。

    但这是一个很大的工作!我建议使用strftime()可以理解的其他格式。strftime()理解 任何 日期输入不足 the next time joe will slip on the ice . 例如,这是可行的:

    $old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
    $old_date_timestamp = strtotime($old_date);
    $new_date = date('Y-m-d H:i:s', $old_date_timestamp);   
    
        2
  •  91
  •   Community holdenweb    7 年前

    最简单的方法是

    $myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
    $newDateString = $myDateTime->format('m/d/Y');
    

    您首先给出$datestring的格式。然后告诉它您希望$newDateString使用的格式。

    这也避免了strtotime的使用,而strtotime有时很难使用。

    如果您不想从一种日期格式转换为另一种日期格式,但只想将当前日期(或日期时间)转换为特定的格式,则更容易:

    $now = new DateTime();
    $timestring = $now->format('Y-m-d h:i:s');
    

    另一个问题也涉及同一主题: Convert date format yyyy-mm-dd => dd-mm-yyyy .

        3
  •  43
  •   John Conde    8 年前

    基础知识

    将一种日期格式转换为另一种日期格式的简单方法是使用 strtotime() 具有 date() . SttoTimes() 将日期转换为 Unix Timestamp . 然后可以将该Unix时间戳传递给 数据() 将其转换为新格式。

    $timestamp = strtotime('2008-07-01T22:35:17.02');
    $new_date_format = date('Y-m-d H:i:s', $timestamp);
    

    或者作为一条直线:

    $new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));
    

    记住 SttoTimes() 要求日期位于 valid format . 未能提供有效的格式将导致 SttoTimes() 返回错误,这将导致你的日期是1969年12月31日。

    使用 DateTime()

    从php 5.2开始,php提供了 DateTime() 类,它为我们提供了更强大的工具来处理日期(和时间)。我们可以用 数据类型() 如此:

    $date = new DateTime('2008-07-01T22:35:17.02');
    $new_date_format = $date->format('Y-m-d H:i:s');
    

    使用Unix时间戳

    数据() 将unix timeatamp作为其第二个参数,并为您返回格式化日期:

    $new_date_format = date('Y-m-d H:i:s', '1234567890');
    

    datetime()通过添加 @ 在时间戳之前:

    $date = new DateTime('@1234567890');
    $new_date_format = $date->format('Y-m-d H:i:s');
    

    如果时间戳以毫秒为单位(它可能以 000 和/或时间戳有13个字符长)您需要将其转换为秒,然后才能将其转换为其他格式。有两种方法可以做到这一点:

    修剪最后三个数字可以通过多种方式实现,但使用 子() 是最简单的:

    $timestamp = substr('1234567899000', -3);
    
    • 将SUBSTR除以1000

    您还可以将时间戳除以1000转换为秒。因为时间戳太大,32位系统无法对其进行数学运算,所以需要使用 BCMath 以字符串形式执行数学运算的库:

    $timestamp = bcdiv('1234567899000', '1000');
    

    要获取UNIX时间戳,可以使用 SttoTimes() 它返回一个Unix时间戳:

    $timestamp = strtotime('1973-04-18');
    

    使用datetime(),可以使用 DateTime::getTimestamp()

    $date = new DateTime('2008-07-01T22:35:17.02');
    $timestamp = $date->getTimestamp();
    

    如果您运行的是php 5.2,那么可以使用 U 改为格式化选项:

    $date = new DateTime('2008-07-01T22:35:17.02');
    $timestamp = $date->format('U');
    

    使用非标准和不明确的日期格式

    不幸的是,并非开发人员必须使用的所有日期都是标准格式。幸运的是,PHP5.3为我们提供了一个解决方案。 DateTime::createFromFormat() 允许我们告诉PHP日期字符串的格式,以便能够成功地将其解析为日期时间对象以进行进一步的操作。

    $date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
    $new_date_format = $date->format('Y-m-d H:i:s');
    

    在php 5.4中,我们获得了在实例化时进行类成员访问的能力,它允许我们 数据类型() 编码为一行:

    $new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');
    
    $new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
    
        4
  •  26
  •   Sarfraz    14 年前

    试试这个:

    $old_date = date('y-m-d-h-i-s');
    $new_date = date('Y-m-d H:i:s', strtotime($old_date));
    
        5
  •  13
  •   alexandre-rousseau Jelle de Fries    7 年前

    皈依 $date dd-mm-yyyy hh:mm:ss 到一个合适的mysql日期时间 我这样走:

    $date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
    
        6
  •  9
  •   Rifat    14 年前
    $old_date = date('y-m-d-h-i-s');       // works
    

    你在这里做错了,应该是

    $old_date = date('y-m-d h:i:s');       // works
    

    时间分隔符是“:”


    我想这会有帮助…

    $old_date = date('y-m-d-h-i-s');              // works
    
    preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
    $out = $out[0];
    $time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);
    
    $new_date = date('Y-m-d H:i:s', $time); 
    


    $old_date = date('y-m-d-h-i-s');              // works
    
    $out = explode('-', $old_date);
    $time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);
    
    $new_date = date('Y-m-d H:i:s', $time); 
    
        7
  •  9
  •   Peter    6 年前

    下面是将日期转换为不同格式的简单方法。

    // Create a new DateTime object
    $date = DateTime::createFromFormat('Y-m-d', '2016-03-25');
    
    // Output the date in different formats
    echo $date->format('Y-m-d')."\n";
    echo $date->format('d-m-Y')."\n";
    echo $date->format('m-d-Y')."\n";
    
        8
  •  6
  •   John Parker    14 年前

    您需要将$old_日期转换回时间戳,作为 date function 需要时间戳作为第二个参数。

        9
  •  6
  •   de_nuit    11 年前

    strtotime会解决这个问题的。日期不一样,都是美国格式。

    <?php
    $e1 = strtotime("2013-07-22T12:00:03Z");
    echo date('y.m.d H:i', $e1);
    echo "2013-07-22T12:00:03Z";
    
    $e2 = strtotime("2013-07-23T18:18:15Z");
    echo date ('y.m.d H:i', $e2);
    echo "2013-07-23T18:18:15Z";
    
    $e1 = strtotime("2013-07-21T23:57:04Z");
    echo date ('y.m.d H:i', $e2);
    echo "2013-07-21T23:57:04Z";
    ?>
    
        10
  •  4
  •   Pang    7 年前

    试试这个:

    $tempDate = explode('-','03-23-15');
    $date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
    
        11
  •  4
  •   Nishad Up    6 年前

    这种本地方式将有助于将任何输入的格式转换为所需的格式。

    $formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
    $dateInput = '01-02-2018'; //date in above format
    
    $formatOut = 'Y-m-d'; // Your format
    $dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);
    
        12
  •  4
  •   Ashokkumar C Nick Craver    6 年前

    这对我来说解决了,

    $old = '18-04-2018';
    $new = date('Y-m-d', strtotime($old));
    echo $new;
    

    产量:2018-04-18

        13
  •  1
  •   Varun Malhotra    7 年前

    这是另一种转换日期格式的方法

     <?php
    $pastDate = "Tuesday 11th October, 2016";
    $pastDate = str_replace(",","",$pastDate);
    
    $date = new DateTime($pastDate);
    $new_date_format = $date->format('Y-m-d');
    
    echo $new_date_format.' 23:59:59'; ?>
    
        14
  •  0
  •   Alejandro Aranda    7 年前

    只使用字符串,对我来说是一个很好的解决方案,MySQL的问题更少。检测当前格式并在必要时进行更改,此解决方案仅适用于西班牙语/法语格式和英语格式,不使用php datetime函数。

    class dateTranslator {
    
     public static function translate($date, $lang) {
          $divider = '';
    
          if (empty($date)){
               return null;   
          }
          if (strpos($date, '-') !== false) {
               $divider = '-';
          } else if (strpos($date, '/') !== false) {
               $divider = '/';
          }
          //spanish format DD/MM/YYYY hh:mm
          if (strcmp($lang, 'es') == 0) {
    
               $type = explode($divider, $date)[0];
               if (strlen($type) == 4) {
                    $date = self::reverseDate($date,$divider);
               } 
               if (strcmp($divider, '-') == 0) {
                    $date = str_replace("-", "/", $date);
               }
          //english format YYYY-MM-DD hh:mm
          } else {
    
               $type = explode($divider, $date)[0];
               if (strlen($type) == 2) {
    
                    $date = self::reverseDate($date,$divider);
               } 
               if (strcmp($divider, '/') == 0) {
                    $date = str_replace("/", "-", $date);
    
               }   
          }
          return $date;
     }
    
     public static function reverseDate($date) {
          $date2 = explode(' ', $date);
          if (count($date2) == 2) {
               $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1];
          } else {
               $date = implode("-", array_reverse(preg_split("/\D/", $date)));
          }
    
          return $date;
     }
    

    使用

    dateTranslator::translate($date, 'en')
    
        15
  •  0
  •   Robert Mauro    5 年前

    我知道这很古老,但是遇到一个在其API中不一致地使用5种不同日期格式的供应商(以及从5到最新7的各种PHP版本的测试服务器),我决定编写一个通用的转换器来处理大量的PHP版本。

    这个转换器几乎可以接受任何输入,包括任何标准的日期时间格式(包括有或没有毫秒) 任何历元时间表示(包括毫秒或不毫秒),并将其转换为几乎任何其他格式。

    称之为:

    $TheDateTimeIWant=convertAnyDateTome_toMyDateTime([thedateIhave],[theformatIwant]);
    

    为格式发送空值将使函数以epoch/unix时间返回日期时间。否则,发送日期()支持的任何格式字符串,以及用“.u”表示毫秒(我也处理毫秒,即使日期()返回零)。

    代码如下:

            <?php   
            function convertAnyDateTime_toMyDateTime($dttm,$dtFormat)
            {
                if (!isset($dttm))
                {
                    return "";
                }
                $timepieces = array();
                if (is_numeric($dttm))
                {
                    $rettime=$dttm;
                }
                else
                {
                    $rettime=strtotime($dttm);
                    if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))>0)
                    {
                        $rettime=$rettime.substr($dttm,strpos($dttm,"."),strpos($dttm,"-",strpos($dttm,"."))-strpos($dttm,"."));
                        $timepieces[1]="";
                    }
                    else if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))==0)
                    {               
                        preg_match('/([0-9]+)([^0-9]+)/',substr($dttm,strpos($dttm,"."))." ",$timepieces);
                        $rettime=$rettime.".".$timepieces[1];
                    }
                }
    
                if (isset($dtFormat))
                {
                    // RETURN as ANY date format sent
                    if (strpos($dtFormat,".u")>0)       // Deal with milliseconds
                    {
                        $rettime=date($dtFormat,$rettime);              
                        $rettime=substr($rettime,0,strripos($rettime,".")+1).$timepieces[1];                
                    }
                    else                                // NO milliseconds wanted
                    {
                        $rettime=date($dtFormat,$rettime);
                    }
                }
                else
                {
                    // RETURN Epoch Time (do nothing, we already built Epoch Time)          
                }
                return $rettime;    
            }
        ?>
    

    这里有一些示例调用——您会注意到它还处理任何时区数据(尽管如上所述,任何非GMT时间都会在您的时区返回)。

            $utctime1="2018-10-30T06:10:11.2185007-07:00";
            $utctime2="2018-10-30T06:10:11.2185007";
            $utctime3="2018-10-30T06:10:11.2185007 PDT";
            $utctime4="2018-10-30T13:10:11.2185007Z";
            $utctime5="2018-10-30T13:10:11Z";
            $dttm="10/30/2018 09:10:11 AM EST";
    
            echo "<pre>";
            echo "<b>Epoch Time to a standard format</b><br>";
            echo "<br>Epoch Tm: 1540905011    to STD DateTime     ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","Y-m-d H:i:s")."<hr>";
            echo "<br>Epoch Tm: 1540905011          to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","c");
            echo "<br>Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011.2185007","c")."<hr>";
            echo "<b>Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)";
            echo "</b><br>";
            echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,null);
            echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,null);
            echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,null);
            echo "<br>UTCTime4: ".$utctime4."      ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime4,null);
            echo "<br>UTCTime5: ".$utctime5."              ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime5,null);
            echo "<br>NO MILIS: ".$dttm."        ----RESULT: ".convertAnyDateTime_toMyDateTime($dttm,null);
            echo "<hr>";
            echo "<hr>";
            echo "<b>Returned as whatever datetime format one desires</b>";
            echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,"Y-m-d H:i:s")."              Y-m-d H:i:s";
            echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
            echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
            echo "<p><b>Returned as ISO8601</b>";
            echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"c")."        ISO8601";
            echo "</pre>";
    

    输出结果如下:

    Epoch Tm: 1540905011                        ----RESULT: 2018-10-30 09:10:11
    
    Epoch Tm: 1540905011          to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
    Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
    Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)
    
    UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 1540905011.2185007
    UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 1540894211.2185007
    UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 1540905011.2185007
    UTCTime4: 2018-10-30T13:10:11.2185007Z      ----RESULT: 1540905011.2185007
    UTCTime5: 2018-10-30T13:10:11Z              ----RESULT: 1540905011
    NO MILIS: 10/30/2018 09:10:11 AM EST        ----RESULT: 1540908611
    Returned as whatever datetime format one desires
    UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 2018-10-30 09:10:11              Y-m-d H:i:s
    UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 2018-10-30 06:10:11.2185007      Y-m-d H:i:s.u
    UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30 09:10:11.2185007      Y-m-d H:i:s.u
    Returned as ISO8601
    UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30T09:10:11-04:00        ISO8601
    

    此版本中唯一没有的功能是能够选择您希望返回的日期时间所在的时区。最初,我写这个是为了将任何日期时间更改为epoch时间,所以,我不需要时区支持。不过,这是微不足道的。