mktime

(PHP 3, PHP 4, PHP 5)

mktime -- 取得一个日期的 Unix 时间戳

说明

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

根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。

参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。

参数

hour

小时数。

minute

分钟数。

second

秒数(一分钟之内)。

month

月份数。

day

天数。

year

年份数,可以是两位或四位数字,0-69 对应于 2000-2069,70-100 对应于 1970-2000。在如今系统中普遍把 time_t 作为一个 32 位有符号整数的情况下,year 的合法范围是 1901 到 2038 之间,不过此限制自 PHP 5.1.0 起已被克服了。

is_dst

本参数可以设为 1,表示正处于夏时制时间(DST),0 表示不是夏时制,或者 -1(默认值)表示不知道是否是夏时制。如果未知,PHP 会尝试自己搞明白。这可能产生不可预知(但并非不正确)的结果。如果 PHP 运行的系统中启用了 DST 或者 is_dst 设为 1,某些时间是无效的。例如 DST 自 2:00 生效,则所有处于 2:00 到 3:00 之间的时间都无效,mktime() 会返回一个未定义(通常为负)的值。某些系统(例如 Solaris 8)的 DST 在午夜生效,则 DST 生效当天的 0:30 会被计算为前一天的 23:30。

注: 自 PHP 5.1.0 起,本参数已被废弃。应该使用新的时区处理特性来替代。

返回值

mktime() 根据给出的参数返回 Unix 时间戳。如果参数非法(例如年,月,日都是零),本函数返回 FALSE(在 PHP 5.1 之前返回 -1)。

更新日志

版本说明
3.0.10加入了 is_dst 参数
5.1.0 is_dst 参数被废弃。出错时函数返回 FALSE 而不再是 -1

范例

例子 1. mktime() 例子

mktime() 在做日期计算和验证方面很有用,它会自动计算超出范围的输入的正确值。例如下面例子中每一行都会产生字符串 "Jan-01-1998"。

<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo
date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo
date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo
date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>

例子 2. 下个月的最后一天

任何给定月份的最后一天都可以被表示为下个月的第 "0" 天,而不是 -1 天。下面两个例子都会产生字符串 "The last day in Feb 2000 is: 29"。

<?php
$lastday
= mktime(0, 0, 0, 3, 0, 2000);
echo
strftime("Last day in Feb 2000 is: %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo
strftime("Last day in Feb 2000 is: %d", $lastday);
?>

注释

注意

在 PHP 5.1.0 之前,在任何已知 Windows 版本以及一些其它系统下不支持负的时间戳。因此年份的有效范围限制为 1970 到 2038。


add a note add a note User Contributed Notes
php at jaggard dot org dot uk
31-Oct-2006 05: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
25-Aug-2006 01: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 07: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));
?>
nuntius
08-Jun-2006 01:25
Easy way to get last month.
...and anything else in the date you want. Just introduce the calculation into the mktime function (note the -1) when building from date().

  
//Current Date minus one month.
$dateMinusOneMonth = mktime(0, 0, 0, date("m")-1, date("d"),  date("Y"));
$lastmonth = date("M", $dateMinusOneMonth);
echo $lastmonth;

change $dateMinusOneMonth to the below to see it react to a year change (get Dec as last month from January)
    
$dateMinusOneMonth = mktime(0, 0, 0, 01-1, 01, 2006);
carlo dot tafuro at poste dot it
08-May-2006 07:40
Negative timestamps give problem also using linux as guest operating system inside WMvare with Windows host operating system.
manhon824 at gmail dot com
21-Jan-2006 04:24
I read the above note and think up a simple way(just 10 lines) to find time difference in days, hrs, mins, secs!
In my way, we do not need to fix the format of time!

$starttime=time();
// the start time can change to =strtotime($endtime);
$endtime=strtotime($endtime);
//$endtime can be any format as well as it can be converted to secs

$timediff = $endtime-$starttime;
   $days=intval($timediff/86400);
   $remain=$timediff%86400;
   $hours=intval($remain/3600);
   $remain=$remain%3600;
   $mins=intval($remain/60);
   $secs=$remain%60;

//this code is copied from the other note!thx to that guy!

$timediff=$days.'days'.$hours.'hr'.$mins.'min'.$secs.'s';

Hope that it is usefull!
ian at opensystems dot net dot au
14-Nov-2005 04:21
A trivial way to avoid having to remember the quirky order of variables.

It's also more convenient to use because you can ignore the last three (time) variables if all you want to do is manupulate the date components.

Just include the following function at the top of your script and call ansi_mktime instead of mktime.

function ansi_mktime($y=0, $month=0, $d=0, $h=0, $min=0, $s=0){
   return mktime($h, $min, $s, $month, $d, $y);
}

// eg:
$day = 14;
echo date("dS \d\a\y of M Y", ansi_mktime(2005, 11, $day + 7))

// output: 21st day of Nov 2005
larry at mlxpert dot com
09-Sep-2005 12:40
I needed a script to display a dropdown menu with a list of week ending dates. I wrote this as a result. I hope it helps somebody. The selname variable is the name of the select field and the day of week of the begining date designates the end of the week.

<?php
$selname
="we_date";
//Build Begin date
$month=10;
$day=04;
$year=2003;
$hour=date('H');
$min=date('i');
$sec=date('s');

//convert it to unix timestamp
$bdate=mktime($hour,$min,$sec,$month,$day,$year);

//Build Today   
$thour=date('H');
$tmin=date('i');
$tsec=date('s');
$tmonth=date('n');
$tday=date('d');
$tyear=date('Y');
//convert it to unix timestamp
$today=mktime($thour,$tmin,$tsec,$tmonth,$tday,$tyear);

    
//just the weeks
$nbdate=floor($bdate/(7 * 24 * 60 * 60));
$ntoday=floor($today/(7 * 24 * 60 * 60));

//difference between today and the beginning date
$diff=$today-$bdate;
echo
"<select size='1' name='$selname'>\n";
while (
$bdate <= $today+(7 * 24 * 60 * 60)){
echo (
"<option value='".date('n/d/Y',$bdate)."'>
"
.date('n/d/Y',$bdate)."</option>\n");

$bdate=$bdate+(7 * 24 * 60 * 60);
}
echo
"</select>";
?>
funkisyourfriend at gmail dot com
07-Aug-2005 06:25
In response to Hayden...

I hate to inform you of this after you've worked out your own function for date validation, but PHP has a function called checkdate(). It does the exact same thing as your isvaliddate() function.
luke at mudbugmedia dot com
23-Jul-2005 12:31
In response to phpprince at phpprince dot com:

The same thing can be done with

<?php
echo date('Y-m-d H:i:s', strtotime('+7 days'));
?>
venimus777 at yahoo dot com
09-Jun-2005 12:20
You may consider easier to calculate dates using strtotime() instead of mktime():

<?
   date
('Y-m-d',strtotime('now +'.$f.' months'));
?>

will produce the date $f($f>=0) months after today.
Hayden
07-Jun-2005 08:33
Here is a quick way to check the a date is valid. I use this when I get users to enter dates via drop downs, which leave open the possibility for impossible dates like 30-Feb-2005 and 31-Jun-2005 etc. This is only necessary as mktime() will accept these invalid dates, which is, in my case, sometimes not the desired handling.

<?php
function isvaliddate($day, $month, $year) {
  
$day = intval($day);
  
$month = intval($month);
  
$year = intval($year);
  
$time = mktime(0,0,0,$month,$day,$year);
   if (
$day != date("j",$time)) return false;
   if (
$month != date("n",$time)) return false;
   if (
$year != date("Y",$time)) return false;
   return
true;
}
?>

Note that date("Y",$time) checks the year as a 4 digit year. That line could be replaced as shown below to allow for the 2 digit notation as well.
Also the order the arguments need to be specified is day, month, year, because I come from NZ and that is the format we use here. If you prefer another format, for example month, day, year, just change the order of the arguments on the first line.

<?php
function isvaliddate($day, $month, $year) {
  
$day = intval($day);
  
$month = intval($month);
  
$year = intval($year);
  
$time = mktime(0,0,0,$month,$day,$year);
   if (
$day != date("j",$time)) return false;
   if (
$month != date("n",$time)) return false;
   if ((
$year != date("Y",$time)) AND ($year != date("y",$time))) return false;
   return
true;
}
?>

Hope this helps someone!
Cheers,
Hayden.
caliban at darklock dot com
27-May-2005 09:40
cdblog at gmail dot com didn't clarify exactly what his function does: it returns the week number WITHIN THE CURRENT MONTH, i.e. the first day of the month is in week 1, the eighth day is in week 2, the fifteenth is in week 3, the 22nd is in week 4, and the 29th is in week 5. A useful function, if you need such things.
cdblog at gmail dot com
27-May-2005 05:06
<?php
  
/**
   * @return int
   * @desc get the week's No. by day.
   * @link http://php.clickz.cn/articles/date/getWeekNoByDay,html
   * @update at my php blog, http://php.clickz.cn/
   */
  
function getWeekNoByDay($year = 2005,$month = 5,$day = 5) {
       return
ceil(($day + date("w",mktime(0,0,0,$month,1,$year)))/7);   
   }
?>
webmaste at caleidosmultimedia dot com
27-Apr-2005 08:42
My little code for make a code to get the difference between dates

<?
$data1
= mktime (0,0,0,5,5,2005); //specify a date1
$data2 = mktime (0,0,0,5,15,2005); //specify a date2

$differenza = ($data2 - $data1 ) / 86400;

echo
" The Different $data2 - data1 = $differenza";
?>
colin dot horne at gmail dot com
31-Mar-2005 02: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 11:50
Under Windows, mktime goes until 2038-01-19 (03:14:07 ...)
andreas dot schmeiler at rtlnewmedia dot de
11-Feb-2005 08:41
if you ever wondered how to convert a windows (ASP) Timestamp to an unix Timestamp, try this:

(windowsTime to unixTime):

function wT2uT($win_timestamp) {
 
   $WIN_DATE_CONST=2209165200;
   $WIN_TIME_CONST=115740.74074074;
 
   list($win_date, $win_time)=explode(",",$win_timestamp);
 
   $win_time=substr($win_time."0000000000",0,10);
 
   $ux_date = $win_date*24*60*60;
   $ux_date-= (date("I")*60*60);
   $ux_date-= $WIN_DATE_CONST;
  
   $ux_time = round($win_time/$WIN_TIME_CONST);
  
   return($ux_date+$ux_time);
}
dasprid [AT] web [DOT] de
04-Feb-2005 08:42
I have to correct, what Evorg (28-Sep-2004 04:24) wrote. If you want to delete a cookie, simply take the value 0 (zero) as timestamp. It's the same as the timestamp, which Evorg's example generates.
fontajos at phpeppershop dot com
01-Dec-2004 06: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;
  
$diff = $days - $day_1_1_1970;
  
$unix_ts = $diff * 86400;
   return
$unix_ts;
}
?>
phpmanual at localpin dot com
02-Nov-2004 05:03
Daylight saving time!  Grrrrrrrrrr!  (And a minor "Grrr!" for PHP making this less intuitive than it should be).

In brief, NEVER add number of seconds, like 60*60*24, but use strtotime("+1 day", $myDate)).

Some of the 'simple' functions above for calculating dates will NOT work correctly when a date includes daylight saving time.  Shown below is the problem illustrated and a simple solution.

EXAMPLE 1: WRONG!
I had the following loop, which worked fine all year, until this weekend, when the clocks changed, and it broke!  The problem is daylight saving time:

// Loop through dates adding 1 days worth of seconds each time
$myDate = 1098914400  // October 28th
for ($myDate = $fromDate; $myDate <= $toDate;  $myDate = $myDate + 60 * 60 * 24) {
  $printable = strftime("%d-%m-%Y %H:%M:%S", $myDate);
  echo $printable
}

"28-10-2004 00:00:00"
"29-10-2004 00:00:00"
"30-10-2004 00:00:00"
"31-10-2004 00:00:00"
"31-10-2004 23:00:00"  (oops!  31st October repeats and time now 23:00!!)
"01-11-2004 23:00:00"
"02-11-2004 23:00:00"

EXAMPLE 2: CORRECT!
$myDate = 1098914400  // October 28th
for ($myDate = $fromDate; $myDate <= $toDate; $myDate = strtotime("+1 day", $myDate)) {
  $printable = strftime("%d-%m-%Y %H:%M:%S", $myDate);
  echo $printable
}

"28-10-2004 00:00:00"
"29-10-2004 00:00:00"
"30-10-2004 00:00:00"
"31-10-2004 00:00:00"
"01-11-2004 00:00:00"
"02-11-2004 00:00:00"
Evorg
28-Sep-2004 10:24
mktime should be used when removing cookies. Normally people tend to use: time()-3600 to set the expiration date in "the past". The problem with this is that some computers is set at a wrong date and therfore differs from the server-time. That will render the time()-3600 unusable.

Instead use mktime(12,0,0,1, 1, 1990) as you expiration criteria. I'm convinced that only a very few users has set their time back more than 1990 :)
alex at gameserverhost dot nl
15-Sep-2004 05:27
A simple statement to calculate days between two dates

$dayselepsed = round((strtotime($dateone) - strtotime($datetwo))/(60*60*24)-1);

Regards Alex Curvers
jlim at natsoft dot com dot my
25-Jun-2004 08:36
Hi,

For those looking for a solution to the 1970-2038 limitation, the adodb time library does the trick nicely. The website has changed, to

http://phplens.com/phpeverywhere/adodb_date_library

"This library replaces native functions as follows:

   getdate()  with  adodb_getdate()
   date()    with  adodb_date()
   gmdate()  with  adodb_gmdate()
   mktime()  with  adodb_mktime()
   gmmktime() with  adodb_gmmktime()"

Download the inc file:
http://phplens.com/lens/dl/adodb-time.zip

Enjoy, John Lim
Dave J.
13-May-2004 11:42
bichinhoverde's my_gmmktime function uses an incomplete definition of leap year.  It's not leap year if the year is divisible by 100 and NOT divisible by 400. E.G. 2000 was a leap year, but 2100 will not be. Trivial, but it should be said.

Thus,
   if ( $i % 4 == 0 ) {
     $output += 24*60*60;
   }

should be:
   if ( (($i % 4 == 0) && ($i % 100 != 0))
       || ($i % 400 == 0) ) {
     $output += 24*60*60;
   }
matt at killermookie dot org
23-Apr-2004 08:27
I noticed that while it is legal to do this:

$date=date("Y-m-d", mktime(0,0,0,4,20,2004);

It doesn't quite work the same when you do this:

$time=date("H:i:s", mktime(10,30,15,0,0,0);

No matter what variables you put in for time, it'll always spit out 15:59:59. You need to include the month, day and year if you want it to convert the time.

I spent nearly an hour trying to figure out what I was doing wrong til I stuck in a random date.
y4yh00 at yahoo dot com
08-Apr-2004 07:58
For those looking for a solution to the 1970-2038 limitation, the adodb time library does the trick nicely.

http://php.weblogs.com/adodb_date_time_library
"This library replaces native functions as follows:

   getdate()  with  adodb_getdate()
   date()    with  adodb_date()
   gmdate()  with  adodb_gmdate()
   mktime()  with  adodb_mktime()
   gmmktime() with  adodb_gmmktime()"

Download the inc file:
http://phplens.com/lens/dl/adodb-time.zip

Enjoy,
rob
joakim stai
29-Mar-2004 02:48
As Nigel pointed out, you should be aware of DST (Daylight Savings Time) when using mktime(). Some systems will return a negative value if you use 0 as the hour, as it will simply skip from (for example) 23:59:59 to 01:00:00. Instead use 12 (noon) as the hour and you won't get a negative timestamp or a date in the 1960's.

This code will work with DST:
$today = mktime(12, 0, 0, date("m"), date("d"), date("Y"));
pb at _remove_ pedal dot dk
28-Feb-2004 11:30
I find it easiest, if I want to find you how many days there are between two dates to use the following method:

$init_day = 1;
$init_mth = 1;
$init_yr = 2004;

$dst_day = 5;
$dst_mth = 8;
$dst_yr = 2004;

//first convert to unix timestamp
$init_date = mktime(12,0,0,$init_mth,$init_day,$init_yr);
$dst_date = mktime(12,0,0,$init_mth,$init_day,$init_yr);

$offset = $dst_date-$init_date; //Depending on which offset type you want, switch order

$days = floor($offset/60/60/24);
Nigel Gilbert
16-Feb-2004 04:15
Several posts here offer procedures to compute the number of days between two dates based on using mktime, using the given date and 00:00:00 as the time.  It turns out that this is bad choice for the default time for such calculations when the date in question happens to be the date when daylight savings time starts.  For example, on several OSs, there is no such time as 00:00:00 30-03-2003 (and mktime returns a negative value), because the clock changed from 23:59:59 29-03-2003 straight to 01:00:00 30-03-2003 as a result of Daylight Saving. At better choice is to use, for example, 12,0,0,30,3,2003 as the argument to mktime, that is, use noon, not midnight as the default time.
praas at NOSPAM dot ision dot nl
01-Feb-2004 04:44
Consider skipping months with mktime().

$nextmonth = date("M",mktime(0,0,0,date("n")+1,date("j"),date("Y")));

On any day in Januari you expect to get Feb, right?
But on January 30th you'll get Mar. It will try Feb 30th, which doesn't exist, and skips another month. Therefore in this case present a day value that will certainly be legal in any month, like day "1".

This will give you next month on any day of the year:
$nextmonth = date("M",mktime(0,0,0,date("n")+1,1,date("Y")));
iain at seatofthepants dot net
09-Dec-2003 11:49
In the above example it should ne boted that if you try to calculate the command at midnight on the 28/04/2004 you will get an erroneous response. This has been driving me to distraction.

$myTime = mktime( 0, 0, 0, 3, 28, 2004);

Solution I found was to create the time at 3am well after the 2am daylight savings problem, viz:

$myTime = mktime( 3, 0, 0, 3, 28, 2004);

Not sure if this is documented anywhere.
sun4php at coolguide dot net
24-Nov-2003 09:36
Very often we are faced with the problem of adjusting ourself to local time where application is running rather than running our application at server time.

Now we have a way to do that by setting TZ variable using putenv() method. But due to the non-availability of standard time zone codes, developers are often faced with the ambiguity of how to implement a non standard time zone(those which are not too popular)

I figured a way out myself for this. It uses the information that a particular time zone is n hours ahead or n hours behind standard GMT time zone.

here is what i did.
<?php

$day
=15;
    
$month=12;
    
$year=2003;
    
//convert it to unix timestamp
    
    
$deadline=mktime('','','',$month,$day,$year);

//caluculate our time from GMT time
    
$hour=gmdate('H');
    
$min=gmdate('i');
    
$sec=gmdate('s');
    
$month=gmdate('n');
    
$day=gmdate('d');
    
$year=gmdate('Y');
    
$stamp=mktime ($hour,$min,$sec,$month,$day,$year);

// technique is to convert the GMT date & time to unix stamp, then convert time zone
     //specific information like add 5 hours or subtract 5 hours to seconds,(consider day
     //light saving here), and add/subtract it to the unix time stamp and then convert
     //it back to date using date function if needed or perform operations needed on the
     // time stamp
    
     //subtract 6/n hours from GMT time (Central standard time/CST)
     //vary this part to whatever time zone you are at
    
$do=6*60*60;
    
$lstamp=$stamp-$do;
     echo(
"Today(local date/Central):".date('h:i:s d/n/Y',$lstamp)."<br>");
    
    
$left=$deadline-$lstamp;
    
    
$days_left=floor($left/(24 * 60 * 60));
    
$hours_left=floor($left/(60 * 60 ));
     echo
"<br>Days Left: $days_left<br>";
     echo
"<br>Hours Left(approx): $hours_left<br>";
    
?>

Change the $do variable to whatever seconds you are different from GMT and add or subtract accordingly to generate $lstamp.

This would solve your time zone problems.

Happy Coding,
Suneel Kanuri
trahma
21-Nov-2003 04:06
I think it is important to note that the timestamp returned is based upon the number of seconds from the epoch GMT, and then modified by the time zone settings on the server.

Thus...

mktime(0,0,0,1,1,1970) will not always return 0.  For example with the US eastern time zone (GMT-5) will return 18000 (5 hours past the epoch) and the same function with the time zone set to the US pacific time zone (GMT-8) will return 28800 (8 hours past the epoch).

In an instance where you want time zone independence, you should use the function gmmktime()
laurie at oneuponedown dot com
19-Nov-2003 12:42
With regard to Example 1 and using mktime to correct out-of-range input.

It should be noted that mktime will implement day light saving amends. Consider the following:

<?
print(date("d/m/Y H:i:s",mktime(0,0,0,3,(27 + 1),2004)));
?>
OUTPUT "28/03/2004 02:00:00"

<?
print(date("d/m/Y H:i:s",(mktime(0,0,0,3,27,2004) + (((1 * 24) * 60) * 60))));
?>
OUTPUT "28/03/2004 00:00:00"

Dependent on your requirements this may or may be desirable