根据其他时区在一个时区中获取办公时间

时间:2013-11-14 04:33:36

标签: php timezone timezone-offset

我正在尝试编写一个函数,该函数返回当人们在不同的时区工作时,他们当前是否在办公室。下面的代码似乎有效,但对我来说似乎很麻烦。我想知道是否有更好的方法。

    <?
    function isInoffice($remote_tz){

        $office_hours = array(
            'Monday'    =>'9:00-17:00',
            'Tuesday'   =>'9:00-17:00',
            'Wednesday' =>'9:00-17:00',
            'Thursday'  =>'9:00-17:00',
            'Friday'    =>'9:00-17:00',
            'Saturday'  =>'9:00-12:00',
            'Sunday'    =>'0:00-0:00'
            );

        $origin_tz      = 'Australia/Melbourne';
        $origin_dtz             = new DateTimeZone($origin_tz);
        $remote_dtz             = new DateTimeZone($remote_tz);
        $origin_dt      = new DateTime("now", $origin_dtz);
        $remote_dt      = new DateTime("now", $remote_dtz);
        $offset             = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);

        $date   = getdate();
        $local  = $office_hours[$date['weekday']];

        $x      = explode('-',$local);
        $start  = str_replace(':','',$x[0]);
        $end     = str_replace(':','',$x[1]);

        $now = date('Hm',time()-$offset);

    //echo "$start - $end - $now";

        if( ($now>$start) && ($now < $end)){
            return 1;   
        } else {
            return 0;       
        }

    }

    echo isInoffice('America/New_York');

    ?>

1 个答案:

答案 0 :(得分:1)

不需要原始时区,然后计算原始时区和远程时区之间的偏移量;没有这个就可以完成。 时区办事处无关紧要,办公时间$office_hours始终适用于当地时间。说,你可以删除一半的计算。

使用:

var_dump( isOfficeTime('America/New_York') ); # bool(false)
var_dump( isOfficeTime('Europe/Berlin') );    # bool(true)
var_dump( isOfficeTime('Australia/Sydney') ); # bool(false)
var_dump( isOfficeTime('Asia/Hong_Kong') );   # bool(false)

<强>功能:

function isOfficeTime($tz) {
    $office_hours = array(
        'Monday'    => array('9:00', '17:00'),
        'Tuesday'   => array('9:00', '17:00'),
        'Wednesday' => array('9:00', '17:00'),
        'Thursday'  => array('9:00', '17:00'),
        'Friday'    => array('9:00', '17:00'),
        'Saturday'  => array('9:00', '12:00'),
        'Sunday'    => array('0:00', '0:00'),
    );

    $tz  = new DateTimeZone($tz);
    $now = new DateTime('now', $tz);
    $start = new DateTime($office_hours[$now->format('l')][0], $tz);
    $end   = new DateTime($office_hours[$now->format('l')][1], $tz);

    return $start != $end && $start <= $now && $now < $end;
}

<强> Demo