Mặc dù @drrcknlsn đúng khi khẳng định có nhiều cách để chuyển đổi chuỗi thời gian thành một hệ thống dữ liệu, nhưng điều quan trọng là phải nhận ra rằng những cách khác nhau này không xử lý múi giờ theo cùng một cách.
Lựa chọn 1 : DateTime('@' . $timestamp)
Hãy xem xét đoạn mã sau:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Các strtotime
chút loại bỏ các thông tin múi giờ, và các date_create
chức năng giả GMT ( Europe/Brussels
).
Do đó, đầu ra sẽ như sau, bất kể tôi chạy nó trên máy chủ nào:
2011-12-12T13:17:52+00:00
Lựa chọn 2 : date_create()->setTimestamp($timestamp)
Hãy xem xét đoạn mã sau:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Bạn có thể mong đợi điều này tạo ra cùng một đầu ra. Tuy nhiên, nếu tôi thực thi mã này từ máy chủ của Bỉ, tôi nhận được kết quả sau:
2011-12-12T14:17:52+01:00
Không giống như date_create
hàm, setTimestamp
phương pháp này giả định múi giờ của máy chủ ( 'Europe/Brussels'
trong trường hợp của tôi) chứ không phải GMT.
Đặt múi giờ của bạn một cách rõ ràng
Nếu bạn muốn đảm bảo đầu ra của mình khớp với múi giờ của đầu vào, tốt nhất bạn nên đặt nó một cách rõ ràng.
Hãy xem xét đoạn mã sau:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Bây giờ, hãy xem xét đoạn mã sau:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Bởi vì chúng tôi đặt rõ ràng múi giờ của đầu ra khớp với múi giờ của đầu vào, cả hai sẽ tạo ra cùng một đầu ra (đúng):
2011-12-12T21:17:52+08:00