背景:我有一个允许用户创建待办事项的系统。目前,一个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提供了将时间从一个时区转换到另一个时区的方法,但是我一直很难跟踪这些脚本是如何工作的,特别是因为我发现这些脚本正在查看系统时间,而不是用户提交的次。
谢谢!
答案 0 :(得分: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
答案 1 :(得分:0)
您可以使用PHP 5中提供的DateTime
对象。
这允许您在创建DateTime时提供DateTimeZone
对象。
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
您还可以动态更改时区。
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));