Преобразование дня и времени пользователя в день и время сервера в php - PullRequest
1 голос
/ 16 марта 2011

У меня есть сценарий, в котором пользователь выбирает время и день (или несколько дней), и это значение должно быть преобразовано в то, что этот день и время будут в UTC времени. У меня есть сумма смещения gmt для каждого пользователя (пользователи устанавливают его при регистрации). Например:

Пользователь в восточном часовом поясе выбирает:

15: 15, понедельник, вторник, пятница

Мне нужно знать, в какое время и в какие дни эта информация будет в UTC. Решение должно быть в ситуациях, когда понедельник в одном часовом поясе может быть другим днем ​​в UTC. Кроме того, если время можно преобразовать в 24-часовой формат, это будет плюсом.

Для ясности, что-то вроде строк массива должно быть возвращено, например:

Array('<3:15 pm eastern adjusted for utc>', '<Monday adjusted for UTC>', '<Tuesday adjusted for UTC>', '<Friday adjusted for UTC>');

Мне не нужно, чтобы результат был напрямую отформатирован в такой массив - это только конечная цель.

Я предполагаю, что это связано с использованием strtotime, но я просто не могу понять, как это сделать.

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Сделал функцию для выполнения работы:

<?

/*
 * The function week_times() converts a a time and a set of days into an array of week times. Week times are how many seconds into the week 
 * the given time is. The $offset arguement is the users offset from GMT time, which will serve as the approximation to their
 * offset from UTC time
 */
// If server time is not already set for UTC, uncomment the following line
//date_default_timezone_set('UTC');
function week_times($hours, $minutes, $days, $offset)
{

    $timeUTC = time(); // Retrieve server time

    $hours += $offset; // Add offset to user time to make it UTC time

    if($hours > 24) // Time is more than than 24 hours. Increment all days by 1
    {

        $dayOffset = 1;
        $hours -= 24; // Find out what the equivelant time would be for the next day

    }
    else if($hours < 0) // Time is less than 0 hours. Decrement all days by 1
    {

        $dayOffset = -1;
        $hours += 24; // Find out what the equivelant time would be for the prior day

    }

    $return = Array(); // Times to return

    foreach($days as $k => $v) // Iterate through each day and find out the week time
    {

        $days[$k] += $dayOffset;

        // Ensure that day has a value from 0 - 6 (0 = Sunday, 1 = Monday, .... 6 = Saturday)
        if($days[$k] > 6) { $days[$k] = 0; } else if($days[$k] < 0) { $days[$k] = 6; }

        $days[$k] *= 1440; // Find out how many minutes into the week this day is
        $days[$k] += ($hours*60) + $minutes; // Find out how many minutes into the day this time is

    }


    return $days;

}

?>
1 голос
/ 16 марта 2011
 $timestamp = strtotime($input_time) + 3600*$time_adjustment;

Результатом будет временная метка, вот пример:

 $input_time = "3:15PM 14th March";
 $time_adjustment = +3;

 $timestamp = strtotime($input_time) + 3600*$time_adjustment;

 echo date("H:i:s l jS F", $timestamp);
 // 16:15:00 Monday 14th March

РЕДАКТИРОВАТЬ: постоянно забывать мелочи, которые теперь должны отлично работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...