Řešení časových zón od Ivana Doležala

Z VirtlabWiki

Přejít na: navigace, hledání

V MySQL mam cas jako typ datetime v UTC. Casovou zonu si uzivatel nastavi pomoci vhodne volby v menu (i kdyz, jak ted googluji, da se zrejme vycist ruznymi zpusoby i z prohlizece) a dale se udrzuje v cookie:

<form action="changezone.php">
<?php
 printf('<select title="%s" name="selecttimezone">',msg_get_str('SELECT_TIME_ZONE'));
 foreach( tz_get_zone_list() as $key => $value )
 {
   printf("   <option %s value=\"%s\">%s</option>\n",(tz_get_tz()==$key)?'selected':'',$key,$value);
 }
?>
</form>

a v changezone.php nasledne

tz_set_tz($_REQUEST['selecttimezone']);


kdyz si chci vypsat nejaky cas, provadim v SQL:

select UNIX_TIMESTAMP(liveshow.starttime) as zacatek

a ziskanou hodnotu pak vypisu napriklad pomoci:

tz_strftime("%H:%M",$dennidata['zacatek'])

Kdyz chci vlozit cas, provadim zhruba toto:

$sql=sprintf( "REPLACE INTO liveshow SET  starttime=from_unixtime(%s)", tz_mktime($hour,$min,$month,$day,$year))

Je potreba do OS nainstalovat podporu vsech myslitelnych casovych zon, v Debianu jde o jedno

dpkg-reconfigure locales

Doporucuji si ale pak pro kontrolu vypsat seznam vygenerovanych locales

locale -a

---

global $tz_preffered_tz;
// Check out /usr/share/zoneinfo/
$tz_timezones_list = array(
       'HST' => 'HST',
       'PST8PDT' => 'PST',
       'MST7MDT' => 'MST',
       'CST6CDT' => 'CST',
       'EST5EDT' => 'EST',
       'Universal'=>'UTC',
       'WET'     => 'WET',
       'CET'     => 'CET',
       'EET'     => 'EET',
       'W-SU'    => 'MSK',
       'Singapore'=>'SGT',
       'ROK'     => 'KST',
       'NZ'      => 'NZT',
       'NZ-CHAT' => 'CHAT'
       );

function tz_get_zone_list()
{
 global $tz_timezones_list;
 return $tz_timezones_list;
}

function tz_name_timezone( $code )
{
 global $tz_timezones_list;
 if( array_key_exists($code, $tz_timezones_list) )
   return $tz_timezones_list[$code];
 else
   return $code;
}

function tz_set_tz( $zone ) {
   if( in_array( $zone ,array_keys( tz_get_zone_list() )) )
   {
   putenv('TZ='.$zone);
   $GLOBALS["tz_preffered_tz"] = $zone;
   @setcookie('preffered_tz', $zone, 2100000000, '/', $_SERVER['HTTP_HOST'], 0 );
   }
   else
   {
       printf('%s - tz_set_tz(%s)',msg_get_str(TEMP_ERROR), $zone);
   }
}


function tz_get_tz() {
 if( isset($_COOKIE['preffered_tz']) ) {
   $GLOBALS["tz_preffered_tz"] = $_COOKIE['preffered_tz'];
 }
 else
 {
   if( ! isset($GLOBALS["tz_preffered_tz"]))
     $GLOBALS["tz_preffered_tz"] = 'CET';
 }
 return $GLOBALS["tz_preffered_tz"];
}


function tz_mktime( $hour, $minute, $second, $month, $day, $year )
{
 putenv('TZ='.tz_get_tz());
 return mktime( $hour, $minute, $second, $month, $day, $year );
}


function tz_strftime( $source, $now )
{
 putenv('TZ='.tz_get_tz());
 setlocale(LC_TIME,$_COOKIE['preffered_language'].'.UTF-8');
 return strftime( $source, $now );
}
Osobní nástroje