ฉันจะแปลงวันที่เวลาเป็น ISO 8601 ใน PHP ได้อย่างไร


107

ฉันจะแปลงเวลาจาก2010-12-30 23:21:46รูปแบบวันที่ ISO 8601 ได้อย่างไร (-_-;)


1
@Gordon ใช่ฉันได้ผลลัพธ์ 4,530 รายการและฉันพบคำตอบจาก @alex
ว้าว

@wow โปรดชี้ให้เห็นว่าเหตุใดจึงไม่มีผลการค้นหา 4530 ข้อใดตอบคำถามของคุณ
Gordon

1
@ Gordon ฉันยังคงเรียนรู้วิธีการเขียนจาก A ถึง Z แต่ฉันพบว่าพวกเขาสอนวิธีเขียนจาก Z ถึง A :)
ว้าว

@wow No. พวกเขาสอนวิธีเขียนตัวอักษร ($ from, $ to) เกือบทั้งหมดบอกให้คุณใช้date($format, strtotime($dateString))หรือDateTimeเทียบเท่าวัตถุ ซึ่งแตกต่างกันในการป้อนข้อมูลไปยังฟังก์ชันเหล่านั้นเท่านั้น สิ่งที่คุณต้องทำคือไปที่หน้าที่แก้ไขในคู่มือ PHPและค้นหาว่าอินพุตคืออะไร
Gordon

3
@ กอร์ดอนใช่คุณถูกต้อง ฉันเพิ่งรู้อักษรและตอนนี้สะกดเวลาผึ้ง หวังว่าฉันจะอยู่ในโรงเรียนที่ถูกต้อง
ว้าว

คำตอบ:


234

เชิงวัตถุ

นี่คือวิธีที่แนะนำ

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DateTime::ATOM); // Updated ISO8601

ขั้นตอน

สำหรับ PHP เวอร์ชันเก่าหรือหากคุณพอใจกับโค้ดขั้นตอนมากกว่า

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));

3
คำถามผลลัพธ์คือ2010-12-30T23:21:46+1100จะทำให้เป็น2010-12-30T23:21:46+11:00อย่างไร?
ว้าว

2
@ ว้าวลองดูpreg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100')สิ 2010-12-30T23:21:46+11:00มันออก
alex


12
date('c', strtotime('2010-12-30 23:21:46'))nice @Gordon :)
ว้าว

8
ฉันจะทราบว่าการใช้DATE_ISO8601สร้างสตริงวันที่ซึ่งแตกต่างจาก ISO8601 เล็กน้อย (โคลอนขาดหายไปใน TZ, ISO8601 คาดว่าเวลาจะเป็นทั้งหมดด้วยหรือทั้งหมดโดยไม่มีโคลอนไม่ใช่ส่วนผสม) - date('c')สร้างวันที่ที่ถูกต้อง ISO 8601 ที่เข้มงวด - อาจทำให้ยากต่อการติดตามจุดบกพร่องหากโค้ดต้องการรูปแบบวันที่และเวลา ISO 8601 ที่เข้มงวด Ref: en.wikipedia.org/wiki/ISO_8601
ckm

39

หลังจาก PHP 5 คุณสามารถใช้สิ่งนี้: echo date("c");รูปแบบวันที่และเวลาที่จัดรูปแบบ ISO 8601

http://ideone.com/nD7piL

หมายเหตุสำหรับความคิดเห็น:

เกี่ยวกับเรื่องนี้±[hh]:[mm], ±[hh][mm], or ±[hh]ทั้งสองของการแสดงออกเหล่านี้เป็นที่ถูกต้องสำหรับเขตเวลาสำหรับรูปแบบพื้นฐาน:

แต่โปรดทราบว่า + 0X: 00 ถูกต้องและ + 0X00 ไม่ถูกต้องสำหรับการใช้งานเพิ่มเติม date("c")ดังนั้นมันจึงดีกว่าที่จะใช้ การอภิปรายที่คล้ายกันที่นี่


1
สังเกตความแตกต่างเล็กน้อยด้วยDATE_ISO8601; +0X:00เทียบกับ+0X00.
Ja͢ck

@ Ja͢ckต้องการการลงคะแนนหรือไม่? ความแตกต่างเล็กน้อยมักเป็นความคิดที่ไม่ดี
rybo111

@ rybo111 ฉันไม่เห็นเหตุผลที่จะลงคะแนนคำตอบนี้ ในทางเทคนิคทั้งสอง'c'และDATE_ISO8601สร้างการแสดงเวลา ISO8601 ที่ถูกต้อง
Ja͢ck

ฉันเพิ่มบันทึกเพื่อตอบ
trante

@ Ja͢ck DATE_ISO8601ไม่ได้สร้างการแสดง ISO8601 ที่ถูกต้อง DATE_ATOM ทำ
กัปตันเห็นได้ชัด

5

วิธีการแปลง ISO 8601 เป็น unixtimestamp:

strtotime('2012-01-18T11:45:00+01:00');
// Output : 1326883500

วิธีการแปลงจาก unixtimestamp เป็น ISO 8601 (เซิร์ฟเวอร์เขตเวลา):

date_format(date_timestamp_set(new DateTime(), 1326883500), 'c');
// Output : 2012-01-18T11:45:00+01:00

วิธีแปลงจาก unixtimestamp เป็น ISO 8601 (GMT):

date_format(date_create('@'. 1326883500), 'c') . "\n";
// Output : 2012-01-18T10:45:00+00:00

วิธีแปลงจาก unixtimestamp เป็น ISO 8601 (เขตเวลาที่กำหนดเอง):

date_format(date_timestamp_set(new DateTime(), 1326883500)->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2012-01-18T05:45:00-05:00


1

หากคุณลองตั้งค่าเป็นวันที่และเวลาท้องถิ่น

date("Y-m-d\TH:i",strtotime('2010-12-30 23:21:46'));

//output : 2010-12-30T23:21

วิธีแก้ปัญหาที่คล้ายกันกล่าวถึงในความคิดเห็นที่ให้ไว้กับคำตอบที่ยอมรับ
sushant047

0

คุณสามารถลองวิธีนี้:

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DATE_ATOM);

ใช้DATE_ATOMและcโพสต์ไว้แล้วในหน้านี้เมื่อหลายปีก่อน
mickmackusa

@mickmackusa ฉันแก้ไขคำตอบของฉัน
Dmitry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.