2016-09-02 3 views
0

У меня есть панель администратора, где введенные элементы будут иметь time_posted и время истечения. Эти времена используют временную метку (time()) после ввода.PHP дат и часовых поясов

Я хочу, чтобы время истечения срока действия использовалось для выбора подходящего времени/времени, но селектор использует время клиента JavaScript, а не время сервера.

Способ исправить это будет сохранить часовой пояс, в котором находится пользователь, а затем использовать это как смещение для введенных данных, но это то, что должно быть на 100% правильным.

Есть ли «правильный» способ приблизиться к этому? Я видел, что некоторые функции PHP используют настройку часового пояса, а другие нет, например, фактическая функция time() не делает и даже если я создаю объект DateTime, выведите текущую временную метку, измените часовой пояс и снова выведите метку времени, она просто вернется одна и та же временная метка дважды.

Все указатели были бы прекрасные

+1

'time()' возвращает временную метку Unix, и эта метка времени не зависит от часовых поясов. –

+0

Это не мой вопрос, но мой вопрос заключается в использовании смещения на стороне сервера, чтобы получить правильную временную метку Unix с локальной отметки времени, которую клиент отправляет на основе сохраненного часового пояса учетной записи. – Ieuan

+0

Получите серию избранных дат, чтобы дать вам временную метку UNIX/Javascript 'Date', из которого вы можете получить временную метку UNIX, не зависящую от времени. – deceze

ответ

2

Я предполагаю, что фактическое значение временной метки все равно будет правильным (независимыми) независимо от того, какие параметры/часовой пояс имеет конечный пользователь.

Проблемы могут возникать при/если вы хотите генерировать строки даты на стороне сервера и, таким образом, возвращать время со смещениями.

Либо 1. Dont генерировать сторону даты строки сервера, если вы не уверены в часовом поясе смещения или 2. предостерегают пользователей и убедитесь, что они определяют их часовой пояс, а затем заставить этот часовой пояс, когда вы выводите строка даты из временных меток

+0

Проблема в основном в том, что сохраненное значение должно быть отметкой времени unix (очевидно). Мне нужен способ конвертировать из клиентского времени в временную метку unix, а из временной отметки unix мне нужно отобразить время в часовом поясе пользователя. Действительно ли это так просто, как просто сохранить временную метку Unix, а затем использовать объект DateTime для отображения? – Ieuan

+0

Да, это так просто. Если вы хотите отображать время в зависимости от времени компьютера конечных пользователей, просто сделайте это в javascript. Я не знаю подробностей, но я бы предположил, что было бы безопаснее устанавливать/хранить указанный пользователем часовой пояс. Таким образом, когда один и тот же пользователь или кто-то еще регистрируется на компьютере с разным часовым поясом, отображаемое время все еще соответствует исходному входу. – kitaps

1

несколько вещей:

  • вы, вероятно, не нужно, чтобы определить часовой пояс пользователя для сценария вы описываете, но если вы сделали то, пожалуйста, повторно познать, что часовой пояс и смещение - две разные вещи. См. «Часовой пояс! = Смещение» в the timezone tag wiki. Если вы действительно думаете, что вам нужен часовой пояс пользователя (например, "America/Los_Angeles"), обратитесь к this answer.

  • Если вы хотите, чтобы введенная дата была относительно локального часового пояса клиента, вам необходимо использовать либо объект Date, либо библиотеку, такую ​​как moment.js в JavaScript. Используйте отдельные компоненты даты/времени из списка выбора даты, чтобы получить либо временную метку unix, либо строку даты/времени в формате ISO8601 в формате UTC. Например, "2016-09-02T01:23:45Z"

  • Если вы хотите, чтобы введенная дата была относительно какого-либо другого часового пояса, вам необходимо передать фактические значения, введенные клиентом без изменений. Лучший способ - в формате ISO8601 без смещения. Например, "2016-09-02T08:00:00". На стороне сервера проанализируйте это значение и примените любой часовой пояс.

  • Если вы выбираете только дату, а не время, то вам действительно нужно подумать о том, применимо ли какое-либо время или нет. Действительно ли 00:00? Или это должно быть 24:00 или 23:59:59.999? Если вы не заботитесь о часовом поясе пользователя, то действительно вам не следует назначать какое-либо значение времени вообще. Просто передайте дату.Например: "2016-09-02"

  • Не полагайтесь на настройку часового пояса сервера, чтобы быть чем-то конкретным. Хотя PHP имеет функциональность для установки «по умолчанию» часового пояса, вы должны попытаться избежать его использования. Гораздо безопаснее говорить о часовых поясах на основе операции. Используйте класс DateTime в PHP, а не time().

Обязательно прочитайте Daylight saving time and time zone best practices и тщательно искать другие вопросы по StackOverflow, так как многое из этого было отвечено уже в ряде других вопросов.

+0

Мне определенно нужны смещения, а не часовые пояса для отображения часовых поясов пользователям, но выбор их смещения путем выбора их часового пояса в их настройках профиля намного проще для них, чем для их ввода смещения. Спасибо за другие указатели. – Ieuan

+0

Просто будьте осторожны - вы не можете получить текущее смещение и предположить, что оно применяется ко всем моментам времени. Многие совершают эту ошибку. Переход на летнее время мешает. –

+0

Но если я использую DateTimeZone/DateTime, чтобы отформатировать даты, которые должны быть в порядке? Установите временную метку, затем установите часовой пояс и отформатируйте? – Ieuan

Смежные вопросы