PHP Timestamp เป็น DateTime


94

คุณรู้หรือไม่ว่าฉันจะแปลงค่านี้เป็น strtotime หรือค่าประเภทเดียวกันเพื่อส่งผ่านไปยังวัตถุDateTime ได้อย่างไร

วันที่ฉันมี:

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

สิ่งที่ฉันได้ลอง:

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

ข้างต้นไม่ถูกต้อง ถ้าฉันวนซ้ำวันที่ต่างๆมากมายมันจะเป็นวันเดียวกันทั้งหมด

คำตอบ:


164

คุณไม่จำเป็นต้องเปลี่ยนสตริงให้เป็นการประทับเวลาเพื่อสร้างDateTimeออบเจ็กต์ (อันที่จริงตัวสร้างของมันไม่อนุญาตให้คุณทำสิ่งนี้ด้วยซ้ำอย่างที่คุณบอก) คุณสามารถป้อนสตริงวันที่ของคุณลงในตัวDateTimeสร้างตามที่เป็น:

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

ดังที่กล่าวไว้หากคุณมีการประทับเวลาที่ต้องการใช้แทนสตริงคุณสามารถทำได้โดยใช้DateTime::setTimestamp():

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

แก้ไข (2014-05-07):

ที่จริงผมก็ไม่ได้ตระหนักถึงเรื่องนี้ในเวลานั้น แต่DateTimeคอนสตรัคไม่สนับสนุนการสร้างอินสแตนซ์โดยตรงจากการประทับเวลา ตามเอกสารนี้สิ่งที่คุณต้องทำคือนำหน้าเวลาประทับด้วย@อักขระ:

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

ใช้งานได้ดี เคยลองมาแล้ว แต่ต้องให้โอกาสไม่มากพอ !!! ขอบคุณ :))
JREAM

18
โปรดทราบว่าnew DateTime('@' . $timestamp) และ$dt = new DateTime(); $dt->setTimestamp($timestamp)อย่าจัดการกับเขตเวลาในลักษณะเดียวกัน ดูคำตอบของฉัน @ stackoverflow.com/questions/12038558/…สำหรับรายละเอียดเพิ่มเติม
John Slegers

42

แม้ว่า@drrcknlsnจะถูกต้องในการยืนยันว่ามีหลายวิธีในการแปลงสตริงเวลาเป็นเวลาข้อมูล แต่สิ่งสำคัญคือต้องตระหนักว่าวิธีต่างๆเหล่านี้ไม่ได้จัดการกับเขตเวลาในลักษณะเดียวกัน


ตัวเลือกที่ 1 : DateTime('@' . $timestamp)

พิจารณารหัสต่อไปนี้:

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

strtotimeบิตช่วยขจัดข้อมูลโซนเวลาและdate_createฟังก์ชั่นถือว่า GMT ( Europe/Brussels)

ดังนั้นผลลัพธ์จะเป็นดังต่อไปนี้ไม่ว่าฉันจะรันบนเซิร์ฟเวอร์ใด:

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

ทางเลือกที่ 2: date_create()->setTimestamp($timestamp)

พิจารณารหัสต่อไปนี้:

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

คุณอาจคาดหวังว่าสิ่งนี้จะให้ผลลัพธ์เดียวกัน อย่างไรก็ตามหากฉันรันโค้ดนี้จากเซิร์ฟเวอร์เบลเยียมฉันจะได้ผลลัพธ์ดังต่อไปนี้:

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

ซึ่งแตกต่างจากdate_createฟังก์ชันsetTimestampวิธีนี้จะถือว่าเขตเวลาของเซิร์ฟเวอร์ ( 'Europe/Brussels'ในกรณีของฉัน) แทนที่จะเป็น GMT


กำหนดเขตเวลาของคุณอย่างชัดเจน

หากคุณต้องการตรวจสอบให้แน่ใจว่าเอาต์พุตของคุณตรงกับเขตเวลาของข้อมูลที่คุณป้อนคุณควรตั้งค่าอย่างชัดเจน

พิจารณารหัสต่อไปนี้:

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

ตอนนี้ให้พิจารณารหัสต่อไปนี้:

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

เนื่องจากเรากำหนดเขตเวลาของเอาต์พุตให้ตรงกับอินพุตอย่างชัดเจนทั้งสองจะสร้างเอาต์พุต (ที่ถูกต้อง) เดียวกัน:

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

27

อาจเป็นทางออกที่ง่ายที่สุดคือ:

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

โดยที่ 'U' หมายถึง Unix epoch ดูเอกสาร: http://php.net/manual/en/datetime.createfromformat.php


2
วิธีนี้ไม่สนใจเขตเวลาด้วย
Bouke Versteegh

2
@BoukeVersteegh และอันไหนไม่?
forsberg

2
@BoukeVersteegh นี่คือการประทับเวลา Unix !, มันช่วยให้คุณจากปัญหาเขตเวลาขณะที่การสร้างวัตถุ เพียงใช้->setTimezoneเพื่อกำหนดเขตเวลาที่ต้องการก่อนโทร->format()
Accountant م

1
@BoukeVersteegh ตรวจสอบบันทึกย่อนี้จากคู่มือ PHP "พารามิเตอร์ $ timezone และเขตเวลาปัจจุบันจะถูกละเว้นเมื่อพารามิเตอร์ $ time คือการประทับเวลา UNIX (เช่น @ 946684800) หรือระบุเขตเวลา (เช่น 2010-01-28T15: 00: 00 + 02: 00). "
นักบัญชีم

1
การประทับเวลา Unix ไม่มีเขตเวลาเป็น UTC ตามคำจำกัดความเสมอ
the_nuts

0

มันคือทางออกของฉัน:

    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);
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.