PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

strftime> <microtime
Last updated: Fri, 18 Jul 2008

view this page in

mktime

(PHP 4, PHP 5)

mktime — Get Unix timestamp for a date

Description

int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )

Returns the Unix timestamp corresponding to the arguments given. This timestamp is a long integer containing the number of seconds between the Unix Epoch (January 1 1970 00:00:00 GMT) and the time specified.

Arguments may be left out in order from right to left; any arguments thus omitted will be set to the current value according to the local date and time.

Parameters

hour

The number of the hour.

minute

The number of the minute.

second

The number of seconds past the minute.

month

The number of the month.

day

The number of the day.

year

The number of the year, may be a two or four digit value, with values between 0-69 mapping to 2000-2069 and 70-100 to 1970-2000. On systems where time_t is a 32bit signed integer, as most common today, the valid range for year is somewhere between 1901 and 2038. However, before PHP 5.1.0 this range was limited from 1970 to 2038 on some systems (e.g. Windows).

is_dst

This parameter can be set to 1 if the time is during daylight savings time (DST), 0 if it is not, or -1 (the default) if it is unknown whether the time is within daylight savings time or not. If it's unknown, PHP tries to figure it out itself. This can cause unexpected (but not incorrect) results. Some times are invalid if DST is enabled on the system PHP is running on or is_dst is set to 1. If DST is enabled in e.g. 2:00, all times between 2:00 and 3:00 are invalid and mktime() returns an undefined (usually negative) value. Some systems (e.g. Solaris 8) enable DST at midnight so time 0:30 of the day when DST is enabled is evaluated as 23:30 of the previous day.

Note: As of PHP 5.1.0, this parameter became deprecated. As a result, the new timezone handling features should be used instead.

Return Values

mktime() returns the Unix timestamp of the arguments given. If the arguments are invalid, the function returns FALSE (before PHP 5.1 it returned -1).

Errors/Exceptions

Every call to a date/time function will generate a E_NOTICE if the time zone is not valid, and/or a E_STRICT message if using the system settings or the TZ environment variable. See also date_default_timezone_set()

ChangeLog

Version Description
3.0.10 Added is_dst parameter
5.1.0 The is_dst parameter became deprecated. Made the function return FALSE on error, instead of -1. Fixed the function to accept the year, month and day to be all passed as zero.
5.1.0

Now issues the E_STRICT and E_NOTICE time zone errors.

Examples

Example #1 mktime() example

mktime() is useful for doing date arithmetic and validation, as it will automatically calculate the correct value for out-of-range input. For example, each of the following lines produces the string "Jan-01-1998".

<?php
echo date("M-d-Y"mktime(00012321997));
echo 
date("M-d-Y"mktime(0001311997));
echo 
date("M-d-Y"mktime(000111998));
echo 
date("M-d-Y"mktime(0001198));
?>

Example #2 Last day of next month

The last day of any given month can be expressed as the "0" day of the next month, not the -1 day. Both of the following examples will produce the string "The last day in Feb 2000 is: 29".

<?php
$lastday 
mktime(000302000);
echo 
strftime("Last day in Feb 2000 is: %d"$lastday);
$lastday mktime(0004, -312000);
echo 
strftime("Last day in Feb 2000 is: %d"$lastday);
?>

Notes

Caution

Before PHP 5.1.0, negative timestamps were not supported under any known version of Windows and some other systems as well. Therefore the range of valid years was limited to 1970 through 2038.



strftime> <microtime
Last updated: Fri, 18 Jul 2008
 
add a note add a note User Contributed Notes
mktime
Scott Wallace
01-Jun-2008 06:34
Here's a function I made to make an array containing all days in a given year:

<?php

# Usage:  generateYearArray(int $fyear);
# $fyear is the year that you want dates for.

function generateYearArray($fyear) {
 
$feb = cal_days_in_month(CAL_GREGORIAN, 2, $fyear);
 
$daysInYear = ($feb === 29) ? 366 : 365;
 
$array = array();
 while (
$daysInYear > 0) {
 
$array[] = date("Y-m-d", mktime(0, 0, 0, 1, $daysInYear, $fyear));
 
$daysInYear--;
 }
 
sort($array);
 return
$array;
}

?>

Example:

    generateYearArray(2008);

should return an array like:

Array(
 [0] => "2008-01-01",
 [1] => "2008-01-02",
 ...
 [363] => "2008-12-29",
 [364] => "2008-12-30",
 [365] => "2008-12-31"
)

This function is released into the public domain.
jhuntech09 at yahoo dot com
22-May-2008 01:34
This script is for creating servertime with auto detect server timezone.

<?php

    $month
= date(m); //* Get Current Month //
   
$day = date(j); //* Get Current Day //
   
$year = date(Y); //* Get Current Year //
   
$hour = date(G); //* Get Current Hour (24 Hours Format) //
   
$min = date(i); //* Get Current Minutes //
   
$sec = date(s); //* Get Current Seconds //
   
$gmt = date(O); //* Get Current Timezone //
   
$servertime = date("D \\- M j\\, Y \\- g:i A", mktime($hour+$gmt, $minutes, $sec, $month, $day, $year, 0));
    print
$servertime;

?>

If you want to input a multiple timezone. just copy the "$gmt = date(O). Then add increments to "$gmt" and replace the "date(O)" to any timezone you want.

For example:

I need only 2 timezone, Standard GMT and Pacific Timezone.

I will remove "$gmt" and replace it with "$gmt1" and "$gmt2".

Then for "$gmt1" I will replace the "date(O)" with 0, so my Timezone1 is equal to Standard GMT.

Then for "$gmt2" I will replace the "date(O)" with -8, so my Timezone2 is equal to Pacific Timezone.

To get the output for two timezone we need also two output script.

<?php
   
echo date("D \\- M j\\, Y \\- g:i A", mktime($hour+$gmt1, $minutes, $sec, $month, $day, $year, 0));
    echo
date("D \\- M j\\, Y \\- g:i A", mktime($hour+$gmt2, $minutes, $sec, $month, $day, $year, 0));
?>

Enjoy scripting,
-JhunTech09
thomas_corthals at hotmail dot com
13-May-2008 03:34
It seems mktime() doesn't return negative timestamps on Linux systems with a version of glibc <= 2.3.3.
Stefan Bechtold
21-Mar-2008 02:05
Another useful function that I have created years ago. Useful for all calendar applications, if you have to switch to a date given by a week number and a specific day (e.g. tuesday in week 12: mktimefromcw(2008, 12, 2)).

<?php
/**
 * @return timestamp
 * @param integer year
 * @param integer woy
 * @param integer dow
 * @desc This function retrieves the time for the given year, week of year and day of the week and returns it.
 */
function mktimefromcw($year, $woy=1, $dow=1) {
 
# $year = year (four digits)
  # $woy  = week of the year (1..53)
  # $dow  = day of the week (1..7)

 
$dow = ($dow) % 7;
 
$woy = ($woy) - 1;

 
# Get reference value (this is the first monday of the first week of the year, not easy to calculate)
 
$fdoy_timestamp = mktime(0,0,0,1,1,$year);
 
$fdoy = ((date("w", $fdoy_timestamp) + 6) % 7) + 1;

  if(
$fdoy == 1) {
   
# This first day of the year is a monday
   
$fcwstart = $fdoy_timestamp;
  }
  elseif(
$fdoy < 5) {
   
# The first day if before Friday, therefor the first Monday can be found in the previos year (this is no fun, believe in it!).
   
$fcwstart = strtotime("last Monday", $fdoy_timestamp);
  }
  else {
   
# The first day is a friday or later, so the first days belong to calender week 53 (yes, this is possible!) of the previous year, do not count them for this year.
   
$fcwstart = strtotime("next Monday", $fdoy_timestamp);
  }

 
# Create timestamp
 
$timestr = date("d F Y", $fcwstart)." +$woy week +$dow day";
 
$time = strtotime($timestr);

 
# Return timestamp
 
return $time;
}
?>
Saidur Rahman (Rana)
17-Mar-2008 06:13
Here some example i have implemented. I think it will be helpful someone

<?php
   
function fullDateFormat( $value ){
       
$d = explode("-", $value);
       
$cdate = date ("F j, Y", mktime (0,0,0,$d[1],$d[2],$d[0]));
        echo
$cdate;
    }
//-----Enter date format like mysql date (e.g. 2000-01-30)------//
fullDateFormat("2008-03-17");
//Output like: March 17, 2008

   
function detailsDateFormat( $value ){
       
$d = explode("-", $value);
       
$cdate = date ("l F j, Y", mktime (0,0,0,$d[1],$d[2],$d[0]));
        echo
$cdate;
    }
//-----Enter date format like mysql date (e.g. 2000-01-30)------//
detailsDateFormat("2008-03-17");
//Output like: Monday March 17, 2008
?>
blackdog
05-Mar-2008 09:45
Converting date() style strings to unix epoch time was giving me an "A non well formed numeric value encountered in" error. Simply resolved with an (int) call on the string:

<?php
$ue_time
= time();
$old_date = date('Y-m-d');
$old_time = date('h:i');
$new_date = str_replace('-', ', ', $old_date);
$new_time = str_replace(':', ', ', $old_time);
$convert_date = $new_time.', '.$new_date;
$convert_date = (int)$convert_date;
$converted = mktime ($convert_date);
echo
$ue_time.' vs '.$old_date.' '.$old_time.' converted = '.$converted;
?>
JSantilln elquenovotoporfox at hotmail
20-Feb-2008 09:21
<?php
//Beware of this when comparing dates:

function daysBetween($date1, $date2)
{
   
$d1 = explode("-", $date1);
   
$d2 = explode("-", $date2);
  
   
$year1 = $d1[0];
   
$month1 = $d1[1];
   
$day1 = $d1[2];

   
$year2 $d2[0];
   
$month2 = $d2[1];
   
$day2 = $d2[2];
   
   
$deadline1 = mktime(0, 0, 0, $month1, $day1, $year1, 0);
   
$deadline2 = mktime(0, 0, 0, $month2, $day2, $year2, 0);

   
/* If you dont put 0 at last parameter both mktime calls, and
       a Daylight Saving Time is not specified,
       a float days number can be returned. Is better to pass 0
       in both mktimes and round the result: */
   
   
$res = round( ($deadline2 - $deadline1) / (60 * 60 * 24) );
    return
$res;
}
/* My Test dates: */
echo daysBetween('2008-3-5','2008-3-11');

?>
joseph dot andrew dot hughes at gmail dot com
30-Jan-2008 08:58
Just a small thing to think about if you are only trying to pull the month out using mktime and date.  Make sure you place a 1 into day field.  Otherwise you will get incorrect dates when a month is followed by a month with less days when the day of the current month is higher then the max day of the month you are trying to find.. (Such as today being Jan 30th and trying to find the month Feb.)
Tiago Valdo
17-Jan-2008 06:42
Taking a sample from a fellow poster a bit up, I've made this quite simple MYSQL date to timestamp which will convert both date or date/time fields.

<?php
function MySQLtoTimestamp($mysqlDate) {
    if (
strlen($mysqlDate) > 10) {
        list(
$year, $month, $day_time) = explode('-', $mysqlDate);
        list(
$day, $time) = explode(" ", $day_time);
        list(
$hour, $minute, $second) = explode(":", $time);
       
$ts = mktime($hour, $minute, $second, $month, $day, $year);
    } else {
        list(
$year, $month, $day) = explode('-', $mysqlDate);
       
$ts = mktime(0, 0, 0, $month, $day, $year);
    }
    return
$ts;
}
?>
hiten dot barchha at gmail dot com
27-Dec-2007 08:39
There was one requirement of finding recurring date for daily, monthly, quarterly and yearly subscription.
Following is the example to find out next recurring dates.

Logic : Code is taking care of following things.

1. Date is valid date
2. If next recurring date is not valid than it will take last date of month.
3. This code will useful to those who are interested to keep track of recurring payments on his own database
rather than payment gateway.
4. Code will allow you to find dates for daily, monthly, quarterly and yearly.

<?PHP
function getDates($bdate,$duration) {
   
$aDate = explode("-",$bdate);
   
$datetime = mktime(0, 0, 0, $aDate[1], $aDate[2], $aDate[0]);

    switch(
$duration) {
        case
0:
            for(
$i=0;$i<12;$i++) {
               
$nextmonth = date("Y-m-d",mktime(0, 0, 0, date("m",$datetime),
                            
date("d",$datetime)+1+$i,   date("Y",$datetime)));
                echo
$nextmonth."<br><br>";
            }
            break;
        case
1:
            for(
$i=0;$i<12;$i++) {
               
$tempnextmonth = ($aDate[1]+1+$i)%12;
                if(
$tempnextmonth == 0) {
                   
$tempnextmonth = 12;
                }
               
$nextyear = date("Y",mktime(0, 0, 0, date("m",$datetime)+1+$i,
                           
date("d",$datetime),   date("Y",$datetime)));
                if (
checkdate(str_pad($tempnextmonth,2,0,STR_PAD_LEFT),
                   
$aDate[2],$nextyear) == false) {
                   
                    echo
$nextyear."-".str_pad($tempnextmonth,2,0,STR_PAD_LEFT)."-".
                   
date('d', mktime(0, 0, 0, ($tempnextmonth + 1), 0, $nextyear))
                    .
"<br><br>";
                }
                else {
                    echo
$nextyear."-".str_pad($tempnextmonth,2,0,STR_PAD_LEFT)."-".
                   
$aDate[2]."<br><br>";
                }
            }
            break;   
        case
2:
            for(
$i=0;$i<12;$i++) {
               
$tempnextmonth = ($aDate[1]+4+(4*$i))%12;
                if(
$tempnextmonth == 0) {
                   
$tempnextmonth = 12;
                }
               
$nextyear = date("Y",mktime(0, 0, 0, date("m",$datetime)+4+(4*$i),
                           
date("d",$datetime),   date("Y",$datetime)));
                if (
checkdate(str_pad($tempnextmonth,2,0,STR_PAD_LEFT),
                   
$aDate[2],$nextyear) == false) {
                   
                    echo
$nextyear."-".str_pad($tempnextmonth,2,0,STR_PAD_LEFT)."-".
                        
date('d', mktime(0, 0, 0, ($tempnextmonth + 1), 0, $nextyear)).
                        
"<br><br>";
                }
                else {
                    echo
$nextyear."-".str_pad($tempnextmonth,2,0,STR_PAD_LEFT)."-".
                   
$aDate[2]."<br><br>";
                }
            }
            break;
        case
3:
            for(
$i=0;$i<12;$i++) {
               
$nextmonth = date("Y-m-d",mktime(0, 0, 0, date("m",$datetime),
                            
date("d",$datetime),   date("Y",$datetime)+1+$i));
                echo
$nextmonth."<br><br>";
            }
            break;
    }
}
?>

How to use this function?

<?PHP getDates(date("Y-m-d"),$period); ?>

You can set $period as your recurring period time.

0 - Daily Dates
1 - Monthly Dates
2 - Quarterly Dates
3 - Yearly Dates
topsys at gmail dot com
18-Nov-2007 02:54
I made this simple class to add/remove time to my subscription service. It makes it easy to make new time without having to write the whole mktime line everytime. I'm posting it here, as it might help somebody.

<?php
class mkTime {
    var
$day = 0;
    var
$month = 0;
    var
$year = 0;
    var
$hour = 0;
    var
$minute = 0;
    var
$sec = 0;
    var
$iniTime;
    var
$returnFormat = "Y-m-d H:i:s";
   
    function
addTime() {
       
$newTime = mktime(
       
date("H",$this->iniTime)+$this->hour,
       
date("i",$this->iniTime)+$this->minute,
       
date("s",$this->iniTime)+$this->sec,
       
date("m",$this->iniTime)+$this->month,
       
date("d",$this->iniTime)+$this->day,
       
date("Y",$this->iniTime)+$this->year
       
);
       
$rtnTime = date($this->returnFormat,$newTime);
        return
$rtnTime;
    }
   
    function
removeTime() {
       
$newTime = mktime(
       
date("H",$this->iniTime)-$this->hour,
       
date("i",$this->iniTime)-$this->minute,
       
date("s",$this->iniTime)-$this->sec,
       
date("m",$this->iniTime)-$this->month,
       
date("d",$this->iniTime)-$this->day,
       
date("Y",$this->iniTime)-$this->year
       
);
       
$rtnTime = date($this->returnFormat,$newTime);
        return
$rtnTime;
    }

}

$t = new mkTime; // call the class
$t->iniTime = time(); // set initial time
$t->year = 1; // add/remove a year
$newTime = $t->addTime(); // call the add time function
echo "$newTime<br/><br/>"; // write result to browser

$t = new mkTime; // call the class
$t->iniTime = time(); // set initial time
$t->year = 1; // add/remove a year
$t->returnFormat = "d/m-Y @ H:i:s"; // time return format
$newTime = $t->removeTime(); // call the remove time function
echo "$newTime<br/><br/>"; // write result to browser
?>
PHPcoder at freemail dot ig3 dot net
06-Sep-2007 06:58
The maximum possible date accepted by mktime() and gmmktime() is dependent on the current location time zone.

For example, the 32-bit timestamp overflow occurs at 2038-01-19T03:14:08+0000Z.  But if you're in a UTC -0500 time zone (such as EST in North America), the maximum accepted time before overflow (for older PHP versions on Windows) is 2038-01-18T22:14:07-0500Z, regardless of whether you're passing it to mktime() or gmmktime().
Jonathan Woodard
31-Aug-2007 03:31
NB: one 'gotcha' with the implementation of mktime()'s parameters:

<?php
for( $i = 1 $i <= 12 ; $i++ )
{
    echo
"Month '$i' is: " . date( "F" , mktime( 0 , 0 , 0 , $i ) ) . "\n";
}
?>
Will output:
Month '1' is: January
Month '2' is: March
Month '3' is: March
Month '4' is: May
Month '5' is: May
Month '6' is: July
Month '7' is: July
Month '8' is: August
Month '9' is: October
Month '10' is: October
Month '11' is: December
Month '12' is: December
on the 31st day of every month.

Why? Because the 5th parameter "day" defaults to "right now," which will not work reliably for days after the 28th.

To make sure this doesn't happen, specify the first day of the month:
<?php
mktime
( 0 , 0 , 0 , $i , 1 )
?>
lb at bostontech dot net
02-Aug-2007 04:46
As per derrick miller's contribution for MySQL date stamps (which equally applies to pgSQL)...  I find this processes a little faster than exploding the string:

(All done in one statement)

<?php
function unix_date($input_date)
    {
// take date string such as "1985-07-25" and return the Unix timestamp
   
return mktime(0, 0, 0, substr($input_date, 5, 2), substr($input_date, 8, 2), substr($input_date, 0,4));
    }
?>
rlz
17-Jul-2007 05:52
Finding out the number of days in a given month and year, accounting for leap years when February has more than 28 days.

<?php
function days_in_month($year, $month) {
    return(
date( "t", mktime( 0, 0, 0, $month, 1, $year) ) );
}
?>

Hope it helps a soul out there.
mike at mike-griffiths dot co dot uk
11-Jul-2007 02:04
It may be useful to note that no E_WARNINGS or E_NOTICES are give if you specify a date <1901 or >2038 on systems where time_t is a 32bit signed integer.

If a date is specified outside of the allowed range you may get some unexpected results as no timestamp will be returned.
Julian
08-Apr-2007 10:29
Simple date compare:

mktime(0, 0, 0) >= mktime(0, 0, 0, $_POST['MonthVld'], $_POST['DayVld'], $_POST['YrVld'])

mktime(0, 0, 0)  creates a unix time of the current date.

mktime(0, 0, 0, $_POST['MonthVld'], $_POST['DayVld'], $_POST['YrVld']) creates a unix time of the date that your user enters.
rga at merchantpal dot com
31-Mar-2007 05:46
You cannot simply subtract or add month VARs using mktime to obtain previous or next months as suggested in previous user comments (at least not with a DD > 28 anyway).

If the date is 03-31-2007, the following yeilds March as a previous month. Not what you wanted.

<?php
$dateMinusOneMonth
= mktime(0, 0, 0, (3-1), 312007 );
$lastmonth = date("n | F", $dateMinusOneMonth);
echo
$lastmonth;    //---> 3 | March
?>

mktime correctly gives you back the 3rd of March if you subtract 1 month from March 31 (there are only 28 days in Feb 07).

If you are just looking to do month and year arithmetic using mktime, you can use general days like 1 or 28 to do stuff like this:

<?php
$d_daysinmonth
= date('t', mktime(0,0,0,$myMonth,1,$myYear));     // how many days in month
$d_year = date('Y', mktime(0,0,0,$myMonth,1,$myYear));        // year
$d_isleapyear = date('L', mktime(0,0,0,$myMonth,1,$myYear));    // is YYYY a leapyear?

$d_firstdow = date('w', mktime(0,0,0,$myMonth,'1',$myYear));     // FIRST falls on what day of week (0-6)
$d_firstname = date('l', mktime(0,0,0,$myMonth,'1',$myYear));     // FIRST falls on what day of week Full Name

$d_month = date('n', mktime(0,0,0,$myMonth,28,$myYear));         // month of year (1-12)
$d_monthname = date('F', mktime(0,0,0,$myMonth,28,$myYear));         // Month Long name (July)
$d_month_previous = date('n', mktime(0,0,0,($myMonth-1),28,$myYear));         // PREVIOUS month of year (1-12)
$d_monthname_previous = date('F', mktime(0,0,0,($myMonth-1),28,$myYear));     // PREVIOUS Month Long name (July)
$d_month_next = date('n', mktime(0,0,0,($myMonth+1),28,$myYear));         // NEXT month of year (1-12)
$d_monthname_next = date('F', mktime(0,0,0,($myMonth+1),28,$myYear));         // NEXT Month Long name (July)
$d_year_previous = date('Y', mktime(0,0,0,$myMonth,28,($myYear-1)));        // PREVIOUS year
$d_year_next = date('Y', mktime(0,0,0,$myMonth,28,($myYear+1)));        // NEXT year

$d_weeksleft = (52 - $d_weekofyear);                     // how many weeks left in year
$d_daysinyear = $d_isleapyear ? 366 : 365;                // set correct days in year for leap years
$d_daysleft = ($d_daysinyear - $d_dayofyear);                // how many days left in year
?>
m dot hoppe at hyperspeed dot de
11-Mar-2007 09:31
This function returns no negative results inside of XEN guests.
Stephen
08-Jan-2007 10:43
There are several warnings here about using mktime() to determine a date difference because of daylight savings time. However, nobody seems to have mentioned the other obvious problem, which is leap years.

Leap years mean that any effort to use mktime() and time() to determine the age (positive or negative) of some timestamp in years will be flawed. There are some years that are 366 days long, therefore you cannot say that there is a set number of seconds per year.

Timestamps are good for determining *real* time, which is not the same thing as *human calendar* time. The Gregorian calendar is only an approximation of real time, which is tweaked with daylight savings time and leap years to make it conform more to humans' expectations of how time should or ought to work. Timestamps are not tweaked and therefore are the only authoritative way of recording in computers a proper order of succession of events, but they cannot be integrated with a Gregorian system unless you take both leap years and DST into account. Otherwise, you may get the wrong number of years when you are approaching a value of exactly X years.

As for PHP, you could still use timestamps as a way of determining age if you took into account not only DST but also whether or not each year is a leap year and adjusted your calculations accordingly. However, this could become messy and inefficient.

There is an alternative approach to calculating days given the day, month and year of the dates to be compared. Compare the years first, and then compare the month and day - if the month and day have already passed (or, if you like, if they match the current month and day), then add 1 to the total for the years.

This solution works because it stays within the Gregorian system and doesn't venture into the world of timestamps.

Here is a good discussion of this issue:

http://forums.devshed.com/php-development-5/
need-to-get-the-age-between-dob-
and-today-29925.html?&highlight=age+leap

[the above link was too long; combine the three lines to get the URL]

There is also the issue of leap seconds, but this will only arise if you literally need to get the *exact* age in seconds. In that case, of course, you would also need to verify that your timestamps are exactly correct and are not delayed by script processing time, plus you would need to determine whether your system conforms to UTC, etc. I expect this will hardly be an issue for anybody using PHP, however if you are interested there is an article on this issue on Wikipedia:

http://en.wikipedia.org/wiki/Leap_second
jsebfranck
07-Nov-2006 12:42
There are several notes for mktime which use the number 86400 to differentiate two days. However this technique may pose a problem in case there is a day where the hour change between the two dates to compare.

Consequently, if you want the timestamp difference between the day where the hour change and the next day, it will not be equals to 86400 but either 82800 in case its the winter change of hour day or 90000 for the summer change of hour day.

For example in 2006 :

<?php
echo mktime(0,0,0,10,29,2006) - mktime(0,0,0,10,30,2006); // -90 000
?>
php at jaggard dot org dot uk
31-Oct-2006 09:28
As I see it, this function should default to zero for the first 3 arguments but one for the next two.

It makes sense to talk about the 0th hour of the day (midnight) or the 0th minute of the hour or the 0th second of the minute, but it makes no sense to talk about the 0th day of the month or the 0th month of the year.

The example of why this change should happen is below:
<select id="month" name="month">
  <?php
   
for ($i = 1; $i <= 12; $i++)
      echo
'<option value="'.$i.'">'.date('F',mktime(0,0,0,$i)).'</option>';
 
?>
</select>

Produces a list of meaningless months. To make it useful, you have to add an extra argument to mktime.
<?php
  mktime
(0,0,0,$i,1)
?>
scratch_fury at yahoo dot com
24-Aug-2006 06:07
In response to the post by "nicky" on July 9, 2006:

Just so everyone's clear, if you have a date string formatted in a standard way, you'll probably want to go ahead and use PHP's built-in strtotime() function.  The advantage to using nicky's str2time() function seems to be that you can specify how the date string you're passing in is formatted, so you can deal with non-standard date strings.
nicky
09-Jul-2006 12:08
here's a function to generate a timestamp from a certain date by using patterns:
<?php
function str2time($strStr, $strPattern = null)
{
   
// an array of the valide date characters, see: http://php.net/date#AEN21898
   
$arrCharacters = array(
       
'd', // day
       
'm', // month
       
'y', // year, 2 digits
       
'Y', // year, 4 digits
       
'H', // hours
       
'i', // minutes
       
's'  // seconds
   
);
   
// transform the characters array to a string
   
$strCharacters = implode('', $arrCharacters);

   
// splits up the pattern by the date characters to get an array of the delimiters between the date characters
   
$arrDelimiters = preg_split('~['.$strCharacters.']~', $strPattern);
   
// transform the delimiters array to a string
   
$strDelimiters = quotemeta(implode('', array_unique($arrDelimiters)));

   
// splits up the date by the delimiters to get an array of the declaration
   
$arrStr     = preg_split('~['.$strDelimiters.']~', $strStr);
   
// splits up the pattern by the delimiters to get an array of the used characters
   
$arrPattern = preg_split('~['.$strDelimiters.']~', $strPattern);

   
// if the numbers of the two array are not the same, return false, because the cannot belong together
   
if (count($arrStr) !== count($arrPattern)) {
        return
false;
    }

   
// creates a new array which has the keys from the $arrPattern array and the values from the $arrStr array
   
$arrTime = array();
    for (
$i = 0;$i < count($arrStr);$i++) {
       
$arrTime[$arrPattern[$i]] = $arrStr[$i];
    }

   
// gernerates a 4 digit year declaration of a 2 digit one by using the current year
   
if (isset($arrTime['y']) && !isset($arrTime['Y'])) {
       
$arrTime['Y'] = substr(date('Y'), 0, 2) . $arrTime['y'];
    }

   
// if a declaration is empty, it will be filled with the current date declaration
   
foreach ($arrCharacters as $strCharacter) {
        if (empty(
$arrTime[$strCharacter])) {
           
$arrTime[$strCharacter] = date($strCharacter);
        }
    }

   
// checks if the date is a valide date
   
if (!checkdate($arrTime['m'], $arrTime['d'], $arrTime['Y'])) {
        return
false;
    }

   
// generates the timestamp
   
$intTime = mktime($arrTime['H'], $arrTime['i'], $arrTime['s'], $arrTime['m'], $arrTime['d'], $arrTime['Y']);
   
// returns the timestamp
   
return $intTime;
}
// example
$time = str2time('06-07-08 07:58:02', 'd-m-y H:i:s');
var_dump($time);
var_dump(date('d.m.Y H:i:s', $time));
?>
carlo dot tafuro at poste dot it
08-May-2006 12:40
Negative timestamps give problem also using linux as guest operating system inside WMvare with Windows host operating system.
colin dot horne at gmail dot com
31-Mar-2005 07:48
If the month is greater than 12, it goes into the next year. If it is less than 1, it goes into the previous year. Generally, it behaves as you'd expect it to :-)

Examples:

<?php

// January 1, 2005
print date ("F j, Y", mktime (0,0,0,13,1,2004));

// December 1, 2003
print date ("F j, Y", mktime (0,0,0,0,1,2004));

// February 1, 2005
print date ("F j, Y", mktime (0,0,0,14,1,2004));

// November 1, 2003
print date ("F j, Y", mktime (0,0,0,-1,1,2004));

?>
Romain Sam
25-Mar-2005 03:50
Under Windows, mktime goes until 2038-01-19 (03:14:07 ...)
fontajos at phpeppershop dot com
01-Dec-2004 10:19
<?php
// Calculates UNIX timestamps from datestamps counting
// days from 01/01/0000. Used in some DataFlex databases.
// Tested only with Timestamps > 01/01/1970 and
// < 31/12/2025.
// Arguments: $days (Integer, days-from-0000,
//                   e.g. 731168 = 30/10/2001)
function date_diff_value($days) {
  
// 1/1/1970 = 719543 days counting from 01/01/0000
  
$day_1_1_1970 = 719543;