Базовое преобразование часовых поясов PHP

Я просмотрел предыдущие вопросы, и кажется, что ничего не соответствует тому, что мне нужно.

Я работаю над системой планирования, и теперь клиент хочет добавить часовые пояса.

Поэтому в основном мне нужно иметь возможность выполнить действие в определенную дату и время.

Допустим, кто-то хочет получить оповещение в следующую дату/время:

25-12-2010 13:01:00 +/- их часовой пояс

Мне нужно иметь возможность хранить это в mysql как unix_timestamp, я смотрел на PHP DateTime и DateTimeZone, но это меня больше смутило.

Я также просмотрел strtotime, я просто не уверен, как лучше всего определить дату/время со смещением.


person Kyle Hudson    schedule 16.11.2010    source источник
comment
@Kyle Hudson - храните время только в часовом поясе вашего сервера выполнения со столбцом, чтобы указать, какова разница между часовым поясом вашего клиента и часовым поясом вашего сервера выполнения, например, часовой пояс вашего клиента быстрее на 3600 секунд, чем ваш сервер выполнения, поэтому хранится -3600, и суммируем его   -  person ajreal    schedule 16.11.2010
comment
почему вы не можете использовать столбец DateTime или Timestamp? Кроме того, см. здесь пример использования DateTime и DateTimezone.   -  person Gordon    schedule 16.11.2010
comment
@Gordon +1, @ajreal: не будет ли это +3600?   -  person Kyle Hudson    schedule 16.11.2010
comment
@Kyle Hudson - в обратном порядке, если ваш сервер выполнения медленнее, вам нужно будет суммировать -3600, чтобы ваш скрипт мог работать на час вперед, и наоборот   -  person ajreal    schedule 16.11.2010
comment
@ajreal: что ты имеешь в виду? сервером исполнения? это cron, который запускается каждую минуту. Сервер — Европа/Лондон 1926 (на момент написания этой статьи)   -  person Kyle Hudson    schedule 16.11.2010
comment
@ Кайл Хадсон - пусть сказал 1926 год в Лондоне, то есть 1826 год в Париже. Если сохраненное время равно 1926, сумма с -3600 секундами будет 1826, верно? или я неправильно интерпретировал?   -  person ajreal    schedule 16.11.2010


Ответы (1)


Просто чтобы убедиться, что мы находимся на одной странице, я просто хочу повторить, что отметка времени unix — это просто количество секунд, прошедших с «эпохи Unix» (1 января 1970 г.). Поэтому простая математика будет работать с временными метками unix.

Есть два способа сделать это; судя по вашему сообщению, вы запутались в том, что вы хотели бы использовать.

Первый способ был бы самым простым (и наиболее логичным), это сохранить их смещение (если оно у вас уже есть) и умножить его на 3600 (1 час в секундах), а затем добавить это значение текущей временной метки unix, чтобы получить окончательное время их выполнения.

Другой способ сделать это — использовать классы DateTime и DateTimeZone. Как эти два класса работают, как показано здесь, вы создаете два DateTimeZone объекта, один с вашим часовым поясом и один с их часовым поясом; создать два объекта DateTime с первым параметром, равным "now", и вторым, являющимся ссылкой на объекты DateTimeZone выше (соответственно); а затем вызовите метод getOffset для вашего объекта часового пояса, передав их объект часового пояса в качестве первого параметра, в конечном итоге получив смещение в секундах, которое можно добавить к текущей метке времени unix для получить время, необходимое для выполнения их задания.

Второй способ кажется намного более сложным для такой простой задачи, если я сам так говорю, поэтому первое решение может лучше соответствовать вашим потребностям. Однако, если вы хотите иметь более полный метод, то использование DateTime и DateTimeZone определенно возможно.

Небольшое примечание о strtotime: Strtotime — это простая противоположность команде date(), и от нее будет не больше пользы, чем «инструмент» для достижения того, что вы ищете. Он сам по себе не будет конвертировать или находить смещения для вас; он просто преобразует отформатированные дату и время в отметку времени unix.

person Qix - MONICA WAS MISTREATED    schedule 16.11.2010