给出一个开始日期,我将在七天内添加四次以获得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 ...
答案 0 :(得分:45)
从不使用60 * 60 * 24 * 7之类的数学来添加/减去天数(因为节省了夏令时),请改用strtotime
或mktime
:
$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;