计算哪些时区在PHP上有特定的当前本地时间

计算哪些时区在PHP上有特定的当前本地时间,php,timezone,Php,Timezone,我的应用程序需要在当地时间下午6:00向所有用户发送电子邮件。 服务器配置为GMT。 我有一个在每小时开始时被调用的函数。 我如何找出现在下午6:00的时区(PHP时区)? (这样,我可以查询数据库,找到所有设置为该时区的用户,并向他们发送电子邮件)。 也可以在不迭代整个时区数组的情况下执行此操作吗? 谢谢。我之前的回答不太好,因为夏令时不允许您以相对于GMT的绝对偏移量定义时区。假设您将时区存储在中,这里有一个更好的解决方案。此脚本应在一刻钟内每15分钟运行一次 // Target local

我的应用程序需要在当地时间下午6:00向所有用户发送电子邮件。 服务器配置为GMT。 我有一个在每小时开始时被调用的函数。 我如何找出现在下午6:00的时区(PHP时区)? (这样,我可以查询数据库,找到所有设置为该时区的用户,并向他们发送电子邮件)。 也可以在不迭代整个时区数组的情况下执行此操作吗?
谢谢。

我之前的回答不太好,因为夏令时不允许您以相对于GMT的绝对偏移量定义时区。假设您将时区存储在中,这里有一个更好的解决方案。此脚本应在一刻钟内每15分钟运行一次

// Target local time in hours (6:00 PM = 18:00)
$targetHour = 18;

// Get timestamp of nearest quarter-hour.
// (Assuming this is being run by cron on-the-quarter-hour by server time)
date_default_timezone_set('GMT');
$currentHourTimestamp = (round(time() / 900) * 900);

// Calculate offset in hours to target hour
$targetDateTime = new dateTime('@' . $currentHourTimestamp, new DateTimeZone('GMT'));
$targetDateTime->setTime($targetHour, 0, 0);
$targetOffset = $targetDateTime->getTimestamp() - $currentHourTimestamp;


// You can get this from the database with a 
// 'SELECT DISTINCT timezones FROM users' query or similar
$timezonesUsed = array('America/Los_Angeles', 'America/Phoenix', 'Europe/Budapest', 'Europe/Dublin');

$matchingTimezones = array();
foreach($timezonesUsed as $localTimezone)
{
    // throws an Exception if timezone is not recognized
    $localDateTimezone = new DateTimeZone($localTimezone);
    $localOffset = $localDateTimezone->getOffset($targetDateTime);

    if($localOffset == $targetOffset)
    $matchingTimezones[] = $localTimezone;
}


// Now send emails to users in database with timezones in $matchingTimezones

编辑:修改脚本,以便根据Catcall的建议使用四分之一小时。

如何为每个用户存储时区数据?有一个mysql用户表。每一行都是不同的用户,其中一列包含时区信息。有多种方法可以指定时区,您可以指定具体的时区。确定。我想到了使用php格式。例如“美国/纽约”。谢谢。我考虑过使用php datetimezone格式(例如“America/New_York”)。有没有办法使用dateformat函数来获得所需的结果?您建议的方法会考虑DST吗?@Avi,这是DST的一个很好的观点,因为它不仅仅依赖于时区(例如亚利桑那州/夏威夷州)…我将试用DateTime函数,看看是否能找到答案。@Avi:更新了我的答案。问得好,需要一些思考!我想知道是否有人知道内置的“获取所有时区,n偏移量为GMT”方法,因为这样会更有效,但对于这种每小时运行一次的东西,这应该是可以的。存储时区及其偏移量可能是有意义的。所有这些数据都在PostgreSQL的系统表中。运行
SELECT*FROM pg_timezone_names
返回567行。@Catcall是的,如果您使用PostgreSQL作为RDBMS,这是一个很好的解决方案,因为它会自动更新表值以处理DST更改。不过,时区不仅仅是+/-GMT偏移量和DST标志,如果您使用的是静态表,则必须添加这一点。