PHP将TimeZone转换为提醒电子邮件

PHP Convert TimeZone for Reminder Emails

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

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

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

背景,第二部分:当用户提交他们的时区时,他们在那时选择他们的两个首选时间(这三个信息都被放入他们自己的数据库中)。

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

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

1
2
3
4
5
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提供了将时间从一个时区转换到另一个时区的方法,但是我一直很难跟踪这些脚本是如何工作的,特别是因为我发现这些脚本正在查看系统时间,而不是用户提交的时间。

谢谢!


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

1
2
3
4
5
6
7
8
9
<?php
$date = new DateTime($etime1, new DateTimeZone($usertz));
echo $date->format('Y-m-d H:i:sP') ."
"
;

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

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

例:

1
2
3
4
5
6
7
8
9
10
11
<?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') ."
"
;
?>

输出是:

1
2012-11-22 00:00:00-06:00


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

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

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

您还可以动态更改时区。

1
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));