2014-10-17 3 views
2

У меня есть следующий код получения $_POST из HTML формы:дата 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-Oct-17 4:36:43, среда, 1969-декабрь-31 19:00:00

Как я могу исправить дату 1969 года? Я читал something о временных отметках Unix, но я не могу заставить его работать. В этом случае предполагается вычесть 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] :) –

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 часа')' I написал '($ travelTimeOperator. $ TimeAmount. ''. $ TravelTimeInterval)' или некоторые такие? – Phrancis

+0

Да, но не забудьте проверить/фильтровать то, что вы вкладываете в 'modify'. Он выдает предупреждение и возвращает 'false', если вход недействителен. – Elias

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 использует временную метку 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)); 
Смежные вопросы