Hãy nhận biết rằng chuyển đổi khoảng thời gian có chứa Ngày, Tháng, và/hoặc năm vào một thời gian như giây không thể được thực hiện một cách chính xác mà không biết ngày/giờ bắt đầu thực tế.
Ví dụ
1 SEP 2010: +P1M2D means +2764800 seconds
1 OCT 2010: +P1M2D means +2851200 seconds
Đó là bởi vì tháng chín có 30 ngày và tháng Mười có 31 ngày. Cùng một vấn đề xảy ra với việc chuyển đổi khoảng thời gian năm, bởi vì năm nhuận và bước nhảy vọt. Leap-năm giới thiệu phức tạp hơn nữa để chuyển đổi tháng là tốt - kể từ tháng Hai là một ngày dài hơn trong năm nhuận hơn là nếu không. Ngày có vấn đề ở những khu vực mà thời gian tiết kiệm ánh sáng ban ngày được thực hiện - một khoảng thời gian một ngày xảy ra trong quá trình chuyển đổi DST, thực sự dài hơn 1 giờ so với thời gian khác.
Tất cả những gì được nói - tất nhiên, bạn có thể nén các giá trị chứa chỉ Giờ, Phút và Giây vào giá trị chỉ chứa Giây. Tôi khuyên bạn nên xây dựng một trình phân tích cú pháp đơn giản để thực hiện công việc (hoặc có thể xem xét một biểu thức chính quy).
Chỉ cần lưu ý những cạm bẫy được nêu ở trên - có con rồng. Nếu bạn có ý định đối phó với Ngày, Tháng và/hoặc Năm, bạn cần phải sử dụng một trong các cơ chế tích hợp để thực hiện phép tính cho bạn trong ngữ cảnh của một ngày/giờ đã biết. Như những người khác đã đề cập: lớp DateInterval, kết hợp với các hàm được cung cấp trong lớp DateTime có lẽ là cách trực quan nhất để giải quyết vấn đề này. Nhưng điều đó chỉ có sẵn trong phiên bản PHP 5.3.0 trở lên.
Nếu bạn phải làm việc với ít hơn v5.3.0, bạn có thể cố gắng xây dựng một cái gì đó xung quanh đá quý này chút:
$startDateTime = '19700101UTC';
$duration = strtotime($startDateTime.'+1Year1Day1Second') - strtotime($startDateTime);
print("Duration in Seconds: $duration");
strtotime
sẽ không làm việc với các định dạng ISO 8601 trực tiếp (ví dụ P1Y1DT1S
.) , nhưng định dạng mà nó không hiểu (1Year1Day1Second
) không phải là quá xa - nó sẽ là một chuyển đổi khá thẳng về phía trước. (một chút "hacky" ... nhưng đó là PHP cho bạn).
chúc may mắn!
Phạt cảnh cáo rất muộn ... chuyển đổi P1MT đến giây sẽ không thể trừ khi bạn biết liệu bạn đang chuyển đổi một tháng với 28, 29, 30, hoặc 31 ngày. Đối với vấn đề đó, bạn thậm chí không thể chuyển đổi P1YT thành 365 ngày mà không bị sai một năm trong bốn. (Có một lý do tại sao khoảng thời gian không được chỉ định trong ngày hoặc giây trong tiêu chuẩn.) – Bevan
@Bevan: Câu trả lời của Lee đi vào chi tiết với điều này. TL; DR: bạn cần một ngày bắt đầu. – berkes
Ahh - cảm ơn @berkes, tôi đã bỏ lỡ khi lướt qua trang (tôi đã tìm thấy nó khi đang tìm kiếm thứ gì đó không liên quan). – Bevan