2014-10-17 118 views
2

我有下面的代码的HTML表单获得$_POST日期的strtotime()计算返回1969年日期

<?php 
$departureTime = date("l, Y-M-d H:i:s"); 
// calculate time-traveled time 
$arrivalTime = date("l, Y-M-d H:i:s", strtotime(
     "$departureTime 
     .' ' 
     .$travelTimeOperator  // '+' or '-' 
     .$timeAmount   // integer or decimal (tested with integer) 
     .' ' 
     .$travelTimeInterval")); // 'days' or 'hours' 

echo "$timeAmount, $departureTime, $arrivalTime"; 
?> 

我得到以下输出,使用3作为我$timeAmount-我的运营商和days$travelTimeInterval

3,周五在2014年10月 - 17 4时36分43秒,周三,1969年 - 12月31 19:00:00

如何修复1969年的日期?我已经阅读了关于Unix时间戳的something,但是我无法使其工作。在这种情况下,它打算减去3天。如果我尝试添加天数,我会得到完全相同的值1969-Dec-31 19:00:00

PS:我在连接中使用了换行符,以便更容易排除故障,我意识到这不是标准。

回答

5

提供给strtotime的字符串是无效的。你开始了双引号,但你没有正确的结束吧:

$departureTime = date("l, Y-M-d H:i:s"); 
$travelTimeOperator = '+'; 
$timeAmount = 1; 
$travelTimeInterval = 'days'; 
$departureTimeString = "$departureTime 
     .' ' 
     .$travelTimeOperator  // '+' or '-' 
     .$timeAmount   // integer or decimal (tested with integer) 
     .' ' 
     .$travelTimeInterval"; 
echo $departureTimeString; 
// Friday, 2014-Oct-17 11:20:43 .' ' .+ // '+' or '-' .1 // integer or decimal (tested with integer) .' ' .days 

你可以做这样的事情来解决这个问题:

<?php 
$departureTime = date("l, Y-M-d H:i:s"); 

$travelTimeOperator = '+'; 
$timeAmount = 1; 
$travelTimeInterval = 'days'; 
$departureTimeString = "$departureTime " 
         . $travelTimeOperator 
         . $timeAmount 
         . " $travelTimeInterval"; 
$arrivalTime = date("l, Y-M-d H:i:s", strtotime($departureTimeString)); 

echo "$timeAmount, $departureTime, $arrivalTime"; 
// 1, Friday, 2014-Oct-17 11:22:23, Saturday, 2014-Oct-18 11:22:23 

使用面向对象的特性,你可以做这样的事情:

<?php 
$departureTime = new DateTimeImmutable(); 

$travelTimeOperator = '+'; 
$timeAmount = 1; 
$travelTimeInterval = 'days'; 
$relativeDateString = "{$travelTimeOperator}{$timeAmount} $travelTimeInterval"; 
$arriveTime = $departureTime->modify($relativeDateString); 

echo $arriveTime->format('l, Y-M-d H:i:s'); 
// Saturday, 2014-Oct-18 11:26:15 
+2

那么这是一个很好的答案! +1,你应该看看[codereview.se] :) – 2014-10-19 00:31:31

2

我认为你滥用strtotime进行计算作为字符串提供的日期和时间?尝试DateTime课程。它有一个modify方法。

例如:

$date = new DateTime(); // now 
$date->modify('+2 hours'); // add two hours 
echo $date->format('l, Y-M-d H:i:s'); 
+0

这会适应变量吗?说'而不是'('+2小时')'我写了'($ travelTimeOperator。$ timeAmount。'。$ travelTimeInterval)''或者其他一些? – Phrancis 2014-10-17 08:57:46

+0

是的,它会但不要忘记验证/过滤你在'修改'中的内容。如果输入无效,它会发出警告并返回false。 – Elias 2014-10-17 09:01:00

2
<?php 
$departureTime = date("l, Y-M-d H:i:s"); 
if ($travelTimeInterval=='days') {$unit=(24*3600);} else {$unit=3600;} 
$diff=$travelTimeOperator.($unit*$timeAmount); 
$arrtime=time()+$diff; 
$arrivalTime = date("l, Y-M-d H:i:s", $arrtime); 
echo "$timeAmount, $departureTime, $arrivalTime"; 
?> 

如果你不想改变你的编程方法,面向对象的,这应该做的伎俩。

3

您在strtotime()中的值不能被php解释为有效的日期字符串。

发生这种情况时,php使用1970-1-1 00:00:00的时间戳0。 您从那天给您1969-12-31 19:00:00减去5小时(您的时区)。

试试这个:

$arrivalTime = date("l, Y-M-d H:i:s", 
strtotime($travelTimeOperator . $timeAmount . ' ' .$travelTimeInterval));