Làm cách nào để chuyển đổi datetime sang ISO 8601 trong PHP


103

Làm cách nào để chuyển đổi thời gian của tôi từ 2010-12-30 23:21:46định dạng ngày ISO 8601? (-_-;)


1
@Gordon vâng Tôi đã nhận được khoảng 4.530 kết quả và tôi đã tìm thấy câu trả lời từ @alex
wow,

@wow, vui lòng chỉ ra lý do tại sao không có kết quả nào trong số 4530 trả lời câu hỏi của bạn.
Gordon

1
@Gordon Tôi vẫn đang học cách viết từ A đến Z nhưng tôi thấy họ dạy tôi cách viết từ Z đến A :)
wow

@wow Không. Họ dạy bạn cách viết bảng chữ cái ($ from, $ to). Hầu như tất cả chúng đều yêu cầu bạn sử dụng date($format, strtotime($dateString))hoặc DateTimeđối tượng tương đương. Chúng chỉ khác nhau ở đầu vào cho các chức năng đó. Tất cả những gì bạn phải làm là truy cập các trang tương ứng trong Hướng dẫn sử dụng PHP và tìm hiểu đầu vào là gì.
Gordon

3
@Gordon Vâng, bạn có chính xác không. Tôi chỉ biết bảng chữ cái và bây giờ đánh vần con ong. Hy vọng tôi đang học đúng trường.
wow

Câu trả lời:


229

Hướng đối tượng

Đây là cách được khuyến khích.

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

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

Thủ tục

Đối với các phiên bản PHP cũ hơn hoặc nếu bạn cảm thấy thoải mái hơn với mã thủ tục.

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

3
Câu hỏi, đầu ra là 2010-12-30T23:21:46+1100làm thế nào để làm cho nó được 2010-12-30T23:21:46+11:00?
wow,

2
@wow Hãy thử cái này preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Nó xuất ra 2010-12-30T23:21:46+11:00.
alex


12
date('c', strtotime('2010-12-30 23:21:46'))tốt đẹp @Gordon :)
wow

8
Tôi xin lưu ý rằng việc sử dụng DATE_ISO8601tạo ra một chuỗi ngày hơi khác so với ISO8601 (dấu hai chấm bị thiếu trong TZ, ISO8601 mong đợi thời gian là tất cả HOẶC tất cả không có dấu hai chấm, không phải là hỗn hợp) - date('c')không tạo ra ngày hợp lệ ISO 8601 nghiêm ngặt - Điều này có thể gây ra lỗi khó theo dõi nếu mã yêu cầu định dạng ngày giờ ISO 8601 nghiêm ngặt. Tham khảo: en.wikipedia.org/wiki/ISO_8601
ckm

38

Sau PHP 5, bạn có thể sử dụng cái này: echo date("c");mẫu ngày giờ được định dạng ISO 8601.

http://ideone.com/nD7piL

Lưu ý cho nhận xét:

Về đến này , cả hai biểu thức có hiệu lực trong múi giờ, đối với định dạng cơ bản: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Nhưng lưu ý rằng, + 0X: 00 là chính xác và + 0X00 không chính xác cho việc sử dụng kéo dài. Vì vậy, tốt hơn là sử dụng date("c"). Một cuộc thảo luận tương tự ở đây .


1
Lưu ý sự khác biệt nhỏ với DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck

@ Ja͢ck cái này có cần bỏ phiếu không? Một sự khác biệt nhỏ thường là một ý tưởng tồi.
rybo111

@ rybo111 Tôi không thấy lý do gì để bỏ phiếu cho câu trả lời này; về mặt kỹ thuật, cả hai 'c'DATE_ISO8601tạo ra các biểu diễn thời gian ISO8601 hợp lệ.
Ja͢ck

Tôi đã thêm một ghi chú để trả lời.
trante

@ Ja͢ck DATE_ISO8601không tạo ra đại diện ISO8601 hợp lệ. DATE_ATOM mặc dù vậy
Đội trưởng Rõ ràng

3

Làm thế nào để chuyển đổi từ ISO 8601 sang unixtimestamp:

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

Làm thế nào để chuyển đổi từ unixtimestamp sang ISO 8601 (máy chủ múi giờ):

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

Làm thế nào để chuyển đổi từ unixtimestamp sang ISO 8601 (GMT):

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

Làm thế nào để chuyển đổi từ unixtimestamp sang ISO 8601 (múi giờ tùy chỉnh):

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


1

Nếu bạn thử đặt giá trị trong datetime-local

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

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

Giải pháp tương tự được đề cập trong các ý kiến trao cho các câu trả lời được chấp nhận
sushant047
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.