2010-11-02 50 views
24

Hay, tôi có sự kiện giữ cơ sở dữ liệu. Có 2 trường 'bắt đầu' và 'kết thúc', chúng có chứa dấu thời gian. Khi quản trị viên nhập những ngày này, họ chỉ có khả năng đặt ngày, tháng, năm. Vì vậy, chúng tôi chỉ xử lý tem có chứa ngày, tháng, năm, không giờ, phút, giây (giờ, phút và giây được đặt thành 0,0,0).Tìm ngày giữa 2 dấu thời gian unix trong php

Tôi có một sự kiện với thời gian bắt đầu là 1262304000 và thời gian kết thúc là 1262908800. Các chuyển đổi này thành ngày 1 tháng 1 năm 2010 và ngày 8 tháng 1 năm 2010. Làm cách nào để có được tất cả các ngày giữa các dấu thời gian này? Tôi muốn có thể trở lại ngày 2 tháng 1 năm 2010 (1262390400), ngày 3 tháng 1 năm 2010 (1262476800) .. tất cả các cách để đóng dấu kết thúc. Những sự kiện này có thể chuyển sang các tháng khác nhau, từ ngày 28 tháng 5 đến ngày 14 tháng 6.

Bất kỳ ý tưởng nào về cách thực hiện việc này?

+0

có thể trùng lặp [cách tìm ngày tháng giữa hai ngày được chỉ định] (http: // stackoverflow.com/questions/2736784/how-to-find-the-date-giữa-hai-ngày-quy định) – Gordon

+5

Tất cả các giải pháp điều chỉnh bởi 86400 sẽ thất bại khi ngày tháng tiết kiệm ánh sáng ban ngày thay đổi –

+0

Mark Baker> Đó là vấn đề với unix timestamps . Sử dụng lớp DateTime có thể phù hợp hơn, mặc dù tôi không kiểm tra xem chúng tôi có thể thực hiện điều này một cách dễ dàng hay không. –

Trả lời

37

Bạn chỉ cần phải tính toán số giây giữa hai ngày, sau đó chia để có được ngày:

$numDays = abs($smallestTimestamp - $biggestTimestamp)/60/60/24; 

Sau đó, bạn có thể sử dụng một vòng lặp for để lấy các ngày:

$numDays = abs($smallestTimestamp - $biggestTimestamp)/60/60/24; 

for ($i = 1; $i < $numDays; $i++) { 
    echo date('Y m d', strtotime("+{$i} day", $smallestTimestamp)) . '<br />'; 
} 

Một lần nữa, nếu bạn không biết dấu thời gian nào là nhỏ nhất, bạn có thể sử dụng hàm min() (đối số thứ hai trong strtotime).

+0

Có cách nào để sửa đổi điều này sao cho nó không quan trọng theo cách nào? – dotty

+1

Có, sử dụng hàm abs() trên toàn bộ. –

+1

Điều này sẽ cung cấp cho bạn bao nhiêu ngày có giữa hai ngày, nhưng không phải ngày, tháng và năm. –

2

Tôi nghĩ rằng giải pháp nhanh cho việc này là trừ số lượng ngày trị giá giây từ end_stamp cho đến khi bạn truy cập start_tag.

//1 day = 86400 seconds 

Tôi sẽ xây dựng một loạt ngày để sử dụng sau này.

EDIT (ví dụ)

$difference = 86400; 
$days = array(); 
while ($start_time < $end_time) 
{ 
    $days[] = date('M j Y', $end_time); 

    $end_time -= $difference; 
} 

này nên bao gồm bất kỳ khung thời gian ngay cả khi nó qua một loạt các tháng.

2

Hãy thử điều này:

while($date_start <= $date_end) { 
    echo date('M d Y', $date_start) . '<br>'; 
    $date_start = $date_start + 86400; 
} 

Hope this helps!

0

Một cái gì đó như thế này?

$day = $start; 
while ($day < $end) { 
     $day += 86400; 
     echo $day.' '.date('Y-m-d', $day).PHP_EOL; 
} 

Bằng cách này, 1262304000 là ngày 31 tháng 12, không Jan 1.

+0

Sẽ trả về ngày - 1. Bạn cần sử dụng toán tử '<='. –

+0

Ông nói giữa, vì vậy tôi giả định nó là độc quyền. – netcoder

+0

Ah, thực sự! Tôi hiểu sai câu hỏi, xấu của tôi. –

0

có được sự khác biệt của hai thời điểm và chia nó bằng 86400. abs (($ date1 - $ date2)/86400) sẽ sản xuất kết quả cần thiết

1
$d1=mktime(22,0,0,1,1,2007); 
$d2=mktime(0,0,0,1,2,2007); 
echo "Hours difference = ".floor(($d2-$d1)/3600) . "<br>"; 
echo "Minutes difference = ".floor(($d2-$d1)/60) . "<br>"; 
echo "Seconds difference = " .($d2-$d1). "<br>"; 


echo "Month difference = ".floor(($d2-$d1)/2628000) . "<br>"; 
echo "Days difference = ".floor(($d2-$d1)/86400) . "<br>"; 
echo "Year difference = ".floor(($d2-$d1)/31536000) . "<br>"; 

http://www.plus2net.com/php_tutorial/date-diff.php

http://www.phpf1.com/tutorial/php-date-difference.html

0
$daysInBetween = range($startTs, $endTs, 86400); 
$secondDay = date('M d Y', $daysInBetween[1]); 
/* 
$thirdDay = date('M d Y', $daysInBetween[2]); 
... 
*/ 

Lưu ý rằng chức năng range() được bao gồm.

1
**This is a very simple code for find days hours minutes and seconds in php** 

    $dbDate = strtotime("".$yourbdDate.""); // Database date 
    $endDate = time(); // current time 
    $diff = $endDate - $dbDate; /// diffrence 

    $days = floor($diff/86400); /// number of days 
    $hours = floor(($diff-$days*86400)/(60 * 60)); //// number of hours 
    $min = floor(($diff-($days*86400+$hours*3600))/60);///// numbers of minute 


    $second = $diff - ($days*86400+$hours*3600+$min*60); //// secondes 

    if($days > 0) echo $days." Days ago"; 
    elseif($hours > 0) echo $hours." Hours ago"; 
    elseif($min > 0) echo $min." Minute ago"; 
    else echo "Just second ago"; 
Các vấn đề liên quan