2012-09-13 3 views
1

Я пытаюсь рассчитать время, прошедшее с момента публикации комментария. Я нашел function для этого, и он хорошо работаетPHP: получение смещения временной зоны от пользователя и вычисление «время назад»

Но я просто заметил, что время, показанное пользователю, неверно из-за его/ее часового пояса. Я провел некоторое исследование, и решение, похоже, было , минуя смещение часового пояса пользователя на php-страницу с помощью функции javascript под названием getTimezoneOffset.

проблема заключается в том, что я не могу использовать это смещение, чтобы создать часовой пояс и использовать его для этой функции, связанной выше. С помощью another code то, что я мог собрать до сих пор:

function humanTiming ($time,$offset) 
{ 

    $isDST = 1; // Daylight Saving 1 - on, 0 - off 
    $timezoneName = timezone_name_from_abbr('', intval($offset, 10) * 36, $isDST); 

    $date = new DateTime($time, new DateTimeZone($timezoneName)); 
    $time = strtotime($date); 

    $time = time() - $time; // to get the time since that moment 

    $tokens = array (
     31536000 => 'year', 
     2592000 => 'month', 
     604800 => 'week', 
     86400 => 'day', 
     3600 => 'hour', 
     60 => 'minute', 
     1 => 'second' 
    ); 

    foreach ($tokens as $unit => $text) { 
     if ($time < $unit) continue; 
     $numberOfUnits = floor($time/$unit); 
     return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':''); 
    } 

} 

И давайте назовем функцию так:

echo humanTiming ($row['date'],"-240"); 

Примечание: -240 значение, которое я получаю от работы этой функции яваскрипта, так это, вероятно, мое смещение по часовой стрелке.

Первый номер: Кажется, значение -240 недействительно и что-то вроде -0500 работает.

Второго выпуск: даже если я пытаюсь с действительным значением смещения, функция возвращает 42 years

Не знаю, как это 42 лет рассчитываются, но его совершенно неправильно.

ответ

3

Пара проблем: Функция Javascript getTimezoneOffset() возвращает смещение часовой пояс в минутах, однако timezone_name_from_abbr() ожидает смещения в секундах. Итак, в вашем примере -240, что на самом деле -4 часов или -14396 секунд. Вы можете исправить свой код, изменяя математику немного:

$timezoneName = timezone_name_from_abbr('', intval($offset) * 60, $isDST); 

Поскольку вы начали использовать DateTime объект, вы не можете затем использовать strtotime, чтобы получить метку времени Unix. Вместо этого вам нужно format():

$date = new DateTime($time, new DateTimeZone($timezoneName)); 
$time = $date->format('U'); 

Это должно получить результат вы после этого. Вы получали 42 лет, потому что время было задано значение 0 (strtotime($date) оцениваемого ложь), которая является Unix эпохи - 1970.

+0

Я изменил код в соответствии с вашей должности , теперь функция ничего не возвращает. – xperator

+0

Я думаю, что что-то не так со временем, сама функция, исправлены проблемы с смещением и временной меткой. Большое спасибо. Кажется, он ничего не рассчитывает, так как несколько часов назад или, может быть, несколько минут назад. Не знаю, почему. Математические вопросы: P – xperator

+0

ok После проведения большого количества испытаний и испытаний проблема заключалась в смещении. Это должно быть положительное число. поэтому умножил его на «-1». Еще раз спасибо :) – xperator

0

Вы могли бы компенсировать все так:

$today=new DateTime("-$offset minutes"); 
$tomorrow=new DateTime("+1 day-$offset minutes"); 
Смежные вопросы