PHP'de bir tarih biçimini diğerine dönüştürme


336

PHP'de bir tarih biçimini başka bir tarih biçimine dönüştürmenin basit bir yolu var mı?

Bu bende var:

$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

Ama tabii ki çatlak şafak yerine güncel bir tarih dönmek istiyorum. Neyi yanlış yapıyorum?



Yanıtlar:


293

İkinci parametrenin date()uygun bir zaman damgası olması gerekir (1 Ocak 1970'ten bu yana saniye). Date () öğesinin tanıyamayacağı bir dize geçiriyorsunuz.

Tarih dizesini zaman damgasına dönüştürmek için strtotime () kullanabilirsiniz . Ancak, strtotime () bile y-m-d-h-i-sbiçimi tanımıyor .

PHP 5.3 ve üstü

Kullanın DateTime::createFromFormat. date()Gelen dize tarihlerini ile ayrıştırmak için sözdizimini kullanarak tam bir maske belirlemenizi sağlar .

PHP 5.2 ve altı

Elemanları (yıl, ay, gün, saat, dakika, saniye) elle kullanarak ayrıştırmanız substr()ve sonuçlarısize bir zaman damgası oluşturacak mktime () öğesine göndermeniz gerekir .

Ama bu çok iş! Strftime () 'in anlayabileceği farklı bir biçim kullanmanızı öneririm. strftime () anlayan herhangi bir tarih giriş eteğine the next time joe will slip on the ice. örneğin, bu işe yarar:

$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);   

Teşekkürler Pekka, sorumu düzenledi, bunu denedi ama işe yaramıyor gibi görünüyor.
Tom

Cevabı siz kabul ederken düzenledim :) Daha fazla örnek ve referans ekledim.
Pekka

Yakaladım, gerçekten sorun bu. Bir tarihe geri dönüştürmem gereken sabit bir dosya adı (bu formatta olması gerekir), bu yüzden bir geçici çözüm bulacağım.
Tom

Not: php.net'e göre DateTimePHP çekirdeğinde PHP 5.2 mevcut olduğundan ve DateTimePHP 5.1 için derleme sırasında deneysel destek etkinleştirilebilir. secure.php.net/manual/tr/datetime.installation.php
Charlotte Dunois

108

Bunu yapmanın en kolay yolu

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

İlk olarak $ dateString'in içinde olduğu formatı veriyorsunuz. O zaman $ newDateString'in olmasını istediğiniz formatı söylüyorsunuz.

Bu, zaman zaman çalışmak zor olabilecek strtotime kullanımını da önler.

Bir tarih biçiminden diğerine dönüştürmüyorsanız, ancak geçerli tarihi (veya tarih saatini) belirli bir biçimde istiyorsanız, o zaman daha da kolaydır:

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

Bu diğer soru aynı konuyu da ifade eder: Tarih biçimini dönüştürme yyyy-aa-gg => gg-aa-yyyy .


Ve bahsettiğiniz sorudan önce soruyu sorduğumda nasıl bir kopya var?
Tom

1
Yanıtı düzenledim. Sadece bu iki sorunun bir şekilde bağlantılı olması gerektiğini belirtmek istedim.
ceiroa

php 5.3+ üzerinde mevcut
Zorox

$timestring = $now->format('Y-m-d h:i:s');Mutlaka? dakika m, idakika
Mark Baker


53

Temeller

Bir tarih biçimini diğerine dönüştürmenin basit yoluyla strtotime()birlikte kullanmaktır date(). strtotime()tarihi bir Unix Zaman Damgasına dönüştürür . Bu Unix Zaman Damgası daha sonra date()yeni biçime dönüştürmek için geçirilebilir .

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

Veya tek astar olarak:

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

strtotime()Tarihin geçerli bir biçimde olmasını gerektirdiğini unutmayın . Geçerli bir biçim sağlanmaması strtotime(), tarihin 1969-12-31 olmasına neden olacak şekilde yanlış döndürülmesine neden olur.

kullanma DateTime()

PHP 5.2'den itibaren, PHP DateTime()bize tarihlerle (ve saatlerle) çalışmak için daha güçlü araçlar sunan sınıfı sundu . Yukarıdaki kodu şu şekilde kullanarak yeniden yazabiliriz DateTime():

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

Unix zaman damgalarıyla çalışma

date() Unix zaman damgasını ikinci parametresi olarak alır ve sizin için biçimlendirilmiş bir tarih döndürür:

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

DateTime () @, zaman damgasından önce bir ekleyerek Unix zaman damgalarıyla çalışır :

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

Sahip olduğunuz zaman damgası milisaniyedir (bitebilir 000ve / veya zaman damgası on üç karakter uzunluğundaysa), başka bir biçime dönüştürebilmeniz için saniyeye dönüştürmeniz gerekir. Bunu yapmanın iki yolu vardır:

  • Kullanarak son üç basamağı kesin substr()

Son üç basamağı kırpmak birkaç yolla elde edilebilir, ancak substr()kullanımı en kolay olanıdır:

$timestamp = substr('1234567899000', -3);
  • Substr'yi 1000'e bölün

Ayrıca zaman damgasını 1000'e bölerek saniyeye dönüştürebilirsiniz. Zaman damgası, 32 bit sistemlerde matematik yapmak için çok büyük olduğundan , matematik dizeler olarak yapmak için BCMath kitaplığını kullanmanız gerekir :

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

Unix Zaman Damgası almak için bir Unix Zaman Damgası strtotime()döndüren şunu kullanabilirsiniz :

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

DateTime () ile şunları kullanabilirsiniz: DateTime::getTimestamp()

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

PHP 5.2 çalıştırıyorsanız Ubunun yerine biçimlendirme seçeneğini kullanabilirsiniz :

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

Standart olmayan ve belirsiz tarih biçimleriyle çalışma

Ne yazık ki bir geliştiricinin birlikte çalışması gereken tüm tarihler standart biçimde değildir. Neyse ki PHP 5.3 bize bunun için bir çözüm sundu. DateTime::createFromFormat()PHP'ye bir tarih dizesinin hangi formatta olduğunu söylememizi sağlar, böylece daha fazla manipülasyon için bir DateTime nesnesine başarıyla ayrıştırılabilir.

$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'te, DateTime()kodumuzu tek satırlı hale getirmemize izin veren örnekleme üzerinde sınıf üyesi erişimi yapma becerisi kazandık :

$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');

27

Bunu dene:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));

Çalışmaz, strtotime () biçimi tanımıyor. Denedim.
Pekka

kabul etti, ben sadece sorgulayıcıdan biçim kodunu koymak, belirtilen uygun format olmalıdır.
Sarfraz

Benim için çalıştı. Benim $ old_date böyle bir şeydi 2012-05-22T19: 16: 37 + 01: 00. Bu arada teşekkürler!
VishwaKumar

15

Dönüştürmek için $dategelen dd-mm-yyyy hh:mm:ssböyle gitmek uygun bir MySQL datetime:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');

4
$ Tarihinin geçerli bir tarih olduğundan ve formata uyduğundan% 110 emin olmadığınız sürece bu yöntemleri zincirlememelisiniz. O varlık sözlerimle, tam formatına uymayan geçersiz bir tarih döndürür: Fatal error: Call to a member function format() on a non-object. Sadece aklınızda bulunsun!
Yarım Çılgın

Doğru, daha iyi bir çözüm, orta adım olarak null bir kontrolle 3 adımda yapmaktır.
Jelle de Fries

11

Aşağıdaki, tarihleri ​​farklı biçimlere dönüştürmek için kolay bir yöntemdir.

// 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";

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

burada yanlış yapıyorsun, bu olmalı

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

zaman ayırıcısı ':'


Bunun yardımcı olacağını düşünüyorum ...

$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); 

VEYA


$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); 

Evet, kesinlikle teşekkürler, uygun bir tarih biçimine dönüştürmek istediğim bir GUID dosya adı.
Tom

8

Bu yerel yol, girilen herhangi bir formatı istenen formata dönüştürmeye yardımcı olacaktır.

$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);

7

Date işlevi ikinci bağımsız değişkeni olarak bir zaman damgası gerektirdiğinden , $ old_date öğesini tekrar zaman damgasına dönüştürmeniz gerekir .


7

strtotime bunu halledecek. tarihler aynı değil ve hepsi bize formatında.

<?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";
?>

5

Bunu dene:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];

5

Bu benim için çözüldü,

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

Çıktı: 2018-04-18


2

Tarih biçimini dönüştürmenin diğer yolu budur

 <?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'; ?>

1

Sadece dizeleri kullanmak, benim için iyi bir çözüm, mysql ile daha az sorun. Geçerli biçimi algılar ve gerekirse değiştirir, bu çözüm php datetime işlevini kullanmadan yalnızca İspanyolca / Fransızca biçimi ve İngilizce biçimi içindir.

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;
 }

KULLANIM

dateTranslator::translate($date, 'en')

1

Bunun eski olduğunu biliyorum, ancak API'larında tutarsız bir şekilde 5 farklı tarih biçimi kullanan bir satıcıya girerken (ve 5'lerden en son 7'lere kadar çeşitli PHP sürümlerine sahip test sunucuları), evrensel bir dönüştürücü yazmaya karar verdim. sayısız PHP sürümü ile çalışır.

Bu dönüştürücü, herhangi bir standart tarih / saat biçimi (milisaniye olsun veya olmasın dahil) dahil olmak üzere neredeyse tüm girişleri alır ve herhangi bir Epoch Time gösterimi ( ve neredeyse başka bir formata dönüştürür.

Aramak için:

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

Biçim için null değeri göndermek, işlevin Epoch / Unix Time'da tarih saatini döndürmesini sağlar. Aksi takdirde, date () 'nin desteklediği herhangi bir format dizesini ve milisaniye için ".u" ile gönderin (date () sıfırları döndürse bile milisaniyeyi de işliyorum).

İşte kod:

        <?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;    
        }
    ?>

İşte bazı örnek çağrılar - bunun ayrıca herhangi bir saat dilimi verisini de işlediğini göreceksiniz (yukarıda belirtildiği gibi, GMT olmayan herhangi bir saat, saat diliminizde döndürülür).

        $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>";

İşte çıktı:

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

Bu sürümde olmayan tek şey, döndürülen datetime içinde olmasını istediğiniz saat dilimini seçme yeteneğidir. Aslında, bunu herhangi bir datetime'ı Epoch Time'a değiştirmek için yazdım, bu yüzden zaman dilimi desteğine ihtiyacım yoktu. Yine de eklemek önemsiz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.