แม้ว่า@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