$ date + 1 anno?


91

Sto cercando di ottenere una data che sia un anno dalla data specificata.

Il mio codice ha questo aspetto:

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

Restituisce la data sbagliata. Qualche idea sul perché?


9
Hai dimenticato di dire dell'errore.
BalusC

Frank Farmer: ne sei così certo? Preferirei aspettare le retifiche / commenti di OP.
BalusC

Nella mia fretta di pubblicare questa ultima notte mi sono dimenticato di chiarire: stava restituendo la data sbagliata. Scusate! Grazie per l'aiuto.
Matt

1
Usalo in questo modo invece strtotime ('+ 1 year', $ startDate));
casivaagustin

Risposte:


98

Per aggiungere un anno alla data odierna, utilizzare quanto segue:

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

Per gli altri esempi devi inizializzare $ StartingDate con un valore timestamp, ad esempio:

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

Prova questo

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

o

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

L'aggiunta di "+365" invece di "+1 anno" ha funzionato. Grazie!
Matt

17
Questa interruzione non sarebbe in caso di anno bisestile?
Jeremy 1026

1
A partire da PHP 5.1, quando viene chiamato senza argomenti, mktime () lancia un avviso E_STRICT: usa invece la funzione time ().
svandragt

Downvoted anche qui. Il numero di secondi in un giorno, giorni in un anno, secondi in un anno, ecc. Sono tutti variabili. Se sei interessato a "un anno da adesso", devi passare in un intervallo di "un anno". La suddivisione da soli è ciò che porta a errori intorno ai giorni bisestili e ai secondi intercalari e alle modifiche all'ora legale. Peggio ancora, provoca test unitari instabili.
drobert

perché la mia risposta è sottovalutata ?? $ addoneyear = date ("y") + 1; // per l'aggiunta di un anno che cosa c'è di sbagliato?
pathe.kiran

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

$ futureDate tra un anno!

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

$ futureDate è di un anno da $ startDate!


Nota che se $ startDate è già un timestamp (come quello creato in precedenza con la funzione time () o mktime ()) e non una stringa, non dovresti racchiuderlo in strtotime o non funzionerà. Invece, fai $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));come K Prime menzionato di seguito.
dallin

9

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


Sebbene ciò restituisca la risposta giusta, l'altro in realtà non restituisce nemmeno un errore ... solo la data sbagliata.
SeanJA

1
strtotime non genera errori. Restituisce false in caso di errore.
Frank Farmer

PHP lancerà avvisi se il fuso orario predefinito non è impostato ... anche se apparentemente non è quello che intendeva
SeanJA

Mi stavo errore sul vostro codice ho cambiato ,a .ed ha funzionato 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

aveva lo stesso problema, tuttavia questa era la soluzione più semplice:

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

Grande, lo uso per ottenere il prossimo anno: $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'));

spero che questo bit di codice più semplice aiuti qualcuno in futuro :)


4

Preferisco l'approccio OO:

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

Usa DateTimeImmutablealtrimenti modificherai anche la data originale! altro su DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


Se vuoi solo la data di oggi, puoi sempre fare:

new \DateTimeImmutable('-1 Month');

3

Se stai usando PHP 5.3, è perché devi impostare il fuso orario predefinito:

date_default_timezone_set()

3

strtotime()sta restituendo bool(false), perché non può analizzare la stringa '+one year'(non comprende "uno"). falseviene quindi cast implicitamente al integertimestamp 0. È una buona idea verificare che strtotime()l'output di non sia bool(false)prima di inserirlo in altre funzioni.

Dai documenti:

Valori restituiti

Restituisce un timestamp in caso di successo, FALSE in caso contrario. Prima di PHP 5.1.0, questa funzione restituiva -1 in caso di errore.


Sì, buon punto. Il mio codice di produzione lo avrà, ma mi stavo strappando i capelli cercando di farlo funzionare, quindi l'ho ridotto al minimo codice possibile. Grazie!
Matt

2

Prova questo

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

1

C'è anche una soluzione più semplice e meno sofisticata:

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

1

La mia soluzione è: date('Y-m-d', time()-60*60*24*365);

Puoi renderlo più "leggibile" con le definizioni:

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

Nel mio caso (voglio aggiungere 3 anni alla data corrente) la soluzione era:

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

A Gardenee, Treby e Daniel Lima: cosa succederà il 29 febbraio? A volte febbraio ha solo 28 giorni :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.