strtotime

(PHP 4, PHP 5, PHP 7)

strtotimeTranslează aproape orice descriere textuală în limba engleză a datei și orei într-un timestamp Unix

Descrierea

strtotime ( string $datetime [, int $now = time() ] ) : int

Funcția așteaptă un șir de caractere conținând un format de dată engleză și încearcă să transforme acest format într-un timestamp Unix (numărul de secunde de la 1 Ianuarie 1970 00:00:00 UTC), în raport cu timestamp-ul dat în parametrul now, sau cu ora curentă dacă parametrul now nu este furnizat.

Avertizare

Timestamp-ul Unix pe care îl întoarce această funcție nu conține informații despre fusurile orare. Pentru a efectua calcule cu informații dată/oră trebuie utilizate obiecte DateTimeImmutable mai capabile.

Fiecare parametru al acestei funcții utilizează fusul orar implicit, afară de cazul când fusul orar este specificat în acel parametru. Fiți atenți să nu utilizați diferite fusuri orare în fiecare parametru, afară de cazul când anume așa se intenționează. Vedeți date_default_timezone_get() pentru diferite metode de a defini fusul orar implicit.

Parametri

datetime

Un șir dată/oră. Formatele valide sunt explicate în Formatele datelor și orelor.

now

Timestamp-ul care este utilizat ca bază pentru calcularea datelor relative.

Valorile întoarse

Întoarce un timestamp în caz de succes, false în caz contrar. Înainte de PHP 5.1.0, această funcție întorcea -1 în caz de eșec.

Erori/Excepții

Fiecare apel al unei funcții de dată/oră va genera o E_NOTICE dacă zona orară nu este validă și/sau un mesaj E_STRICT sau E_WARNING dacă se utilizează setările sistemului sau variabila de mediu TZ. Vedeți de asemenea date_default_timezone_set()

Exemple

Example #1 Exemplu 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 Verificarea eșecului

<?php
$str 
'Nu e bine';

// înainte de PHP 5.1.0 ar fi trebuit de comparat cu -1, în loc de false
if (($timestamp strtotime($str)) === false) {
    echo 
"String-ul ($str) nu este corect";
} else {
    echo 
"$str == " date('l dS \o\f F Y h:i:s A'$timestamp);
}
?>

Note

Notă:

Dacă anul este specificat cu două cifre, valorile între 00-69 sunt interpretate ca 2000-2069, iar valorile între 70-99 ca 1970-1999. Vedeți notele de mai jos pentru posibilele diferențe pe sistemele pe 32 de biți (datele posibile pot să se încheie cu 2038-01-19 03:14:07)

Notă:

Domeniul valid al unui timestamp este de obicei de la Fri, 13 Dec 1901 20:45:54 UTC până la Tue, 19 Jan 2038 03:14:07 UTC. (Acestea sunt datele ce corespund valorilor minimă și maximă pentru un întreg pe 32 biți cu semn.)

Anterior versiunii PHP 5.1.0, nu toate platformele susțin timestamp-uri negative, de aceea domeniul datelor poate fi limitat la valorile de după Epoca Unix. Aceasta înseamnă că de ex. datele de până la 1 Ianuarie 1970 nu vor fi valide în Windows, unele distributive Linux, și alte câteva sisteme de operare.

Pentru versiunile PHP pe 64 de biți domeniul valid a unui timestamp este practic infinit, deoarece pe 64 de biți se pot reprezenta aproximativ 293 milioane de ani în ambele direcții.

Notă:

Datele în formatul m/d/y sau d-m-y sunt disambiguate analizând separatorul dintre deferite componente: dacă separatorul este slash (/), atunci este utilizat formatul American m/d/y; iar dacă separatorul este liniuța (-) sau punctul (.), atunci este utilizat formatul European d-m-y. Însă dacă anul e furnizat în format cu două cifre și separatorul este liniuța (-), atunci șirul cu data va fi interpretat ca y-m-d.

Pentru a evita o potențială ambiguitate, cel mai bine este de a utiliza date în format ISO 8601 (YYYY-MM-DD) sau DateTime::createFromFormat() atunci când este posibil.

Notă:

Utilizarea acestei funcții pentru operații matematice nu este recomandabilă. Este mai bine de a utiliza DateTime::add() și DateTime::sub() în PHP 5.3 și ulterior, sau DateTime::modify() în PHP 5.2.

A se vedea și

add a note add a note

User Contributed Notes 42 notes

up
772
sam at frontiermedia dot net dot au
13 years ago
I've had a little trouble with this function in the past because (as some people have pointed out) you can't really set a locale for strtotime. If you're American, you see 11/12/10 and think "12 November, 2010". If you're Australian (or European), you think it's 11 December, 2010. If you're a sysadmin who reads in ISO, it looks like 10th December 2011.

The best way to compensate for this is by modifying your joining characters. Forward slash (/) signifies American M/D/Y formatting, a dash (-) signifies European D-M-Y and a period (.) signifies ISO Y.M.D.

Observe:

<?php
echo date("jS F, Y", strtotime("11.12.10"));
// outputs 10th December, 2011

echo date("jS F, Y", strtotime("11/12/10"));
// outputs 12th November, 2010

echo date("jS F, Y", strtotime("11-12-10"));
// outputs 11th December, 2010 
?>

Hope this helps someone!
up
117
kumar AT swatantra.info Swatantra Kumar
10 years ago
The "+1 month" issue with strtotime
===================================
As noted in several blogs, strtotime() solves the "+1 month" ("next month") issue on days that do not exist in the subsequent month differently than other implementations like for example MySQL.

<?php
echo date( "Y-m-d", strtotime( "2009-01-31 +1 month" ) ); // PHP:  2009-03-03
echo date( "Y-m-d", strtotime( "2009-01-31 +2 month" ) ); // PHP:  2009-03-31
?>

<?php
SELECT DATE_ADD
( '2009-01-31', INTERVAL 1 MONTH ); // MySQL:  2009-02-28
?>
up
1
Black Hat Rocker
3 years ago
*The case 30/11/-0001*
With the following note, I will report a particular behaviour of function strtotime() I want to call it «The case 30/11/-0001».  It is very common and known but never reported  here. Passing the input parameter '0000-00-00' to the function it returns a wrong and not supported timestamp value. It can be seen with these statement

<?php echo date('d/m/Y', strtotime('0000-00-00')); // returns 30/11/-0001  ?>

It seems there's no way to avoid that, but it is possibile to do workaround with if/3operator clausole simply as follow

<?php strcmp($date "0000-00-00")? date('d/m/Y', strtotime($date) ) :  date('d/m/Y') ?>

Otherwise a simple way is to avoid to store to the DB the value '0000-00-00' and insert a default data value (i.e. with the mySQL function NOW() which sets the date on today's date)
up
72
Stefan Kunstmann
13 years ago
UK dates (eg. 27/05/1990) won't work with strotime, even with timezone properly set.

/*
However, if you just replace "/" with "-" it will work fine.
<?php
$timestamp
= strtotime(str_replace('/', '-', '27/05/1990'));
?>
*/

[red., derick]: What you instead should do is:

<?php
$date
= date_create_from_format('d/m/y', '27/05/1990');
?>

That does not make it a timestamp, but a DateTime object, which is much more versatile instead.
up
15
joe at strtotime dot co dot uk
9 years ago
A useful testing tool for strtotime() and unix timestamp conversion:
http://strtotime.co.uk/
up
47
cristinawithout
12 years ago
WARNING when using "next month", "last month", "+1 month",  "-1 month" or any combination of +/-X months. It will give non-intuitive results on Jan 30th and 31st.

As described at : http://derickrethans.nl/obtaining-the-next-month-in-php.html

<?php
$d
= new DateTime( '2010-01-31' );
$d->modify( 'next month' );
echo
$d->format( 'F' ), "\n";
?>

In the above, using "next month" on January 31 will output "March" even though you might want it to output "February". ("+1 month" will give the same result. "last month", "-1 month" are similarly affected, but the results would be seen at beginning of March.)

The way to get what people would generally be looking for when they say "next month" even on Jan 30 and Jan 31 is to use "first day of next month":

<?php
$d
= new DateTime( '2010-01-08' );
$d->modify( 'first day of next month' );
echo
$d->format( 'F' ), "\n";
?>

<?php
$d
= new DateTime( '2010-01-08' );
$d->modify( 'first day of +1 month' );
echo
$d->format( 'F' ), "\n";
?>
up
2
marlonsouza90 at hotmail dot com
3 years ago
strtotime();

exemplo strtotime(date("Y-m-d") . "+1month");

A strtotime também funciona quando concatenamos strings,
up
21
michal dot kocarek at brainbox dot cz
14 years ago
strtotime() also returns time by year and weeknumber. (I use PHP 5.2.8, PHP 4 does not support it.) Queries can be in two forms:
- "yyyyWww", where yyyy is 4-digit year, W is literal and ww is 2-digit weeknumber. Returns timestamp for first day of week (for me Monday)
- "yyyy-Www-d", where yyyy is 4-digit year, W is literal, ww is 2-digit weeknumber and dd is day of week (1 for Monday, 7 for Sunday)

<?php
// Get timestamp of 32nd week in 2009.
strtotime('2009W32'); // returns timestamp for Mon, 03 Aug 2009 00:00:00
// Weeknumbers < 10 must be padded with zero:
strtotime('2009W01'); // returns timestamp for Mon, 29 Dec 2008 00:00:00
// strtotime('2009W1'); // error! returns false

// See timestamp for Tuesday in 5th week of 2008
strtotime('2008-W05-2'); // returns timestamp for Tue, 29 Jan 2008 00:00:00
?>

Weeknumbers are (probably) computed according to ISO-8601 specification, so doing date('W') on given timestamps should return passed weeknumber.
up
9
shannon
5 years ago
I tried using sams most popular example but got incorrect results.

Incorrect:
<?php
echo date("jS F, Y", strtotime("11.12.10"));
// outputs 10th December, 2011

echo date("jS F, Y", strtotime("11/12/10"));
// outputs 12th November, 2010

echo date("jS F, Y", strtotime("11-12-10"));
// outputs 11th December, 2010 
?>

Then I read the notes which said:
if the separator is a slash (/), then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.), then the European d-m-y format is assumed. ***If, however, the year is given in a two digit format and the separator is a dash (-), the date string is parsed as y-m-d.***

Therefore, the above code does not work on 2 digit years - only 4 digit years
up
3
Steve GS
6 years ago
The difference between 'today' and 'now' is the former strips off the time (setting it to 00:00, ie. midnight just past), and the latter includes the time - assuming UTC unless specified otherwise.

I run a theatre's website.  Obviously, I need to ensure shows that have already happened do not appear on web pages, so I use something on the lines of:

    $listIt = (strtotime($end_date) >= strtotime('today') ? 1 : 0);

where $end_date is the final date in a show series.  So if tonight's show is the last, it will stay on the web page until 00:00 tomorrow.

I don't normally include performance times in the date field because some shows have matinées, others don't - so I use a free-form performance time field in the CMS instead (where even 'Time: TBD' is allowed).  [The only instance where I DO include the time is when there are two different shows on the same day, to ensure they appear in chronological order.]

So strtotime($end_date) will always return the timestamp at 00:00 that day.  If I instead used:

    $listIt = (strtotime($end_date) >= strtotime('now') ? 1 : 0);

the function would return $listIt = 0 at all times today - something I don't want.

HTH
up
3
mirco dot babin at gmail dot com
5 years ago
One important thing you should remember is that the timestamp value returned by time() is time-zone agnostic and gets the number of seconds since 1 January 1970 at 00:00:00 UTC. This means that at a particular point in time, this function will return the same value in the US, Europe, India, Japan, ...

strtotime() will convert a string WITHOUT a timezone indication as if the string is a time in the default timezone ( date_default_timezone_set() ). So converting a UTC time like '2018-12-06T09:04:55' with strtotime() actually yields a wrong result. In this case use:

<?php
function UTCdatestringToTime($utcdatestring)
{
   
$tz = date_default_timezone_get();
   
date_default_timezone_set('UTC');

   
$result = strtotime($utcdatestring);

   
date_default_timezone_set($tz);
    return
$result;
}
?>

Test:
<?php
$tz
= 'Europe/Amsterdam';
$utctime = '2018-12-06T09:04:55';

if (!
date_default_timezone_set($tz)) {
   
WriteLine('Setting default timezone to ' . $tz . ' failed');
    die;
}

WriteLine();
WriteLine('Default timezone set to ' . $tz);
WriteLine('UTC time: ' . $utctime);
WriteLine();

WriteLine('[ UTCdatestringToTime ]');
$phptime = UTCdatestringToTime($utctime);
WriteLine('PHP time: ' . $phptime);
WriteTime($phptime, true);
WriteTime($phptime, false);
WriteLine();

WriteLine('-------------------------------------------------------------------------------');
WriteLine('[ strtotime($utctime) - Converts $utctime as if it was in timezone ' . $tz . ' because the string has no timezone specification ]');
$phptime = strtotime($utctime); //Seconds since the unix epoch
WriteLine('PHP time: ' . $phptime);
WriteTime($phptime, true);
WriteTime($phptime, false);

function
WriteLine($text = '')
{
    echo
$text . "\r\n";
}

function
WriteTime($time, bool $asUTC)
{
   
$tz = date_default_timezone_get();
    if (
$asUTC) date_default_timezone_set('UTC');
   
   
WriteLine('--> (' . date_default_timezone_get() . ') ' . date('Y-m-d H:i:s', $time));
   
    if (
$asUTC) date_default_timezone_set($tz);
}
?>

Test output:
<?php

Default timezone set to Europe/Amsterdam
UTC time
: 2018-12-06T09:04:55

[ UTCdatestringToTime ]
PHP time: 1544087095
--> (UTC) 2018-12-06 09:04:55
--> (Europe/Amsterdam) 2018-12-06 10:04:55

-------------------------------------------------------------------------------
[
strtotime($utctime) - Converts $utctime as if it was in timezone Europe/Amsterdam because the string has no timezone specification ]
PHP time: 1544083495
--> (UTC) 2018-12-06 08:04:55
--> (Europe/Amsterdam) 2018-12-06 09:04:55
*/
?>
up
7
Killermonk
14 years ago
You are not restricted to the same date ranges when running PHP on a 64-bit machine. This is because you are using 64-bit integers instead of 32-bit integers (at least if your OS is smart enough to use 64-bit integers in a 64-bit OS)

The following code will produce difference output in 32 and 64 bit environments.

var_dump(strtotime('1000-01-30'));

32-bit PHP: bool(false)
64-bit PHP: int(-30607689600)

This is true for php 5.2.* and 5.3

Also, note that the anything about the year 10000 is not supported. It appears to use only the last digit in the year field. As such, the year 10000 is interpretted as the year 2000; 10086 as 2006, 13867 as 2007, etc
up
8
me at will morgan dot co dot you kay
11 years ago
For negative UNIX timestamps, strtotime seems to return the literal you passed in, or it may try to deduct the number of seconds from today's date.

To work around this behaviour, it appears that the same behaviour as described in the DateTime classes applies:

http://php.net/manual/en/datetime.construct.php

Specifically this line here (in the EN manual):

> The $timezone parameter and the current timezone are ignored when the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00).

Therefore strtotime('@-1000') returns 1000 seconds before the epoch.

Hope this helps.
up
4
chris at teamsiems dot com
14 years ago
It took me a while to notice that strtotime starts searching from just after midnight of the first day of the month. So, if the month starts on the day you search for, the first day of the search is actually the next occurrence of the day.

In my case, when I look for first Tuesday of the current month, I need to include a check to see if the month starts on a Tuesday.

<?php
if (date("l", strtotime("$thisMonth $thisYear"))=='Tuesday') {
  echo
"<p>This month starts on a Tuesday. Use \"$thisMonth $thisYear\" to check for first Tuesday.</p>\n";
} else {
  echo
"<p>This month does not start on a Tuesday. Use \"first tuesday $thisMonth $thisYear\" to check for first Tuesday.</p>\n";
}
?>
up
3
a dot fruchi at bit-runners dot com
13 years ago
If you want to confront a date stored into mysql as a date field (not a datetime) and a date specified by a literal string, be sure to add "midnight" to the literal string, otherwise they won't match:

<?php
//I.E.: today is 17/02/2011

echo strtotime('2011-01-01'); //1293836400
echo strtotime('first day of last month'); //1293888128 Note: it's different from the previous one, since it computes also the seconds passed from midnight!!! So this one is always greater than simple '2011-01-01'
echo strtotime('midnight first day of last monty');//1293836400 Note: it's the same as '2011-01-01'

?>
up
1
vlad dot savitsky at gmail dot com
5 years ago
Little bit unexpected behaviour for me. Small integers treats like time.
strtotime(0) => false,
strtotime(1) => false,
strtotime(12) => false,
strtotime(123) => false,
strtotime(1234) => 1528194840, //Time '12:34'
strtotime(12345) => false,
strtotime(123456) => 1528194896, // Time '12:34:56'
strtotime(1234567) => false,
strtotime(12345678) => false,
strtotime(123456789) => false,
up
5
kyle at frozenonline dot com
20 years ago
I was having trouble parsing Apache log files that consisted of a time entry (denoted by %t for Apache configuration). An example Apache-date looks like: [21/Dec/2003:00:52:39 -0500]

Apache claims this to be a 'standard english format' time. strtotime() feels otherwise.

I came up with this function to assist in parsing this peculiar format.

<?php
function from_apachedate($date)
{
        list(
$d, $M, $y, $h, $m, $s, $z) = sscanf($date, "[%2d/%3s/%4d:%2d:%2d:%2d %5s]");
        return
strtotime("$d $M $y $h:$m:$s $z");
}
?>

Hope it helps anyone else seeking such a conversion.
up
3
x at xero dot nu
13 years ago
strtotime is awesome for converting dates.
in this example i will make an RSS date, an
ATOM date, then convert them to a human
readable m/d/Y dates.

<?php
$rss
= date("r");
$atom = date("c");
$human1 = date('m/d/Y', strtotime($rss));
$human2 = date('m/d/Y', strtotime($atom));

echo
$rss."<br />".$atom."<br />".$human1."<br />".$human2;
?>
up
4
Michael Muryn (MickoZ)
12 years ago
[red.: This is a bug, and should be fixed. I have file an issue]

This comment apply to PHP5+

We can now do thing like this with strtotime:
<?php
$weekMondayTime
= strtotime('Monday this week');
?>
However this works based on a week starting Sunday.  I do not know if we can tweak this PHP behavior, anyone know?

If you want the timestamp of the start of the ISO Week (i.e. on Monday) as defined by ISO 8601, you can use this one liner:
<?php
$isoWeekStartTime
= strtotime(date('o-\\WW')); // {isoYear}-W{isoWeekNumber}
?>

You can also find out the start of week of any time and format it into an ISO date with another one liner like this:
<?php
$isoWeekStartDate
= date('Y-m-d', strtotime(date('o-\\WW', $time)));
?>

For more information about ISO-8601 and ISO week date:
http://en.wikipedia.org/wiki/ISO_8601#Week_dates
http://en.wikipedia.org/wiki/ISO_week_date
up
3
Anonymous
14 years ago
This function DOES NOT work from left-to-right as one would think. This function parses the string as a whole, then applies the intervals by size (year, month, ...). Take the following example:

<?php
$Date
= strtotime('2011-02-22'); // February 22nd, 2011. 28 days in this month, 29 next year.
echo date('n/j/Y', strtotime('+1 year, +7 days', $Date)); // add 1 year and 7 days. prints 2/29/2012
echo "<br />";
echo
date('n/j/Y', strtotime('+7 days, +1 year', $Date)); // add 7 days and 1 year, but this also prints 2/29/2012
echo "<br />";
echo
date('n/j/Y', strtotime('+1 year', strtotime('+7 days', $Date))); // this prints 3/1/2012, what the 2nd would do if it was left-to-right
?>
up
3
php at davidstockton dot com
14 years ago
Adding a note to an already long page:

Try to be as specific as you can with the string you pass in.  For example

<?php
echo date('F', strtotime('February'));
?>

is not specific enough.  Depending on the day of the month, you may get a different response.  For a non-leap year, you'll get March if the _current day of the month_ is the 29th, 30th or 31st.  If it's a leap year, you'll get March on the 30th or 31st of the month.  The same thing will happen on the 31st of any month when you pass in the name of any month with less than 31 days.  This happens because the strtotime() function will fill in missing parts from the current day.

Assuming today is July 31, the timestamp returned by strtotime('February') will ultimately be seen as February 31 (non-existant obviously), which then is interpreted as March 3, thus giving a month name of March.

Interestingly, adding the year or the day will give you back the expected month.
up
2
nyctimus at yahoo dot com
13 years ago
strtotime() produces different output on 32 and 64 bit systems running PHP 5.3.3 (as mentioned previously).  This affects the "zero date" ("0000-00-00 00:00:00") as well as dates outside the traditional 32 date range.

strtotime("0000-00-00 00:00:00") returns FALSE on a 32 bit system.
strtotime("0000-00-00 00:00:00") returns -62169955200 on a 64 bit system.
up
0
berniev
3 years ago
In modern 64-bit systems (tested on mac) the old 1970 to 2038 date range limitations are gone.

strtotime("0001-10-30") gives int(-62109540728)
strtotime("6788-10-30") gives int(152067506400)
up
-2
Anonymous
3 years ago
I appreciate all the DateTime responses but I do not get an accurate system date from DateTime only from strtotime in linux
up
1
marcodemaio at vanylla dot it
13 years ago
NOTE: strtotime returns different values when the Week day does not match the date.

Simple example:

<?php
$d1
= strtotime("26 Oct 0010 12:00:00 +0100");
$d2 = strtotime("Tue, 26 Oct 0010 12:00:00 +0100");
$d3 = strtotime("Sun, 26 Oct 0010 12:00:00 +0100"); //But Oct 26 is a Tuesday, NOT a Sunday.

echo $d1; //ok 1288090800 that is "26 Ott 2010 - 11:00";
echo $d2; //ok 1288090800 that is "26 Ott 2010 - 11:00";
echo $d3; //WRONG! 1288522800 that is "31 Ott 2010 - 11:00";
?>

Sometime I found RSS feeds that contains week days that do not match the date.

A possible solution is to remove useless week day before passing the date string into strtotime, example:

<?php
   $date_string
= "Sun, 26 Oct 0010 12:00:00 +0100";
   if( (
$comma_pos = strpos($date_string, ',')) !== FALSE )
     
$date_string = substr($date_string, $comma_pos + 1);
  
$d3 = strtotime($date_string);
?>
up
0
Aleksandr
5 years ago
We can get timestamp from RFC 2822:

<?php

$time
= strtotime('Mon, 30 Jun 2014 11:30:00 +0400'); // timestamp from RFC 2822
echo date('Y-m-d H:i:s', $time); // 2014-06-30 10:30:00

?>
up
0
trurl at mcbyte dot net
8 years ago
Be carefull with weekdays names
<?php echo date('r',strtotime("Thursday 01:15")), "\n"; ?>
returns something like "Thu, 17 Mar 2016 01:15:00 +0200"
but
<?php echo date('r',strtotime("Thursdays 01:15")), "\n"; ?>
returns "Thu, 17 Mar 2016 09:15:00 +0200".

So "s" at end mean "+8 hours".
up
1
Annomoys
12 years ago
Strtotime() can be used to loop through date range.
as follows

<?php
$start
= strtotime('2009-02-01');
$end = strtotime('2009-03-10');
$date = $start;
while(
$date < $end)
{

  
//write your code here
  
$date = strtotime("+1 day", $date);(counter)

}

?>
up
0
fuhrysteve at gmail dot com
14 years ago
Here's a hack to make this work for MS SQL's datetime junk, since strtotime() has issues with fractional seconds.

<?php

$MSSQLdatetime
= "Feb  7 2009 09:48:06:697PM";
$newDatetime = preg_replace('/:[0-9][0-9][0-9]/','',$MSSQLdatetime);
$time = strtotime($newDatetime);
echo
$time."\n";

?>
up
-1
gabriel dot rempel at gmail dot com
9 years ago
// small function auto detect to convert date

function formatDate($date)
{
    if (strpos($date,'/') !== false) :
        $date = str_replace('/', '-', $date);
        $date = date('Y-m-d h:i:s', strtotime($date));
    else :
        $date = date('d-m-Y h:i:s', strtotime($date));
        $date = str_replace('-', '/', $date);
    endif;
    return $date;
}
up
-4
peixoto at live dot com
10 years ago
<?php strtotime('-5 weeks monday') ?> returns the monday of 5 weeks ago.
up
-3
Travis Pulley
14 years ago
Be aware that if you are running 5.2.8, there is a memory leak with this function and it could cost someone valuable time finding out what the problem was. Per usual, running the latest (minor) version tends to be a good idea.

See here: http://bugs.php.net/bug.php?id=46889
up
-4
kooshal at live dot com
14 years ago
when using PHP 5.3, you must use date_default_timezone_set() to set the time zone otherwise you will get warning similar to this (if you have display_errors=On)—

Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Dubai' for '4.0/no DST' instead in path/to/php/script.php
on line ##

Example:
date_default_timezone_set('Indian/Mauritius');

For a list of supported timezones in PHP, see http://www.php.net/manual/en/timezones.php
up
-6
Anonymous
10 years ago
Be aware that you cannot rely on this function alone to validate a date, as it will accept insane dates like the 31st of February.

Also, the '... week' functionality by itself may not do what you expect. If used on a Sunday, 'next week' will not return a timestamp of the next Monday, but of the Monday after that. Similarly, a timestamp for the Monday of the current week is returned when 'previous/last week' is used and 'this week' returns a stamp of the Monday of the next week (i.e. the following day). This is not the 'week starts on Sunday' effect, as that would mean all the timestamps returned would have to be on a Sunday and none of them are.
up
-4
ivijan dot stefan at gmail dot com
6 years ago
In some countries I noticed that people storing in database strings like 20h or 20u what is equal to 20:00 and 21h30 or 21u30 what is equal to 21:30.

strtotime() not understand that string and comparing or time modulation can be tricky. Because of that I wrote one good solution for it:

<?php

function bo_strtotime($string)
{
    if(
preg_match('/([0-9]+)[uh]{1}/i',$string))
    {
       
$string = preg_replace(array('/[uh]/i','/:(?![0-9]+)/'), array(':',':00'), $string);
    }
   
    return
strtotime($string);
}

?>

This small function acts same like strtotime() only it accept 20u and 20h and convert into normal time, after that in normal unix timestamp.
up
-7
viper7 at viper-7 dot com
14 years ago
Observed date formats that strtotime expects, it can be quite confusing, so hopefully this makes things a little clearer for some.

mm/dd/yyyy - 02/01/2003  - strtotime() returns : 1st February 2003
mm/dd/yy   - 02/01/03    - strtotime() returns : 1st February 2003
yyyy/mm/dd  - 2003/02/01 - strtotime() returns : 1st February 2003
dd-mm-yyyy - 01-02-2003  - strtotime() returns : 1st February 2003
yy-mm-dd   - 03-02-01    - strtotime() returns : 1st February 2003
yyyy-mm-dd - 2003-02-01  - strtotime() returns : 1st February 2003
up
-2
Sui Dream
6 years ago
It was really pazzling to me to read about parsing a string into a Unix timestamp relative to both January 1 1970 00:00:00 UTC and the second parameter. Maybe it worth noting that the second parameter is for relative dates (like "+1 day").
up
-5
Andrey Kabakchiev
8 years ago
Actually the top-voted comment from 'sam at frontiermedia dot net dot au' is not quite right, as is the documentation Note. The correct assumptions made by strtotime() are:

Forward slashes (/) assume US formatted dates, e.g mm/dd/yy

Periods (.) assume Non-US dates, e.g dd.mm.yy

Hypens (-) assume ISO 8601 (ATOM) formatted dates, e.g yy-mm-dd
up
-12
Tim
13 years ago
Unlike "yesterday 14:00", "14:00 yesterday" will return 00:00 of yesterday.
up
-6
alex at newpathconsulting dot com
7 years ago
Be careful when sending a NULL string to strtotime() - it evaluates NULL to 0 and thus returns the UNIX timestamp at 0 (December 31, 1969).

Can evaluate the string first like so ($dateString contains string):

$dateString ? date('d-m-Y', strtotime($dateString ))
up
-5
jhonnymakis at gmail dot com
6 years ago
Should output '2017-06-30' but show '2017-07-01'

$d = new DateTime( '2017-07-31' );
$d->modify( 'last month' );
echo $d->format( 'Y-m-d' );
up
-17
sgutauckis
17 years ago
The following might produce something different than you might expect:
<?php
   
echo date('l, F jS Y', strtotime("third wednesday", strtotime("2006-11-01"))) . "<br>";
    echo
date('l, F jS Y', strtotime("third sunday", strtotime("2006-01-01")));
?>
Produces:
Wednesday, November 22nd 2006
Sunday, January 22nd 2006

The problem stems from strtotime when the requested day falls on the date passed to strtotime. If you look at your calendar you will see that they should return:

Wednesday, November 15th 2006
Sunday, January 15th 2006

Because the date falls on the day requested it skips that day.
To Top