DateTime'a PHP Zaman Damgası


94

Bunu bir strtotime'a veya benzer türde bir değere DateTime nesnesine geçirmek için nasıl dönüştürebileceğimi biliyor musunuz ?

Sahip olduğum tarih:

Mon, 12 Dec 2011 21:17:52 +0000

Ne denedim:

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

Yukarıdakiler doğru değil. Birçok farklı tarih arasında döngü yaparsam, hepsi aynı tarih olur.

Yanıtlar:


164

DateTimeNesneyi oluşturmak için dizeyi bir zaman damgasına dönüştürmenize gerek yoktur (aslında, yapıcısı sizin de söyleyebileceğiniz gibi bunu yapmanıza bile izin vermez). Tarih dizenizi yapıcıya olduğu DateTimegibi besleyebilirsiniz :

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

Bununla birlikte, bir dize yerine kullanmak istediğiniz bir zaman damganız varsa, bunu kullanarak yapabilirsiniz DateTime::setTimestamp():

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

Düzenleme (2014-05-07):

Aslında anda bunun farkında değildi, ama DateTimeyapıcı yapar damgaları doğrudan destek oluşturma örneklerini. Bu belgelere göre , yapmanız gereken tek şey zaman damgasını bir @karakterle başa koymaktır :

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);

Bu harika çalışıyor. Bunu daha önce denedim ama yeterince şans vermemiş olmalıyım !!! teşekkürler :))
JREAM

18
Bunu unutmayın new DateTime('@' . $timestamp) ve $dt = new DateTime(); $dt->setTimestamp($timestamp)saat dilimleriyle aynı şekilde ilgilenmeyin. Daha fazla ayrıntı için cevabıma bakın @ stackoverflow.com/questions/12038558/…
John Slegers

42

@Drrcknlsn , bir zaman dizesini bir veri zamanına dönüştürmenin birden fazla yolu olduğunu iddia etmek için doğru olsa da , bu farklı yolların saat dilimlerini aynı şekilde ele almadığını anlamak önemlidir.


Seçenek 1 : DateTime('@' . $timestamp)

Aşağıdaki kodu göz önünde bulundurun:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

strtotimeBit saat dilimi bilgilerini ortadan kaldırır ve date_createfonksiyon GMT varsayar ( Europe/Brussels).

Bu nedenle, hangi sunucuda çalıştırdığım önemli değil, çıktı aşağıdaki gibi olacaktır:

2011-12-12T13:17:52+00:00

Seçenek 2 : date_create()->setTimestamp($timestamp)

Aşağıdaki kodu göz önünde bulundurun:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

Bunun aynı çıktıyı üretmesini bekleyebilirsiniz. Ancak, bu kodu bir Belçika sunucusundan çalıştırırsam, aşağıdaki çıktıyı alırım:

2011-12-12T14:17:52+01:00

date_createİşlevin aksine, setTimestampyöntem 'Europe/Brussels'GMT yerine sunucunun saat dilimini ( benim durumumda) varsayar .


Saat diliminizi açıkça belirleme

Çıktınızın girişinizin saat dilimiyle eşleştiğinden emin olmak istiyorsanız, en iyisi bunu açıkça ayarlamaktır.

Aşağıdaki kodu göz önünde bulundurun:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

Şimdi, aşağıdaki kodu da göz önünde bulundurun:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

Çıktının saat dilimini girdininkiyle eşleşecek şekilde açıkça ayarladığımız için, her ikisi de aynı (doğru) çıktıyı yaratacaktır:

2011-12-12T21:17:52+08:00

27

Muhtemelen en basit çözüm şudur:

DateTime::createFromFormat('U', $timeStamp);

"U", Unix dönemi anlamına gelir. Dokümanlara bakın: http://php.net/manual/en/datetime.createfromformat.php


2
Bu yöntem aynı zamanda saat dilimini de yok sayar
Bouke Versteegh

2
@BoukeVersteegh ve hangisi yok?
forsberg

2
@BoukeVersteegh Bu bir Unix zaman damgasıdır! Nesneyi oluştururken sizi zaman dilimleri sorunlarından kurtarır . ->setTimezonearamadan önce tercih edilen saat dilimini ayarlamak için tuşunu kullanın->format()
Muhasebeci م

1
@BoukeVersteegh PHP kılavuzundaki bu büyük nota bakın "$ timezone parametresi ve geçerli saat dilimi, $ time parametresi bir UNIX zaman damgası olduğunda (örn. @ 946684800) veya bir saat dilimi belirttiğinde (örn. 2010-01-28T15: 00: 00 + 02: 00). "
Muhasebeci,

1
Unix zaman damgalarının saat dilimleri yoktur, bunlar her zaman tanımı gereği
UTC'dir

0

bu benim çözümüm:

    function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s")
    {
        $date = new DateTime($date, new DateTimeZone($from));
        $date->setTimeZone(new DateTimeZone($to));
        return $date->format($targetFormat);
    }
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.