Trừ 1 ngày với PHP


83

Tôi đang cố gắng lấy một đối tượng ngày tháng sắp ra khỏi CMS Drupal của mình, trừ đi một ngày và in ra cả hai ngày. Đây là những gì tôi có

$date_raw = $messagenode->field_message_date[0]['value'];

print($date_raw);

//this gives me the following string: 2011-04-24T00:00:00

$date_object = date_create($date_raw);

$next_date_object = date_modify($date_object,'-1 day');

print('First Date ' . date_format($date_object,'Y-m-d'));

//this gives me the correctly formatted string '2011-04-24'

print('Next Date ' . date_format($next_date_object,'Y-m-d'));

//this gives me nothing. The output here is always blank

Vì vậy, tôi không hiểu tại sao đối tượng ngày ban đầu lại hoạt động tốt, nhưng sau đó tôi đang cố gắng tạo một đối tượng ngày bổ sung và sửa đổi nó bằng cách trừ đi một ngày và có vẻ như tôi không thể làm điều đó. Đầu ra luôn trống.

Câu trả lời:


147

Bạn co thể thử:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));

1
Bạn có thể tải $ date_raw cùng định dạng với$date_raw = date("r");
sHaDeoNeR

4
Hãy cẩn thận! Nếu bạn xử lý các ngày sau năm 2038, nó sẽ không hoạt động vì giới hạn kích thước số nguyên trong PHP (ít nhất là trên nền tảng 32bit). Trong trường hợp đó, giải pháp an toàn nhất là sử dụng DateTime( xem tại đây ).
Tip-Sy,


35
$date = new DateTime("2017-05-18"); // For today/now, don't pass an arg.
$date->modify("-1 day");
echo $date->format("Y-m-d H:i:s");

Sử dụng DateTime đã làm giảm đáng kể mức độ đau đầu phải chịu đựng khi thao tác ngày tháng.


6
date_createlà phương thức thủ tục để gọi hàm DateTimetạo , cho phép bạn giảm 3 dòng của mình thành 1 mà không cần sử dụng new. Tức làecho date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
Armfoot

tốt, mã từ asnwer ban đầu cũng có thể được viết trong 1 dòng, như:(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
Scofield

22

Phiên bản hướng đối tượng

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');

câu trả lời của bạn thêm một ngày thay vì trừ nó. Ngoài ra nó sẽ là giải pháp ưa thích của tôi.
Burki

18

Một one-liner lựa chọn là:

echo date_create('2011-04-24')->modify('-1 days')->format('Y-m-d');

Chạy nó trên Trình chỉnh sửa PHP Trực tuyến .


mktime thay thế

Nếu bạn muốn tránh sử dụng các phương thức chuỗi, hoặc đi vào tính toán, hoặc thậm chí tạo các biến bổ sung, mktime hỗ trợ các giá trị trừ và âm theo cách sau:

// Today's date
echo date('Y-m-d'); // 2016-03-22

// Yesterday's date
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); // 2016-03-21

// 42 days ago
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-42, date("Y"))); // 2016-02-09

//Using a previous date object
$date_object = new DateTime('2011-04-24');
echo date('Y-m-d',
  mktime(0, 0, 0,
     $date_object->format("m"),
     $date_object->format("d")-1,
     $date_object->format("Y")
    )
); // 2011-04-23

Trình chỉnh sửa PHP trực tuyến


13

Không chắc tại sao mã hiện tại của bạn không hoạt động nhưng nếu bạn không cần cụ thể một đối tượng ngày tháng, điều này sẽ hoạt động:

$first_date = strtotime($date_raw);
$second_date = strtotime('-1 day', $first_date);

print 'First Date ' . date('Y-m-d', $first_date);
print 'Next Date ' . date('Y-m-d', $second_date);

Cảm ơn Clive! Cái đó phù hợp với tôi ... vâng, tôi không thực sự cần các đối tượng ngày tháng, tôi chỉ cần in các ngày tháng đã được định dạng.
td-dev

7

Câu trả lời được lấy từ các nhận xét về chức năng strtotime thủ công của Php:

echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));

Hoặc là

$date = "2009-01-31";
echo date( "Y-m-d", strtotime( $date . "-1 day"));

3

Làm thế nào về điều này: trước tiên chuyển đổi nó thành dấu thời gian unix, trừ 60 * 60 * 24 (chính xác một ngày tính bằng giây), và sau đó lấy ngày từ đó.

$newDate = strtotime($date_raw) - 60*60*24;
echo date('Y-m-d',$newDate);

Lưu ý: như apokryfos đã chỉ ra, điều này về mặt kỹ thuật sẽ bị loại bỏ bởi những thay đổi về thời gian tiết kiệm ánh sáng ban ngày, nơi sẽ có một ngày có 25 hoặc 23 giờ


Tốt, chỉ có tôi làm nó như thế này: $ newDate = date_create ($ date_raw) -> getTimestamp () - 60 * 60 * 24;
Yevgeniy Afanasyev

Điều này giả định rằng tất cả các ngày đều dài 24 giờ, điều này không đúng trong 2 ngày đó khi một bộ phận thiểu số trên thế giới di chuyển đồng hồ của họ thêm +/- 1 giờ để tạo ra ảo ảnh về nhiều hoặc ít ánh sáng mặt trời. Và sau đó là những giây nhuận.
apokryfos

đó là một sản phẩm tuyệt vời @apokryfos. Tôi sẽ không sử dụng nó cho một phép tính siêu khoa học, nhưng trong phần lớn các trường hợp, nó vẫn ổn.
user3413723,

3

Đơn giản như thế:

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

date("Y-m-d", strtotime("-1 months"))


-1

Cách thêm 1 năm vào một ngày rồi trừ đi 1 ngày trong asp.net c #

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);

Đây không phải là PHP.
Atheaos
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.