2013-01-11 25 views

Trả lời

22

Có một chức năng format cho việc này. Nhưng nó sẽ không trả về số giây. Để nhận được số giây bạn sử dụng kỹ thuật này

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp()); 

Nếu bạn thực sự muốn sử dụng $interval bạn cần tính toán.

$seconds = $interval->days*86400 + $interval->h*3600 
      + $interval->i*60 + $interval->s; 

Đây

  • 86400 là số giây trong một ngày
  • 3600 là số giây trong một giờ
  • 60 là số giây trong một phút
+0

nó đang trả về '0 giây' – sanchitkhanna26

+0

@MarkBaker có, đó là lý do tại sao tôi đã thay đổi câu trả lời của mình –

+0

Tuyệt vời! Tôi đã làm việc này. Thanks @shiplu – sanchitkhanna26

35

Một cách khác để lấy số giây trong một khoảng thời gian i s để thêm nó vào ngày zero, và nhận được dấu thời gian của ngày đó:

$seconds = date_create('@0')->add($interval)->getTimestamp(); 

Phương pháp này sẽ xử lý khoảng tạo thông qua các contructor DateInterval nhiều hơn hoặc ít hơn một cách chính xác, trong khi shiplu's answer sẽ bỏ qua năm, tháng và ngày đối với ví dụ khoảng thời gian. Tuy nhiên, câu trả lời của shiplu là chính xác hơn cho các khoảng thời gian được tạo ra bằng cách trừ đi hai ngày. Đối với các khoảng thời gian chỉ bao gồm giờ, phút và giây, cả hai phương pháp sẽ nhận được câu trả lời đúng.

+0

@Brilliand Tại sao giải pháp này ít chính xác hơn trong các khoảng thời gian được tạo ra bằng cách trừ hai ngày? Tôi không hiểu làm thế nào. Bạn có thể giải thích ? – MaxiWheat

+3

@MaxiWheat Giả sử khoảng thời gian đã được tạo bằng cách trừ đi 2015-02-01 từ 2015-03-01. Đó là một sự khác biệt của một tháng, xảy ra bằng 28 ngày. Phương pháp của Shiplu sẽ coi đây là khoảng thời gian 28 ngày, trong khi phương pháp của tôi sẽ xử lý khoảng thời gian một tháng, tùy ý chọn tháng 1 làm tháng và tạo dấu thời gian dựa trên 31 ngày trong tháng 1. – Brilliand

2

tôi sẽ chỉ làm tăng thêm shiplu's answer:

function dateIntervalToSeconds($interval) 
{ 
    $seconds = $interval->days*86400 + $interval->h*3600 
     + $interval->i*60 + $interval->s; 
    return $interval->invert == 1 ? $seconds*(-1) : $seconds; 
} 

Để xử lý khoảng tiêu cực.

Lưu ý rằng - trái với Brilliand's answer - Mã ở trên sẽ xem xét chính xác năm, tháng và ngày. Bởi vì $ interval-> days là một giá trị tuyệt đối ($ interval-> d là tương đối so với tháng).

CHỈNH SỬA: chức năng này là vẫn không chính xác, như được chỉ ra bởi @Brilliand. Ví dụ ngược lại là

new DateInterval('P4M3DT2H'); 

Nó không xử lý tốt hàng tháng.

+0

Một ví dụ về một khoảng thời gian này sẽ thất bại trên là 'new DateInterval ('P4M3DT2H')'. Hãy thử và xem - biến 'days' trống, mặc dù khoảng thời gian kéo dài khoảng 123 ngày. – Brilliand

+0

Trong tương lai, nếu bạn định buộc tội tôi là sai, tôi yêu cầu bạn làm như vậy trong một bình luận về câu trả lời của tôi. Phải mất một thời gian dài tôi mới nhận ra điều này. – Brilliand

+0

@Brilliand, bạn nói đúng. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. –

Các vấn đề liên quan