php – 优雅的星期功能

我有一个PHP函数,根据当前时间是否在任意数量的预定义“hotzones”中返回bool.时区是美国/芝加哥(UTC – 0600).以下作品:

$d = 60*60;                    /* duration of hotzone */
$o = -(3*24+18)*3600;          /* offset to bring UNIX epoch to 12a Sun local*/
$curTime = (time()-$o)%604800; /* time since 12a Sun */

/* Hotzones */
$hottime = array();
$hottime[0 ] = (0*24+11)*3600; /* 11a Sun */
$hottime[1 ] = (0*24+18)*3600; /*  6p Sun */
$hottime[2 ] = (2*24+19)*3600; /*  7p Tue */
$hottime[3 ] = (3*24+ 6)*3600; /*  6a Wed */
$hottime[4 ] = (3*24+11)*3600; /* 11a Wed */

$hottimes = count($hottime);

for ($i = $hottimes-1; $i>=0; $i--) {
  if (($curTime > $hottime[$i])&&($curTime < $hottime[$i]+$d)) {
    return true;
  }
}

return false;

但是,我必须每年两次手动更新夏令时,我不得不认为这比我计算的黑客“偏移”更自然,更优雅.有没有人遇到过更好的方法来做到这一点,考虑到夏令时?

解决方法:

您可以使用DateTime类:

$hottimes = array (
    array(
        'start'=> new DateTime('Sun 11:00:00 America/Chicago'),
        'stop'=> new DateTime('Sun 12:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Sun 18:00:00 America/Chicago'),
        'stop'=> new DateTime('Sun 19:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Tue 19:00:00 America/Chicago'),
        'stop'=> new DateTime('Tue 20:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Wed 06:00:00 America/Chicago'),
        'stop'=> new DateTime('Wed 07:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Wed 11:00:00 America/Chicago'),
        'stop'=> new DateTime('Wed 12:00:00 America/Chicago')
    )
);

$Now = new DateTime();

foreach($hottimes as $hotime) {
    if($Now >= $hotime['start'] && $Now < $hotime['stop']) {
        return true;
    }
}

您不应该将UNIX时间戳用于此类事情.使用DateTime是首选方式.另请阅读sven的评论. (谢谢)

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...