$ 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.