Разница углеродного времени местного времени и времени сервера

Я использую Laravel 4 и пытаюсь рассчитать разницу между временем на сервере и экономией времени в базе данных в часах. Вот код:

Время на сервере=timeNowOnServer // 2016-02-03 19:05:43 Время, сохраненное в базе данных = setTime // 18:00:00

        $timeNowOnServer = null;
        $setTime = null;

        $timeZone = $company->time_zone;
        $company->save();

        // My Time
        $hour = substr($company->emp_auto_logout_time, 0, 2);
        $setTime = Carbon::createFromTime($hour);

        // Server Time Same as Mine
        $timeNowOnServer = Carbon::now();
        $timeNowOnServerSameAsMine = $timeNowOnServer->setTimezone($timeZone);

        // Time Differnce Between SetTime and TimeOnServerSameAsMine
        $timeDiff = $setTime->diffInHours($timeNowOnServerSameAsMine, $abs = false);

Например, если Server Time — это 14:00:00, а Set Time — это 19:00:00. Мой часовой пояс GMT +5 Pakistan.

Что я делаю, так это добавляю настройку Server Time в соответствии с временем пользователя, указав time zone в 3-й последней строке приведенного выше кода.

Когда я использую diffInHour, вместо 0 он дает мне -5 или 5. Это означает, что он использует UTC (Server Time), и поэтому дает неправильную разницу в часах.

Может кто-нибудь, пожалуйста, дайте мне знать, где я ошибаюсь?


person MKJ    schedule 03.02.2016    source источник


Ответы (1)


Вы пытаетесь изменить время в разных часовых поясах. Разница во времени (интервал) является абсолютной величиной, она не зависит от часового пояса. Одна секунда всегда одна секунда, будь то UTC или Europe/Moscow.

Попробуйте без часового пояса (вернее, используя часовой пояс сервера по умолчанию)

$timeDiff = $setTime->diffInHours($timeNowOnServer, $abs = false);

Всегда вычисляйте интервалы, используя метки времени или один и тот же часовой пояс (не имеет значения, какой именно) для обоих значений DT.

person ksimka    schedule 03.02.2016
comment
Как получить метки времени от углеродного объекта? - person MKJ; 03.02.2016
comment
@MKJ $carbonObject->timestamp. Помог ли мой пример? - person ksimka; 03.02.2016
comment
да, мне помогло. Спасибо. На самом деле мне нужно получить текущее время сервера и установить время из БД, а затем преобразовать серверное время в соответствии с часовым поясом локального времени пользователя, мне просто нужны часы. Затем сравните, если Часы работы сервера › Установите час (час сохраненного времени в БД) и выполните действие, если это правда. Это правильный подход? - person MKJ; 03.02.2016
comment
Я не уверен, что правильно понял вашу задачу. Если речь идет о том, чтобы начать что-то вовремя (вид расписания), вам нужно отформатировать дату и время в часовом поясе, в котором должно быть выполнено действие. А затем сравните представление dt, а не абсолютную разницу. - person ksimka; 04.02.2016