在php中同步管理员和客户端时间的最佳方法

时间:2014-03-17 05:22:16

标签: php datetime

我不确定这是否是一个难题,但我无法弄清楚这种情况的最佳方式或方法是什么。

我想同步我现在正在使用的系统的管理员帐户的时间,以查看客户端时区的时间。我必须一直都是这样。例如,我在美国/纽约时区的管理时间是凌晨1点20分,我将根据他们的时区查看我的客户,例如“亚洲/新加坡”将是下午1:20。

上午1:20为管理员,但管理员查看客户端将是下午1:20。

根据时区转换这些时间的最佳方法是什么,并根据客户的时区将其同步到客户端。

我已经通过将我的函数转换为客户端来对此进行排序,但我必须将该函数用于我的数据库的每个日期时间。

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

最安全方式是要求用户输入他的时区(例如,当他注册到您的网站时)。如果您的服务的时区严重,您必须确保客户自己定义他的时区,并且他接受通过选中复选框或其他内容而未能设置其时区的所有损害。

如果您不想向客户询问他的时区,您可以尝试根据他的ip使用

猜测他的时区

通过php:https://github.com/maxmind/GeoIP2-php

通过js:https://bitbucket.org/pellepim/jstimezonedetect

根据我的经验,最安全的方法是询问用户。根据您提供给客户的服务,所需的时区并不总是用户当前位置的时区。

例如,如果我使用远程监控系统,我可能在日本,但我想检查我在美国的亿万富翁豪宅上的安全摄像头。所以我需要服务的时间来了解美国的时间,而不是我在日本的时间。

答案 1 :(得分:0)

不确定您的服务器是如何设置的。

如果您使用MYSQL,请使用TIMESTAMP类型来收集日期/时间数据。 MySQL会将标准时间戳记录到数据库中(无论时区如何,因为世界都有一个参考)。

当查询数据时,MySQL会在呈现之前自动将该数据转换为服务器时区(只是设置数据库服务器时的核心设置)。

您可以尝试SET time_zone = timezone;功能。

当您执行其他查询时,MySQL将根据您的数据库连接会话临时映射新时区。 (例如,单个网页请求)

例如,如果在打开数据库连接后立即运行查询。

SET time_zone = 'Australia/Sydney';

当您执行另一个查询时,所有SELECTED时间戳字段将转换为悉尼时区。(即使它同时运行,它也不会影响另一个会话。例如,没有MySQL set_time_zone查询的另一个PHP文件)< / p>

请注意,它不会修改您的字段或核心MySQL设置,因为它将仅基于会话进行实时转换。

=================示例===================

CREATE TABLE test_time (
  user_id varchar(50) NOT NULL,
  register_time timestamp NULL DEFAULT NULL,
  PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO test_time VALUES ('user1','2014-03-16 13:00:00'),('user2','2014-03-16 21:00:00');

在sydney.php

SET time_zone = 'Australia/Sydney';
SELECT * FROM test_time;

在singapore.php

SET time_zone = 'Asia/Singapore';
SELECT * FROM test_time;

在ny.php中

SET time_zone = 'America/New_York';
SELECT * FROM test_time;