Řešení časových zón od Ivana Doležala
Z VirtlabWiki
(Rozdíly mezi verzemi)
| Verze z 09:35, 26. 10. 2007 Gry72 (Diskuse | příspěvky) ← Předchozí porovnání |
Aktuální verze Gry72 (Diskuse | příspěvky) |
||
| Řádka 1: | Řádka 1: | ||
| 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: | 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: | ||
| - | <nowiki> | + | <pre> |
| <form action="changezone.php"> | <form action="changezone.php"> | ||
| <?php | <?php | ||
| Řádka 11: | Řádka 11: | ||
| ?> | ?> | ||
| </form> | </form> | ||
| - | </nowiki> | + | </pre> |
| a v changezone.php nasledne | a v changezone.php nasledne | ||
| - | + | <pre> | |
| tz_set_tz($_REQUEST['selecttimezone']); | tz_set_tz($_REQUEST['selecttimezone']); | ||
| - | + | </pre> | |
| kdyz si chci vypsat nejaky cas, provadim v SQL: | kdyz si chci vypsat nejaky cas, provadim v SQL: | ||
| - | + | <pre> | |
| select UNIX_TIMESTAMP(liveshow.starttime) as zacatek | select UNIX_TIMESTAMP(liveshow.starttime) as zacatek | ||
| - | + | </pre> | |
| a ziskanou hodnotu pak vypisu napriklad pomoci: | a ziskanou hodnotu pak vypisu napriklad pomoci: | ||
| - | + | <pre> | |
| tz_strftime("%H:%M",$dennidata['zacatek']) | tz_strftime("%H:%M",$dennidata['zacatek']) | ||
| + | </pre> | ||
| Kdyz chci vlozit cas, provadim zhruba toto: | Kdyz chci vlozit cas, provadim zhruba toto: | ||
| - | + | <pre> | |
| $sql=sprintf( "REPLACE INTO liveshow SET starttime=from_unixtime(%s)", tz_mktime($hour,$min,$month,$day,$year)) | $sql=sprintf( "REPLACE INTO liveshow SET starttime=from_unixtime(%s)", tz_mktime($hour,$min,$month,$day,$year)) | ||
| - | + | </pre> | |
| Je potreba do OS nainstalovat podporu vsech myslitelnych casovych zon, v Debianu jde o jedno | Je potreba do OS nainstalovat podporu vsech myslitelnych casovych zon, v Debianu jde o jedno | ||
| - | + | <pre> | |
| dpkg-reconfigure locales | dpkg-reconfigure locales | ||
| - | + | </pre> | |
| Doporucuji si ale pak pro kontrolu vypsat seznam vygenerovanych locales | Doporucuji si ale pak pro kontrolu vypsat seznam vygenerovanych locales | ||
| - | + | <pre> | |
| locale -a | locale -a | ||
| - | + | </pre> | |
| - | + | --- | |
| - | <nowiki> | + | <pre> |
| global $tz_preffered_tz; | global $tz_preffered_tz; | ||
| // Check out /usr/share/zoneinfo/ | // Check out /usr/share/zoneinfo/ | ||
| Řádka 116: | Řádka 117: | ||
| return strftime( $source, $now ); | return strftime( $source, $now ); | ||
| } | } | ||
| - | </nowiki> | + | </pre> |
| [[Kategorie:HOW-TO]] | [[Kategorie:HOW-TO]] | ||
| [[Kategorie:PHP]] | [[Kategorie:PHP]] | ||
Aktuální verze
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 );
}
