时区和夏季CodeIgniter



我为我的网站的所有用户寻找查看本地时间的更好的解决方案。

我有一个问题与夏季时间,实际上我得到了这个功能,如果你有一个更好的方法帮助我:

function timezone_by_offset($offset) {

 $abbrarray = timezone_abbreviations_list();
    $offset = $offset * 60 * 60;
    foreach ($abbrarray as $abbr) {
        foreach ($abbr as $city) {
            if ($city['offset'] == $offset && $city['dst'] == TRUE) { 
                return $city['timezone_id'];                                
            }
        }
    }
    return 'UTC'; // any default value you wish
}
echo timezone_by_offset(1) . '<br/>';  
echo (date_default_timezone_set(timezone_by_offset(1)) == TRUE ? 'Valid'. date('Y-m-d H:i:s') : 'Not Valid'). '<br/>';

解决方案:

<?php
 function get_timezones() 
 {
    $o = array();
    $t_zones = timezone_identifiers_list();
    foreach($t_zones as $a)
    {
        $t = '';
        try
        {
            //this throws exception for 'US/Pacific-New'
            $zone = new DateTimeZone($a);
            $seconds = $zone->getOffset( new DateTime("now" , $zone) );
            $hours = sprintf( "%+02d" , intval($seconds/3600));
            $minutes = sprintf( "%02d" , ($seconds%3600)/60 );
            $t = $a ."  [ $hours:$minutes ]" ;
            $o[$a] = $t;
        }
        //exceptions must be catched, else a blank page
        catch(Exception $e)
        {
            //die("Exception : " . $e->getMessage() . '<br />');
            //what to do in catch ? , nothing just relax
        }
    }
    ksort($o);
    return $o;
} 
$o = get_timezones();
?>
<html>
<body>
<select name="time_zone">
<?php
    foreach($o as $tz => $label)
    {
        echo "<option value="$tz">$label</option>";
    }
?>
</select>
</body>
</html>

问好。

UPDATE 3
第1部分-查找正确的时区
如果您正在查找timezone_name的偏移量和夏令时,您可以将timezone_name_from_abbr()的第三个参数设置为true,否则为false。如果您将其设置为1,并且offset + daylight saving没有给出有效的timezone_name,它将返回false。在这种情况下,您可以将其转回false。
示例

$tz = timezone_name_from_abbr(null, $offset * 3600, true);
if($tz === false) $tz = timezone_name_from_abbr(null, $offset * 3600, false);

第2部分-根据DAYLIGHT SAVINGS获取本地日期/时间
您不需要在这里做任何事情,一旦时区设置PHP日期函数自动设置夏令时根据您的时区和当前日期。所以

function print_according_to_offset($offset)
{
    $tz = timezone_name_from_abbr(null, $offset, true); //If a ofset with daylight savings is found
    if($tz === false) $tz = timezone_name_from_abbr(null, $offset, false); //otherwise
    if($tz === false) // If no timezone is still found
    {
        echo 'Invalid Offset <br />';
        return;
    }
    $otherTZ  = new DateTimeZone($tz); 
    $datetime = new DateTime; // current time = server time
    $datetime->setTimezone($otherTZ);
    echo $tz . '<br />';
    echo $datetime->format('Y-m-d H:i:s') .'<br /><br />';
}
print_according_to_offset(19800);

更新2

<?php
$timezone = '+0:00';
$timezone = preg_replace('/[^0-9]/', '', $timezone) * 36;
$timezone_name = timezone_name_from_abbr(null, $timezone, true);
date_default_timezone_set($timezone_name);
echo date('D d M Y H:i:s');
?>

更多信息

CI功能及改进代码

function print_according_to_offset($offset)
{
    $user_timezone =  timezone_name_from_abbr("",$offset,0);
    $otherTZ  = new DateTimeZone($user_timezone);
    $datetime = new DateTime; // current time = server time
    $datetime->setTimezone($otherTZ);
    echo $datetime->format('Y-m-d H:i:s') .'<br />';
}
print_according_to_offset(14400); //EXAMPLE

不要指望我们为你做所有的事情,编辑函数并返回$otherTZ如果你只需要获得时区。
旧帖
我想这正是你所需要的。

$offset = 3600 ; //your offset
$my_timezone =  timezone_name_from_abbr("",$offset,0);
date_default_timezone_set($my_timezone);
echo date('Y-m-d H:i:s');

更多信息

相关内容

  • 没有找到相关文章

最新更新