Autor Zpráva
had
Profil *
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
Zkuste kouknout na funkce gmdate a gmmktime - ty by měly vždy vracet GMT. Pak případně ručně doplnit +1h pro SEČ.
had
Profil *
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
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)
Nepomohlo by to?
Jan Tvrdík
Profil
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 *
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 *
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.
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");
} ?>
Europe/Prague mi hází normálně GMT+1, ale to GMT+2 mi nic nenastaví. Nevíte čím by to mohlo být? Mám PHP 5.3.10, který mi běží pod WAMPem. Děkuji za odpověd


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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: