Autor | Zpráva | ||
---|---|---|---|
had Profil * |
#1 · Zasláno: 21. 4. 2012, 23:19:26
Ahoj,
prosím Vás, už jsem bezradný. Google vše a zároveň nic, hodiny hledání chyby... Mám skript, který se mi přihlásí na routery a změní na všech čas. Funkce vypadá takhle: function zmenit_cas($ip, $cas = false, $posun = false){ // vyžaduje, aby bylo předem inicializované přihlášení k routeru // $ip - IP adresa routeru, kterému bude měněn čas // $cas - čas ve formátu YYYYMMDDHHMMSS, není-li zadáno, vygeneruje se aktuální // $posun - o kolik chceme posouvat (kladné číslo vpřed, záporné dozadu) // provedeme změnu nastavení času - vygenerujeme čas a pošleme request na router, ten si uloží konfiguraci. // Aby se nastavení uložilo, musí být router přihlášený. // jestliže nastavíme posun, bude se vždy provádět od aktuálního času, čili zmenit_cas("192.168.1.7", "20120301120000", 2); // provede na routeru 7 posun o 2 hodiny od aktuálního data. Tento příkaz by nenastavil 1. března 2012 na router.!!! if(!$cas and !$posun){ // nastavujeme aktuální čas $vysledny_cas = time(); }else{ // nastavujeme vlastní čas nebo posun if($posun){ // posun vždy od aktuálního času $cas = date("YmdHis"); } $rok = substr($cas, 0, 4); $mesic = substr($cas, 4, 2); $den = substr($cas, 6, 2); $hodina = substr($cas, 8, 2); $minuta = substr($cas, 10, 2); $sekunda = substr($cas, 12, 2); $vysledny_cas = mktime($hodina, $minuta, $sekunda, $mesic, $den, $rok); if($posun){ if($posun == "-1" or $posun == "1"){ $vysledny_cas = strtotime($posun." day", $vysledny_cas); }else{ $vysledny_cas = strtotime($posun." days", $vysledny_cas); } } } // do tohohle nešťourat a neměnit to - to jsou nastavení routeru, který si ukládá do svý konfigurace // nejdůležitější je přidat mu nakonec vygenerovaný čas v počtech sekund od 1.1.1970 $data = "form_submitted=1&config.tz_timezone_index=27&config.tz_timezone=3600&config.tz_daylight=false&config.tz_daylight_offset=3600&config.tz_daylight_start_month=2&config.tz_daylight_start_week=1&config.tz_daylight_start_day=0&config.tz_daylight_start_time=2&config.tz_daylight_end_month=9&config.tz_daylight_end_week=6&config.tz_daylight_end_day=0&config.tz_daylight_end_time=2&config.tz_enable_ntp=false&config.tz_ntp_addr=0&config.tz_time=".$vysledny_cas; $ch = curl_init("http://".$ip."/Tools/Time.shtml"); curl_setopt($ch, CURLOPT_POST, 1); // typ requestu curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // který data poslat curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // nesledovat redirecty curl_setopt($ch, CURLOPT_HEADER, 0); // nesledovat hlavičky curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // zajímají nás přijaté hlavičky z odpovědi serveru $a = curl_exec($ch); // doplníme malé zpoždění (kvůli hromadné změně konfigurací, aby nedošlo k pádu sítě) sleep("1.5"); if($a){ return true; }else{ return false; } } Vše fungovalo bez problémů, ale s přechodem na letní čas se mi na serveru vygeneruje o hodinu posunutý čas. Server používá PHP 4.3.x. Na testovacím serveru (localhost) používám 5.2.6. Na localhostu se vygeneruje čas posunutý o dvě hodiny. Prosím, mohli byste mi poradit, jak nastavit kde časová pásma a jak upravit script, aby to bylo nezávislé na nastavení serveru...? Vážně jsem už zkoušel všechno, dokonce jsem se snažil i naprogramovat přechod na letní čas... bohužel bez výsledku. Předem děkuji za pomoc. |
||
Tori Profil |
#2 · Zasláno: 22. 4. 2012, 01:08:40
|
||
had Profil * |
#3 · Zasláno: 22. 4. 2012, 12:08:08 · Upravil/a: had
hm...to bohužel nepomohlo. stále mi zobrazuje čas pouze v GMT a nezohledňuje ani nastavení časového pásma Europe/Prague nebo jiných...
je možné, že by GMT čas v unixu byl pořád "zimní"? Když jsem zkoušel přes www.epochconverter.com ručně zadat přechod zimního a letního času, tak mi to ukázalo rozdíl jedné vteřiny (ač by tam mělo být 3600)... z toho vyvozuju, že GMT čas asi stále jede po svým a drží zimní a nějaký přechod zimní / letní ho asi nezajímá....ne? server, na kterém má běžet finální verze má PHP 4.4.9, omlouvám se, uvedl jsem ho špatně. Nemá ani žádnou možnost nastavit nějaké časové pásmo... |
||
Chro Profil |
#4 · Zasláno: 22. 4. 2012, 12:58:56
Funkce date má druhý nepovinný parametr - timestamp, jehož hodnota může být minulá, aktuální, ale i budoucná.
$cas = date("YmdHis", time() + ($posun * 3600)); //V $posun hodnota např. 2 nebo -1 (hodiny) |
||
Jan Tvrdík Profil |
#5 · Zasláno: 22. 4. 2012, 14:11:05
had:
„je možné, že by GMT čas v unixu byl pořád "zimní"“ Ano, GMT čas je vždy (nezávisle na OS) „zimní“. Časové pásmo v Praze je občas +1 a občas +2, podle toho, zda je letní nebo zimní čas. |
||
had Profil * |
#6 · Zasláno: 22. 4. 2012, 14:26:34
no takže ve výsledku stejně musím asi udělat výpočet, jestli je zrovna letní, nebo zimní čas, že?
Nebo snad nějaká funkce v PHP umí tohle zjistit? Nebo vracet správný čas (letní i zimní) vzhledem k nastavenému časovému pásmu? |
||
Alex2008 Profil * |
#7 · Zasláno: 23. 4. 2012, 11:44:45
had:
Nevím, jestli je to přesné co hledáš, ale já si pro jistotu nastavuji čas přes toto: date_default_timezone_set("Europe/Prague"); A automaticky to nastavuje i čas podle toho jestli je čas letní nebo zimní... |
||
Tori Profil |
had:
> jestli je zrovna letní, nebo zimní čas, že? > Nebo snad nějaká funkce v PHP umí tohle zjistit? Zkuste, jestli na té verzi PHP bude fungovat date("I"); - mělo by to vracet 1 nebo 0 podle toho, jestli je letní čas nebo ne. Pak by stačila podmínka. Posun buď podle date("O"); nebo napevno dopsat.
|
||
Časová prodleva: 4 měsíce
|
|||
nemeja Profil |
Pěkný odpoledne, dneska jsem narazil na problém s časem. Vytvořil jsem si i jednoduchou podmínku na přepínání, ale nefunguje.
<?php if(date("I") == "1"){ date_default_timezone_set("Etc/GMT+2"); } else { date_default_timezone_set("Europe/Prague"); } ?> Tak už jsem zjistil čím to bylo, měl jsem blbě nastavený časový pásmo v PC. Měl jsem nastaveno na GMT+2 + letní čas a ne GMT+1 s letním časem. Každopádně to nic nemění na tom, že zadávání date_default_timezone_set("Etc/GMT+2"); mi nefunguje
|
||
Časová prodleva: 12 let
|
0