$ date + 1 năm?


87

Tôi đang cố gắng có được một ngày là một năm kể từ ngày tôi chỉ định.

Mã của tôi trông như thế này:

$futureDate=date('Y-m-d', strtotime('+one year', $startDate));

Nó trả lại sai ngày. Bất kỳ ý tưởng tại sao?


9
Bạn đã quên nói về lỗi.
BalusC

Frank Farmer: bạn có chắc chắn như vậy không? Tôi muốn chờ đợi sự phê chuẩn / bình luận của OP.
BalusC

Trong lúc vội vàng đăng bài này vào tối qua, tôi đã quên làm rõ - nó đã trả lại sai ngày. Lấy làm tiếc! Cảm ơn bạn đã giúp đỡ.
Matt

1
Sử dụng nó như thế này thay vì strtotime ('+ 1 năm', $ startDate));
casivaagustin

Câu trả lời:


97

Để thêm một năm vào ngày thường, hãy sử dụng như sau:

$oneYearOn = date('Y-m-d',strtotime(date("Y-m-d", mktime()) . " + 365 day"));

Đối với các ví dụ khác, bạn phải khởi tạo $ StartDate với giá trị dấu thời gian, ví dụ:

$StartingDate = mktime();  // todays date as a timestamp

Thử đi

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 365 day"));

hoặc là

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 1 year"));

Thêm "+365" thay vì "+1 năm" đã làm được điều đó. Cảm ơn!
Matt

16
Điều này sẽ không phá vỡ trong trường hợp một năm nhuận?
Jeremy1026

1
Kể từ PHP 5.1, khi được gọi mà không có đối số, mktime () ném ra một thông báo E_STRICT: hãy sử dụng hàm time () để thay thế.
svandragt

Ở đây cũng bị phản đối. Số giây trong ngày, số ngày trong năm, giây trong năm, v.v. đều có thể thay đổi. Nếu bạn quan tâm đến 'một năm kể từ bây giờ', bạn phải vượt qua trong khoảng thời gian 'một năm'. Tự chia nhỏ là những gì dẫn đến sai số xung quanh ngày nhuận và giây nhuận và thay đổi tiết kiệm ánh sáng ban ngày. Tệ hơn, nó gây ra các thử nghiệm đơn vị flappy.
drobert

tại sao câu trả lời của tôi bị phản đối ?? $ addedoneyear = date ("y") + 1; // cho thêm một năm, có chuyện gì với nó?
pathe.kiran

213
$futureDate=date('Y-m-d', strtotime('+1 year'));

$ futureDate là một năm kể từ bây giờ!

$futureDate=date('Y-m-d', strtotime('+1 year', strtotime($startDate)) );

$ futureDate là một năm kể từ $ startDate!


Xin lưu ý rằng nếu $ startDate đã là dấu thời gian (chẳng hạn như dấu thời gian được tạo trước đó với hàm time () hoặc mktime ()) và không phải là một chuỗi, bạn không nên bọc nó trong strtotime nếu không nó sẽ không hoạt động. Thay vào đó, hãy làm $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));như K Prime đã đề cập bên dưới.
dallin

9

Thử: $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));


Trong khi điều đó trả về câu trả lời đúng, câu trả lời còn lại cũng không thực sự trả về lỗi ... chỉ là ngày sai.
SeanJA

1
strtotime không ném lỗi. Nó trả về false trong trường hợp có lỗi.
Frank Farmer

PHP sẽ ném cảnh báo nếu các múi giờ mặc định không được thiết lập ... mặc dù rõ ràng đó không phải là những gì ông muốn nói
SeanJA

Tôi đã gặp lỗi trên mã của bạn mà tôi đã đổi ,thành .và nó hoạt động date("Y-m-d",strtotime('+1 year '.$startDate));
Muhammad Bilal

7
// Declare a variable for this year 
$this_year = date("Y");
// Add 1 to the variable
$next_year = $this_year + 1;
$year_after = $this_year + 2;

// Check your code
    echo "This year is ";
    echo $this_year;
    echo "<br />";
    echo "Next year is ";
    echo $next_year;
    echo "<br />";
    echo "The year after that is ";
    echo $year_after;

6

vừa gặp vấn đề tương tự, tuy nhiên đây là giải pháp đơn giản nhất:

<?php (date('Y')+1).date('-m-d'); ?>

Tuyệt vời, tôi sử dụng nó để có được những năm tiếp theo: $next_year = (date('Y')+1).
Martin

5
//1 year from today's date
echo date('d-m-Y', strtotime('+1 year'));

//1 year from from specific date
echo date('22-09-Y', strtotime('+1 year'));

hy vọng đoạn mã đơn giản hơn này sẽ giúp ai đó trong tương lai :)


4

Tôi thích cách tiếp cận OO hơn:

$date = new \DateTimeImmutable('today'); //'today' gives midnight, leave blank for current time.
$futureDate = $date->add(\DateInterval::createFromDateString('+1 Year'))

Sử dụng DateTimeImmutablenếu không, bạn cũng sẽ sửa đổi ngày ban đầu! thêm về DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


Nếu bạn chỉ muốn từ ngày thường thì bạn luôn có thể làm:

new \DateTimeImmutable('-1 Month');

3

Nếu bạn đang sử dụng PHP 5.3, đó là vì bạn cần đặt múi giờ mặc định:

date_default_timezone_set()

3

strtotime()đang trả về bool(false), vì nó không thể phân tích cú pháp chuỗi '+one year'(nó không hiểu "một"). falsesau đó sẽ được truyền ngầm đến integerdấu thời gian 0. Bạn nên xác minh strtotime()đầu ra của nó bool(false)trước khi chuyển nó vào các chức năng khác.

Từ các tài liệu:

Giá trị trả lại

Trả về dấu thời gian khi thành công, ngược lại là FALSE. Trước PHP 5.1.0, hàm này sẽ trả về -1 khi bị lỗi.


Vâng, điểm tốt. Mã sản xuất của tôi sẽ có mã đó, nhưng tôi đã cố gắng làm cho nó hoạt động, vì vậy hãy rút nó xuống càng ít mã càng tốt. Cảm ơn!
Matt

2

Thử đi

$nextyear  = date("M d,Y",mktime(0, 0, 0, date("m",strtotime($startDate)),   date("d",strtotime($startDate)),   date("Y",strtotime($startDate))+1));

1

Ngoài ra còn có một giải pháp đơn giản và ít phức tạp hơn:

$monthDay = date('m/d');
$year = date('Y')+1;
$oneYearFuture = "".$monthDay."/".$year."";
echo"The date one year in the future is: ".$oneYearFuture."";

1

Giải pháp của tôi là: date('Y-m-d', time()-60*60*24*365);

Bạn có thể làm cho nó "dễ đọc" hơn với các định nghĩa:

define('ONE_SECOND', 1);
define('ONE_MINUTE', 60 * ONE_SECOND);
define('ONE_HOUR',   60 * ONE_MINUTE);
define('ONE_DAY',    24 * ONE_HOUR);
define('ONE_YEAR',  365 * ONE_DAY);

date('Y-m-d', time()-ONE_YEAR);

-1

Trong trường hợp của tôi (tôi muốn thêm 3 năm vào thời điểm hiện tại) giải pháp là:

$future_date = date('Y-m-d', strtotime("now + 3 years"));

Đối với Gardenee, Treby và Daniel Lima: điều gì sẽ xảy ra với ngày 29 tháng Hai? Đôi khi tháng Hai chỉ có 28 ngà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.