将时间添加到时间戳

时间:2010-08-03 14:36:39

标签: php

给出一个开始日期,我将在七天内添加四次以获得5个不同的日期,每个日期相隔一周。

//$date = '28-10-2010';
$timestamp = mktime( 0, 0, 0, 10, 01, 2010 );
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

代码输出:

Date=01-10-2010 Friday
Date=08-10-2010 Friday
Date=15-10-2010 Friday
Date=22-10-2010 Friday
Date=29-10-2010 Friday

只要我知道它是正确的。 但是,看看2010-10-31和2010-11-01期间会发生什么?

$ timestamp = mktime(0,0,0,10,28,2010);    [...]

奇怪的是它输出了这个:

Date=28-10-2010 Thursday
Date=03-11-2010 Wednesday
Date=10-11-2010 Wednesday
Date=17-11-2010 Wednesday
Date=24-11-2010 Wednesday

发生了什么事?第二次约会应该是04-11-2010! 而且,我看到这种“失败”每十年发生一次! 这与夏令时有关吗?如果是这样,我该如何解决? 有什么我可以忽略的吗?

编辑:好的,我输出了时间,只是为了看看会发生什么,这就是我现在所得到的:

Date=28-10-2010 Thursday :: 00:00:00
Date=03-11-2010 Wednesday :: 23:00:00
Date=10-11-2010 Wednesday :: 23:00:00
Date=17-11-2010 Wednesday :: 23:00:00
Date=24-11-2010 Wednesday :: 23:00:00

似乎与时间有关的事情,有些事情发生在2010-11-31 ...

7 个答案:

答案 0 :(得分:45)

从不使用60 * 60 * 24 * 7之类的数学来添加/减去天数(因为节省了夏令时),请改用strtotimemktime

$timestamp = strtotime('+7 days', $timestamp);

// Or something like this (it's OK to have day parameter <= 0 or > 31)
$timestamp = mktime(0, 0, 0, $month, $day + 7, $year);

如果您也输出时间,那么您的示例会更明显:

$timestamp = mktime(0, 0, 0, 10, 28, 2010);
echo date('Y-m-d H:i:s', $timestamp) . "\n";

$timestamp += 60*60*24*7;
echo date('Y-m-d H:i:s', $timestamp) . "\n";

输出:

2010-10-28 00:00:00
2010-11-03 23:00:00

此处您有2010-11-03 23:00:00而不是2010-11-04 00:00:00因为其中一天(10月31日) 25 小时而不是24小时。

答案 1 :(得分:2)

看起来你转移到白天节省时间或从他们那里回来。

POSIX时间(时间戳)始终为UTC,而本地时间为UTC + X,X可能会根据时间节省从日期变为日期。

答案 2 :(得分:2)

这似乎与时区/ DST有关。

添加

date_default_timezone_set('UTC');

因为第一行解决了问题(因为您不再使用任何DST设置)。

答案 3 :(得分:1)

我认为这确实与夏令时有关,因为时间戳的'时间'段设置为午夜点,但是当夏令时结束时,我们会回到一小时 - 这仍然是前一天(晚上11点)。

如果您在原始行中添加2小时,那么您就拥有:

$timestamp = mktime( 2, 0, 0, 10, 01, 2010 );

因此从早上2点而不是午夜开始......它有效。

答案 4 :(得分:1)

我永远不会理解为什么人们使用这个可怕的mktime函数。

如果您使用的是PHP5.3,您可能需要考虑使用

$period = new DatePeriod(
    new DateTime('28-10-2010'),
    DateInterval::createFromDateString('1 week'),
    4);

foreach ( $period as $dt ) {
  echo $dt->format( "l Y-m-d H:i:s\n" );
}

如果没有PHP5.3,您仍然可以使用

for($i=0; $i<=4; $i++) {
    echo date('Y-m-d', strtotime("+$i weeks 28-10-2010")), PHP_EOL;
}

DateTime问题为pretty common on SO, so you might find interesting cases when searching

答案 5 :(得分:1)

如果有人需要这个,就像我引用网站一样:今天,当前时间,Y-m-d H:i:s,再加上+7天。或者你可以添加+3个月等等。

$timestamp=strtotime("+7 Days");
$nowtime =  date('Y-m-d H:i:s', $timestamp);

答案 6 :(得分:0)

我使用这种添加天数的方法取得了很大成功,但我还没有测试过您的格式:

$date = The value of the database from your query
$daysahead = The number of days ahead you want to calculate
$final_date = date(“m/d/Y”, strtotime($date) + (86400 * $daysahead));

echo $final_date;