2010-08-03 49 views
10

Cung cấp ngày bắt đầu, tôi sẽ thêm bốn lần bảy ngày để nhận được 5 ngày khác nhau được phân tách chính xác mỗi tuần một lần.Thêm ngày vào dấu thời gian

//$date = '28-10-2010'; 
$timestamp = mktime(0, 0, 0, 10, 01, 2010); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

Các đầu ra mã này:

Date=01-10-2010 Friday 
Date=08-10-2010 Friday 
Date=15-10-2010 Friday 
Date=22-10-2010 Friday 
Date=29-10-2010 Friday 

nào miễn là tôi biết đó là chính xác. Nhưng, hãy xem điều gì sẽ xảy ra khi trải qua 2010-10-31 và 2010-11-01

$ timestamp = mktime (0, 0, 0, 10, 28, 2010); [...]

Tò mò nó ra này:

Date=28-10-2010 Thursday 
Date=03-11-2010 Wednesday 
Date=10-11-2010 Wednesday 
Date=17-11-2010 Wednesday 
Date=24-11-2010 Wednesday 

gì đang xảy ra? Ngày thứ hai sẽ là 04-11-2010! Ngoài ra, tôi thấy rằng "thất bại" này xảy ra sau mỗi mười năm! Đây có phải là điều gì đó liên quan đến thời gian tiết kiệm ánh sáng ban ngày không? Nếu vậy, làm thế nào để giải quyết nó? Có điều gì tôi đang xem không?

Edit: Ok, tôi outputed thời điểm đó, chỉ để xem những gì sẽ xảy ra và đây là những gì tôi có bây giờ:

Date=28-10-2010 Thursday :: 00:00:00 
Date=03-11-2010 Wednesday :: 23:00:00 
Date=10-11-2010 Wednesday :: 23:00:00 
Date=17-11-2010 Wednesday :: 23:00:00 
Date=24-11-2010 Wednesday :: 23:00:00 

vẻ gì đó liên quan với thời điểm đó, một cái gì đó xảy ra tại 2010/11/31 ...

Trả lời

36

Never sử dụng toán học như 60 * 60 * 24 * 7 để thêm/ngày trừ (vì ánh sáng ban ngày tiết kiệm thời gian), sử dụng strtotime hoặc mktime thay vì:

$timestamp = strtotime('+7 days', $timestamp); 

// Or something like this (it's OK to have day parameter <= 0 or > 31) 
$timestamp = mktime(0, 0, 0, $month, $day + 7, $year); 

dụ của bạn sẽ rõ ràng hơn nếu bạn sẽ lần đầu ra cũng như:

$timestamp = mktime(0, 0, 0, 10, 28, 2010); 
echo date('Y-m-d H:i:s', $timestamp) . "\n"; 

$timestamp += 60*60*24*7; 
echo date('Y-m-d H:i:s', $timestamp) . "\n"; 

Output:

2010-10-28 00:00:00 
2010-11-03 23:00:00 

Ở đây bạn có 2010-11-03 23:00:00 thay vì 2010-11-04 00:00:00 vì một trong những ngày (31 tháng 10) là giờ dài thay vì 24.

0

tôi đã có rất nhiều thành công với phương pháp này cho ngày thêm, mặc dù tôi đã không thử nghiệm với định dạng của bạn:

$date = The value of the database from your query 
$daysahead = The number of days ahead you want to calculate 
$final_date = date(“m/d/Y”, strtotime($date) + (86400 * $daysahead)); 

echo $final_date; 
2

Có vẻ như bạn đã chuyển sang tiết kiệm thời gian ban ngày hoặc ngược lại.

Thời gian POSIX (dấu thời gian) luôn là UTC trong khi giờ địa phương là UTC + X là X có thể thay đổi từ ngày này sang ngày khác theo tiết kiệm thời gian.

1

Tôi tin rằng việc này có liên quan đến thời gian tiết kiệm ánh sáng ban ngày vì phân đoạn thời gian của dấu thời gian được đặt thành nửa đêm trên chấm, nhưng khi tiết kiệm ánh sáng ban ngày, chúng tôi quay lại một giờ - đó vẫn là ngày hôm trước (lúc 11 giờ tối).

Nếu bạn thêm 2 giờ để dòng gốc, do đó bạn có điều này:

$timestamp = mktime(2, 0, 0, 10, 01, 2010); 

và do đó bắt đầu lúc 2 giờ sáng chứ không phải là nửa đêm ... nó hoạt động.

+0

giải pháp của bạn sẽ hoạt động trên toàn thế giới? –

2

Nó thực sự có vẻ là múi giờ/DST liên quan.

Thêm

date_default_timezone_set('UTC'); 

như dòng đầu tiên giải quyết vấn đề này (như bạn không còn sử dụng bất kỳ thiết lập DST).

+0

Điều này cũng hiệu quả. –

1

Tôi sẽ không bao giờ hiểu tại sao mọi người sử dụng hàm mktime khủng khiếp này.

Trong trường hợp bạn đang ở trên PHP5.3 nào, bạn có thể muốn xem xét sử dụng

$period = new DatePeriod(
    new DateTime('28-10-2010'), 
    DateInterval::createFromDateString('1 week'), 
    4); 

foreach ($period as $dt) { 
    echo $dt->format("l Y-m-d H:i:s\n"); 
} 

Without PHP5.3 bạn vẫn có thể sử dụng

for($i=0; $i<=4; $i++) { 
    echo date('Y-m-d', strtotime("+$i weeks 28-10-2010")), PHP_EOL; 
} 

câu hỏi DateTime là pretty common on SO, so you might find interesting cases when searching.

0

Trong trường hợp ai đó cần điều này, giống như tôi tham chiếu trang web: Hôm nay, thời gian hiện tại, Y-m-d H: i: s, cộng với 7 ngày. HOẶC bạn có thể thêm +3 Tháng, v.v.

$timestamp=strtotime("+7 Days"); 
$nowtime = date('Y-m-d H:i:s', $timestamp); 
Các vấn đề liên quan