strtotime

(PHP 4, PHP 5, PHP 7, PHP 8)

strtotimeAnalizza qualsiasi descrizione datetime testuale inglese e la converte in uno Unix timestamp

Descrizione

strtotime(string $time, int $now = time()): int

La funzione si aspetta una stringa contenente un formato di data inglese e proverà ad analizzare quel formato ed a convertirlo in uno Unix timestamp (il numero di secondi dall'1 Gennaio 1970 00:00:00 UTC), relativo al timestamp dato in now, oppure all'ora corrente se non viene fornito now.

Ogni parametro di questa funzione usa il fuso orario predefinito a meno che non sia specificato il fuso orario in quel parametro. Badare a non usare diversi fusi orari in ogni parametro a meno che non sia intenzionale. Vedere date_default_timezone_get() sui vari modi per definire il fuso orario predefinito.

Elenco dei parametri

time

Una stringa data/ora. I formati validi sono descritti in Formati di Data e Tempo.

now

Il timestamp che è usato come base per il calcolo delle date relative.

Valori restituiti

Restituisce un timestamp in caso di successo, altrimenti false. Prima di PHP 5.1.0, questa funzione restituiva -1 in caso di fallimento.

Errori/Eccezioni

Ogni chiamata a una funzione data/ora genera un E_NOTICE se il time zone non è valido, e/o un messaggio E_STRICT o E_WARNING se si usano le impostazioni di sistema o la variabile d'ambiente TZ. Vedere anche date_default_timezone_set()

Log delle modifiche

Versione Descrizione
5.3.0 Prima di PHP 5.3.0, i formati del tempo relativi forniti all'argomento time di strtotime() come this week, previous week, last week, e next week erano interpretati per intendere un periodo di 7 giorni relativo alla data/ora corrente, invece di un periodo settimanale di Monday a Sunday.
5.3.0 Prima di PHP 5.3.0, 24:00 non era un formato valido e strtotime() restituiva false.
5.2.7 In PHP 5 precedente a 5.2.7, richiedere una data occorrenza di un dato giorno della settimana in un mese dove il giorno della settimana era il primo giorno del mese aggiungerebbe in modo scorretto una settimana al timestamp restituito. Questo è stato corretto in 5.2.7 e nelle versioni successive.
5.1.0 Ora restituisce false in caso di fallimento, invece di -1.
5.1.0

Ora emette gli errori time zone E_STRICT e E_NOTICE

5.0.2 In PHP 5 fino a 5.0.2, "now" e altri tempi relativi sono erroneamente calcolati a partire dalla mezzanotte di oggi. Questo differisce dalle altre versioni in cui viene correttamente calcolato dal tempo corrente.
5.0.0 I microsecondi hanno cominciato ad essere consentiti, ma sono ignorati.

Esempi

Example #1 Un esempio di strtotime()

<?php
echo strtotime("now"), "\n";
echo
strtotime("10 September 2000"), "\n";
echo
strtotime("+1 day"), "\n";
echo
strtotime("+1 week"), "\n";
echo
strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo
strtotime("next Thursday"), "\n";
echo
strtotime("last Monday"), "\n";
?>

Example #2 Controllo per il fallimento

<?php
$str
= 'Not Good';

// prima di PHP 5.1.0 si sarebbe dovuto fare il confronto con -1, invece di false
if (($timestamp = strtotime($str)) === false) {
echo
"The string ($str) is bogus";
} else {
echo
"$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>

Note

Nota:

Se è specificato il numero dell'anno in un formato a due cifre, i valori tra 00-69 sono mappati a 2000-2069 e 70-99 a 1970-1999. Guardare le note sotto per le possibili differenze sui sistemi 32bit (le possibili date potrebbero finire sul 2038-01-19 03:14:07).

Nota:

Il range valido di un timestamp è tipicamente da Fri, 13 Dec 1901 20:45:54 UTC a Tue, 19 Jan 2038 03:14:07 UTC. (Queste sono le date che corrispondono al minimo e al massimo valore per un intero con segno a 32-bit.)

Prima di PHP 5.1.0, non tutte le piattaforme supportano timestamp negativi, perciò il range delle date può essere limitato a non prima della Unix epoch. Questo significa che per esempio le date prima di Jan 1, 1970 non funzioneranno su Windows, alcune distribuzioni Linux, e pochi altri sistemi operativi.

Per le versioni di PHP a 64-bit, il range valido di un timestamp è effettivamente infinito, dato che 64 bit possono rappresentare approssimativamente 293 miliardi di anni in entrambi le direzioni.

Nota:

Le date nei formati m/d/y o d-m-y sono differenziati in base al separatore tra i vari componenti: se il separatore è uno slash (/), allora è assunto l'americano m/d/y; mentre se il separatore è un trattino (-) o un puntino (.), allora è assunto il formato europeo d-m-y. Se, comunque, l'anno viene dato in un formato a due cifre e il separatore è un trattino (-, la stringa data è analizzata come y-m-d.

Per evitare potenziali ambiguità, è meglio usare le date ISO 8601 (YYYY-MM-DD) o DateTime::createFromFormat() quando possibile.

Nota:

Usando questa funzione per operazioni matematiche non è consigliabile. È meglio usare DateTime::add() e DateTime::sub() in PHP 5.3 e successivi, o DateTime::modify() in PHP 5.2.

Vedere anche:

add a note add a note

User Contributed Notes 4 notes

up
10
cesarfrisa at yahoo dot es
1 year ago
This is the link to the relative formats that can be used in this function. It's not easy to find in the documentation.

https://www.php.net/manual/en/datetime.formats.relative.php

Here some examples:
<?php
$today
= date( 'Y-m-d', strtotime( 'today' ) );
echo
"Today: " . $today;

// Print: Today: 2023-06-01

//Basic Example
$tomorrow = date( 'Y-m-d', strtotime( 'tomorrow' ) );
echo
"\n\nTomorrow: " . $tomorrow;

// Print: Tomorrow: 2023-06-02

$yesterday = date( 'Y-m-d', strtotime( 'yesterday' ) );
echo
"\n\nYesterday: " . $yesterday;

// Print: Yesterday: 2023-05-31

// Add o subtract Month
$variable = date( 'Y-m-d', strtotime( '+1 month' ) );
echo
"\n\nAdd one month: " . $variable;

// Print: Add one month: 2023-07-01

$variable = date( 'Y-m-d', strtotime( '-1 month' ) );
echo
"\n\nSubstract one month: " . $variable;

// Print: Substract one month: 2023-05-01

// More complex formats:
// ERROR / BUG: If today is the last day of the month. This examples can be one error or bug.
// If you are looking el first day of previous or next month you dont must use last Relative Format.
// You must use 'first day of 2 months ago' or 'first day of previous month'
// See you:
// https://bugs.php.net/bug.php?id=22486
// https://bugs.php.net/bug.php?id=44073
// strtotime("+1 Month")
// produces the wrong result on the 31st day of the month.
// on January 31, date("m",strtotime("+1 Month")) will return 03 instead of 02

// Another example:
$dt1 = strtotime("2023-01-30");
$month = strtotime("+1 month", $dt1);
echo
"\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo 
"\nBUG add month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-01-30
// BUG add month: 2023-03-02

$dt1 = strtotime("2023-02-28");
$month = strtotime("-1 month", $dt1);
echo
"\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo 
"\nBUG substract month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-02-28
// BUG substract month: 2023-01-28

$dt1 = strtotime("2023-01-30");
$month = strtotime("first day of next month", $dt1);
echo
"\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo 
"\nFirst day of next month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-01-30
// First day of next month: 2023-02-01

$dt1 = strtotime("2023-02-28");
$month = strtotime("last day of last month", $dt1);
echo
"\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo 
"\nLast day of last month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-02-28
// Last day of last month: 2023-01-31

$dt1 = strtotime("2023-02-28");
$month = strtotime("first day of 2 months ago", $dt1);
echo
"\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo 
"\nFirst day of 2 months ago: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-02-28
// First day of 2 months ago: 2022-12-01

?>
up
7
info at pipasjourney dot com
1 year ago
Be aware of this: 1 month before the 31st day, it will return the same month:

<?php
echo date('m', strtotime('2023-05-30 -1 month')) ; //returns 04
echo date('m', strtotime('2023-05-31 -1 month')) ; //returns 05, not 04
?>

So, don't use this to operate on the month of the result.
A better way to know what month was the previous month would be:

<?php
//considering today is 2023-05-31...

$firstOfThisMonth = date('Y-m') . '-01'; //returns 2023-05-01
echo date('m', strtotime($firstOfThisMonth . ' -1 month')) ; //returns 04
?>
up
8
Vyacheslav Belchuk
1 year ago
Be careful when using two numbers as the year. I came across this situation:

<?php

echo strtotime('24.11.22');
echo
date('d.m.Y H:i:s', 1669324282)  .  "\n\n";

// But
echo strtotime('24.11.2022');
echo
date('d.m.Y H:i:s', 1669237200);

?>

Output:

1669324282
25.11.2022 00:11:22

1669237200
24.11.2022 00:00:00
up
-5
MarkAgius at markagius dot co dot uk
1 year ago
Note:
If day of month is 12 or less, or year is entered as a two digit number and less than 31 or 12 then you may get the wrong time value.
If you know the format used with the date string, then use the following code: (PHP version 5.5 or later)
[code]
function getStrtotime($timeDateStr, $formatOfStr="j/m/Y"){
  // Same as strtotime() but using the format $formatOfStr.
  // Works with PHP version 5.5 and later.
  // On error reading the time string, returns a date that never existed. 3/09/1752 Julian/Gregorian calendar switch.
  $timeStamp = DateTimeImmutable::createFromFormat($formatOfStr,$timeDateStr);
  if($timeStamp===false){
    // Bad date string or format string.
    return -6858133619; // 3/09/1752
  } else {
    // Date string and format ok.
    return $timeStamp->format("U"); // UNIX timestamp from 1/01/1970,  0:00:00 gmt
  }
}

print date("j/m/Y", getStrtotime("1/02/2022", "j/m/Y"))." Standard format. (j)<BR>\n";
print date("j/m/Y", getStrtotime("1/02/2022", "d/m/Y"))." Standard format. (d)<BR>\n";
print date("j/m/Y", getStrtotime("1/02/2022", "j/m/y"))." Standard format. (y) &lt;-- Bad date as 2022 is not two digits.<BR>\n";
print date("j/m/Y", getStrtotime("21/02/2022", "j/m/Y"))." Standard format. (j)<BR>\n";
print date("j/m/Y", getStrtotime("21/02/2022", "d/m/Y"))." Standard format. (d)<BR>\n";
print date("j/m/Y", getStrtotime("2/01/2022", "m/j/Y"))." US format.<BR>\n";
print date("j/m/Y", getStrtotime("2-01-22", "m-j-y"))." Two digit year, US format. (Y)<BR>\n";
print date("j/m/Y", getStrtotime("2-01-22", "m-j-Y"))." Two digit year, US format. (y) &lt;-- Wrong year if two digits.<BR>\n";
print date("j/m/Y", getStrtotime("3/09/1752", "j/m/Y"))." No such date.<BR>\n";
print date("j/m/Y", getStrtotime("50/00/19999", "j/m/Y"))." Bad date string.<BR>\n";
print date("j/m/Y", getStrtotime("1-02-2022", "j/m/Y"))." Wrong - or / used.<BR>\n";
[/code]
Output:
1/02/2022 Standard format. (j)
1/02/2022 Standard format. (d)
3/09/1752 Standard format. (y) <-- Bad date as 2022 is not two digits.
21/02/2022 Standard format. (j)
21/02/2022 Standard format. (d)
1/02/2022 US format.
1/02/2022 Two digit year, US format. (Y)
1/02/0022 Two digit year, US format. (y) <-- Wrong year if two digits.
3/09/1752 No such date.
3/09/1752 Bad date string.
3/09/1752 Wrong - or / used.
To Top