将时间添加到时间戳

Raú*_*ràs 16 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>";
Run Code Online (Sandbox Code Playgroud)

代码输出:

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
Run Code Online (Sandbox Code Playgroud)

只要我知道它是正确的.但是,看看在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
Run Code Online (Sandbox Code Playgroud)

发生了什么?第二次约会应该是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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*nov 48

永远不要使用像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);
Run Code Online (Sandbox Code Playgroud)

如果您输出时间,您的示例将更加明显:

$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";
Run Code Online (Sandbox Code Playgroud)

输出:

2010-10-28 00:00:00
2010-11-03 23:00:00
Run Code Online (Sandbox Code Playgroud)

在这里你有2010-11-03 23:00:00而不是2010-11-04 00:00:00因为其中一天(10月31日)长25小时而不是24小时.