1

背景:我有一个允许用户创建待办事项的系统。目前,cron 作业每 12 小时触发一次,并发送我们的提醒电子邮件。问题?不是每个用户都在同一个时区,所以我的早上 7 点可以是他们的凌晨 1 点。

目标:允许用户选择自己的时区。此外,允许用户选择自己喜欢的时间,以 15 分钟为增量(选择小时和 00、15、30 或 45)。

我所拥有的:我在我的网络应用程序上设置了一个变量来匹配电子邮件服务器的时区(-0600)。我允许用户提交他们自己的时区和两个首选的电子邮件时间。我正在编写一个脚本来检查当前时间是否与用户的首选发送时间匹配,并查看用户的时区是否与系统的时区匹配。

背景,第二部分:当用户提交他们的时区时,此时他们选择了他们喜欢的两个时间(所有这三个信息都被放入数据库中他们自己的单元格)。

我陷入困境的地方:我认为最好的选择是在用户提交时将首选时间($etime1 和 $etime2)转换为系统的时区($systz),因此它作为系统的时区存储在数据库中。这样,计算是在用户提交他们的偏好时完成的(不是经常),而不是每次运行 cron 作业时(经常 - 每 15 分钟)。用户的时区位于变量 $uzertz 下。

所以:用户提交数据,这就是我所拥有的”

if ($usertz == $systz) {
*submit the $etime1 and $etime2 data as-is*}
else { *run some sort of script to convert $etime1 and $etime2 to the -0600
(system's timezone) equivalent, after which is should be submitted to the db in it's
converted version* } 

我了解 PHP 提供了将时间从一个时区转换为另一个时区的方法,但我一直很难理解这些脚本是如何工作的,特别是因为我发现的那些是查看系统时间,而不是用户提交的时间。

谢谢!

4

2 回答 2

2

在服务器中,您应该始终使用 GMT。这是获得一致时间测量的唯一方法,例如在夏令时。顺便说一句,要将时间转换为其他时区,您可以使用DateTime

<?php
$date = new DateTime($etime1, new DateTimeZone($usertz));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone($systz));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>

您可以使用函数DateTimeZone::listIdentifiers()找到所有可用时区的列表。

例子:

<?php
  // Server date/time
  $etime1 = '2012-11-22 08:00:00'; 
  // Server timeZone
  $date = new DateTime($etime1, new DateTimeZone('Asia/Jerusalem'));

  // Converted date/time
  $date->setTimezone(new DateTimeZone('America/Chicago')); 
  echo $date->format('Y-m-d H:i:sP') . "\n"; 
?>

输出是:

2012-11-22 00:00:00-06:00  
于 2012-11-21T13:02:37.183 回答
0

您可以使用DateTimePHP 5 中提供的对象。

这允许您在创建 DateTime 时提供一个DateTimeZone对象。

$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));

您还可以动态更改时区。

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
于 2012-11-21T13:04:15.273 回答