date strtotime()计算返回1969日期

时间:2014-10-17 08:43:35

标签: php datetime

我有以下代码从HTML表单中获取$_POST

<?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日星期五04:36:43,1969年12月31日星期三19:00:00

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

PS:我在连接中使用了换行符,以便更容易进行故障排除,我发现它不是标准的。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

当发生这种情况时,php使用时间戳0,即1970-1-1 00:00:00。 你从该日期减去5小时(你的时区),给你1969-12-31 19:00:00。

试试这个:

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

答案 2 :(得分: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');

答案 3 :(得分: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";
?>

如果您不想将编程方法更改为面向对象,这应该可以解决问题。