我们正在构建一个将在全球范围内查看的网站,因此需要我们的日期和时间才能识别时区。我正在使用https://bitbucket.org/pellepim/jstimezonedetect中的库来恢复用户的时区以及他们是否观察到DST。
检索此信息后我的问题是,我对此怎么做有点困惑。我们将所有信息以UTC格式存储在数据库中,但是当我们从库中收到偏移量时,我们如何处理DST以及它们是来自北半球还是南半球。另外我们如何在服务器端处理它。我的想法是在PHP上以标准UTC处理所有日期和时间,然后在处理视图时应用偏移量。
非常感谢任何帮助。
亲切的问候
答案 0 :(得分:3)
首先,您应该仅使用jsTimezoneDetect来猜测用户的时区。它应该是用户可配置的,因为它可能是不正确的,并且因为用户可能想要使用另一个时区而不是他真正的时区。至少如果你有一个系统用户登录或者你有一个系统用户正在进入时代。
对于仅查看内容的临时访问者,在用户碰巧所处的任何时区显示时间都应该没问题,尽管如果jsTimezoneDetect猜错了时区并且夏令时规则不同,你可能会误解一小时。如果您依赖于jsTimezoneDetect的猜测,请确保清楚地显示您猜测用户所在的时区。
其次,您需要将UTC日期转换为用户已配置的时区(或jsTimezoneDetect已猜到)。你可以通过使用带有PHP支持的zoneinfo / tz / Olsen数据库(一个数据库,多个名称)来实现这一点。
我在PHP中可以找到的大多数配方都涉及为整个php设置时区,然后格式化日期。不要这样做,那是疯了,让php的时区始终与你的系统时区相同。
而是在DateTime library的DateTimeZone对象中支持设置DateTimes的时区并对其进行格式化。这是前进的方式。
所以你可以这样做。首先使用从数据库获取的数据以UTC格式创建DateTime对象。
php > $date = new DateTime('2000-01-01', new DateTimeZone('UTC'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
2000-01-01 00:00:00+00:00
然后您可以将其转换为用户时区:
php > $date->setTimezone(new DateTimeZone('Pacific/Chatham'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
2000-01-01 13:45:00+13:45
或另一个:
php > $date->setTimezone(new DateTimeZone('US/Eastern'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
1999-12-31 19:00:00-05:00