Thêm một ngày vào một ngày


171

Mã của tôi để thêm một ngày vào một ngày sẽ trả lại một ngày trước ngày thêm: 2009-09-30 20:24:00ngày sau khi thêm một ngày NÊN được chuyển sang tháng tiếp theo:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

Tôi đã sử dụng mã khá giống nhau trước đây, tôi đang làm gì sai ở đây?

Câu trả lời:


332
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

Đối với PHP 5.2.0+, bạn cũng có thể làm như sau:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
Cảm ơn. Đã giải quyết nó dưới dạng: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 ngày"));
ian

11
Bạn không nên sử dụng một biến trong một chuỗi. Bạn nên sử dụng: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));như trong câu trả lời mà @ w35l3y đưa ra cho bạn.
Cas Bloem

Bạn nên thêm một lệnh gọi đến hàm date_default_timezone_set trước khi chạy mã này. Ví dụ: thêm date_default_timezone_set ('Châu Âu / Rome');
Luca Mastrostefano

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
Đây là một giải pháp hoàn hảo gần đây hơn.
Cas Bloem

... Miễn là nó không gây ra lỗi nghiêm trọng khi chạy trên máy chủ của bạn;)
Henrik Erlandsson

Đừng xin lỗi. Một số người đã đăng câu trả lời dame 3 năm sau khi bạn làm
Mawg nói rằng hãy phục hồi lại

1
Bạn nên thêm một lệnh gọi đến hàm date_default_timezone_set trước khi chạy mã này. Ví dụ: thêm date_default_timezone_set ('Châu Âu / Rome');
Luca Mastrostefano

@LucaMastrostefano không, bạn nên đặt múi giờ trên máy chủ của mình ...
MH

28

Giải pháp đơn giản nhất:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

Tôi thích cách của bạn trong một lớp lótecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba Tôi không nghĩ rằng một lớp lót của bạn hoạt động trong các phiên bản PHP cũ hơn vì tôi đã thử nó và tôi đã gặp lỗi:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

Nó làm việc cho tôi: Cho ngày hiện tại

$date = date('Y-m-d', strtotime("+1 day"));

cho bất kỳ ngày nào:

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
cảm ơn nó đã làm việc cho tôi Đơn giản nhất trong tất cả các giải pháp được đưa ra.
Puneet Verma

2
bạn không cần lặp lại và làm tổ strtotime()- nó có thể xử lý mọi thứ trong một cuộc gọi:date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
Nice, Đây là giải pháp đơn giản nhất! Cảm ơn bạn
Thiên thần


6

Cách đọc và hiểu đơn giản:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
Điều này đôi khi sẽ thất bại khi thay đổi tiết kiệm ánh sáng ban ngày khi độ dài ngày không phải là 24 giờ.
Nik Dow

3

Tôi luôn chỉ cần thêm 86400 (giây trong một ngày):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

Đó không phải là cách dễ nhất mà bạn có thể làm, nhưng nó hiệu quả!


Làm thế nào để bạn đối phó với giây nhuận khi thêm 86400 sẽ không hoạt động như có 86401 giây trong ngày đó? (ok, tôi biết điều đó chỉ xảy ra vài năm một lần, nhưng tùy thuộc vào ứng dụng, điều này có thể quan trọng)
Glen

1
Không phải tất cả các ngày có 86400 giây trong đó. Trên thực tế, ở hầu hết các nơi ở Mỹ, có ít hơn 3600 giây hoặc thêm hai lần một năm.
Peter Kovacs

1
Bạn có thể yên tâm bỏ qua giây nhuận, vì "thời gian Unix" không. Điều này hơi phức tạp, nhưng hãy đọc bài viết này để biết thêm thông tin: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian

2
Bạn nên tránh giải pháp này. Đây là lý do: stackoverflow.com/questions/2613338/ trên
mspir

1
Không thêm ngày bằng cách thêm 86400 giây vào ngày trước! Bạn sẽ có lỗi trong mã của bạn! Điều này không hoạt động vào ngày tiết kiệm ánh sáng ban ngày!
sbrbot

1

Mặc dù tôi đồng ý với câu trả lời của Doug Hays, tôi sẽ đồng ý ở đây để nói rằng lý do mã của bạn không hoạt động là vì strtotime () mong đợi INT là đối số thứ 2, không phải là chuỗi (thậm chí là chuỗi đại diện cho một ngày)

Nếu bạn bật báo cáo lỗi tối đa, bạn sẽ thấy đây là lỗi "Giá trị số không được định dạng tốt" ở mức E_NOTICE.


1

Các modify()phương pháp có thể được sử dụng để thêm gia số một hiệnDateTime giá trị.

Tạo một DateTimeđối tượng mới với ngày và giờ hiện tại:

$due_dt = new DateTime();

Khi bạn có DateTimeđối tượng, bạn có thể thao tác giá trị của nó bằng cách thêm hoặc trừ các khoảng thời gian:

$due_dt->modify('+1 day');

Bạn có thể đọc thêm về Hướng dẫn PHP .


0

Đoạn mã sau lấy ngày đầu tiên của tháng 1 năm nay (nhưng có thể là một ngày khác) và thêm 365 ngày vào ngày đó (nhưng có thể là N số ngày) bằng cách sử dụng lớp DateTime và định dạng phương thức của nó () và định dạng () ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

Vì bạn đã có câu trả lời cho những gì sai với mã của bạn, tôi có thể đưa ra một góc nhìn khác về cách bạn có thể chơi với datetimes nói chung và giải quyết vấn đề của bạn một cách cụ thể.

Thông thường, bạn thấy mình đặt ra một vấn đề về giải pháp. Đây chỉ là một trong những lý do bạn kết thúc với một mã bắt buộc . Thật tuyệt nếu nó hoạt động mặc dù; chỉ có những lựa chọn khác, có thể bảo trì nhiều hơn. Một trong số đó là mã khai báo . Vấn đề là hỏi cái gì bạn cần, thay vì làm thế nào để đạt được điều đó.

Trong trường hợp cụ thể của bạn, điều này có thể trông giống như sau. Trước tiên, bạn cần tìm hiểu xem bạn đang tìm kiếm cái gì , nghĩa là khám phá sự trừu tượng. Trong trường hợp của bạn, có vẻ như bạn cần một ngày . Không chỉ bất kỳ ngày nào, mà là một trong những đại diện tiêu chuẩn. Nói, ngày ISO8601. Có ít nhất hai triển khai: lần đầu tiên là một ngày được phân tích cú pháp từ một chuỗi có định dạng ISO8601 (hoặc một chuỗi ở bất kỳ định dạng nào khác thực sự) và lần thứ hai là một ngày trong tương lai là một ngày sau đó. Do đó, toàn bộ mã có thể trông như thế:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

Để biết thêm ví dụ với trò tung hứng datetime, hãy xem cái này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.