2015-05-28 3 views
-1

Я ищу лучшее решение для просмотра локального времени для всех пользователей моего сайта.Часовой пояс и летнее время 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> 

С наилучшими пожеланиями.

ответ

0

UPDATE 3
ЧАСТЬ 1 - Поиск правильного часового пояса
Если вы ищете TIMEZONE_NAME с помощью его смещения и HAS летнее установить третий параметр timezone_name_from_abbr() истинно, в противном случае ложного , Если вы установите его на 1, а смещение + переход на летнее время не даст действительного имени 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); 

UPDATE 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'); 
?> 

More information
UPDATE
функция 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 

Dont ожидать, что мы делаем все, для вас, отредактируйте функцию и верните $ otherTZ, если вам нужно получить только часовой пояс.
Old Post
Я думаю, что это то, что вам нужно.

$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'); 

More info

+0

Зонное не исправить, мои пользователи на моем сайте является международной, я использую CodeIgniter рамки и я получил функцию ПОЛУЧИТЬ часовой пояс (UTC + 1, UTC + 2, UTC + 3, и т. д.), но я не знаю, как это правильно – Rodo

+0

Это в php, а CI основан на php. Это определенно будет работать с CI, все, что вам нужно, это установить смещение. Но я обновил решение, чтобы вы могли легко реализовать CI –

+0

, поэтому ваша система делает то же самое, что и я, за исключением того, что моя проблема смещена, я не знаю, что соответствует смещению UTC +1, например – Rodo

Смежные вопросы