Autor Zpráva
Milkys
Profil
Dobrý den vážení,
chtěl bych vás požádat o radu, kterou jste už možná někdo řešil.
Mám např. formát data:
2014-11-22T21:27:02+01:00
nebo třeba
2015-07-11T14:00:00+02:00

Potřebuji záznamy seřadit podle datumů a časů.
strtotime() mi to převede na řetězec, ale už nepřičte + 1 hodinu resp. + 2hodiny.

Dalo by se to rozdělit pomocí explode a 1. pole (to co je za "+") předělat na sekundy a přičíst k hodnotě, kterou mi vrátí strtotime().
Zdá se mi to zbytečně složité a proto se ptám.
Existuje v php funkce, která timezone automaticky přičítá do unix času.
Snad jsem se vyjádřil správně, kdyžžtak mě opravte.
Děkuji za reakce.
Tomáš123
Profil
Milkys:
V náznaku možno niečo také:
$celkovy_cas = 2015-07-11T14:00:00+02:00;
function prepocet_na_unix_cas($celkovy_cas) {
  if(strpos($celkovy_cas, "+")) {
    list($cas, $zona_casu) = explode("+", $celkovy_cas);
  }
  else {
    $zona_casu = 0;
  }    
  //prepočet dátumu do unixového formátu
  //prepočet času do unixového formátu (za "T")
  //prepočet $zona_casu do unixového formátu*
  //súčet prepočtov
  return $sucet;
}
Možno existuje prirodzená funkcia, ktorá to dokáže. Prepočty je možné robiť manuálne* alebo funkciou. Tiež neviem, či nejaká existuje.

*
list($hodiny, $minuty) = explode(":", $zona_casu);
$prepocet = $hodiny*3600;

EDIT:
1. Funkcia mktime() prepočítava medzi formátmi.
2. Bolo by lepšie rozdeľovať čas až vo funkcii a pridať ošetrenie zóny bez posunu času (funkcia upravená).
Milkys
Profil
Tomáš123:
Děkuji za ochotu. Včera večer jsem procházel manuál a zatím jsem nic nenašel.

Zajímá mě právě zda existuje ta "přirozená" funkce.
Byl jsem pomalejší :) než přišlo "EDIT". Vyzkouším a dám vědět pro ostatní.


Tomáš123:
Takto to počítá přesně:
$celkovy_cas = "2015-07-11T14:00:00+02:00";
function timezone_plus_unix_cas($celkovy_cas) {
  if(strpos($celkovy_cas, "+")) {
    list($cas, $zona_casu) = explode("+", $celkovy_cas);
    list($hodiny, $minuty) = explode(":", $zona_casu);
    $prepocet = $hodiny*3600;
  }
  else {
    $zona_casu = 0;
  } 
  $unix = strtotime($celkovy_cas) + $prepocet;   
  return $unix;
}

Dá se to použít.

Jde mi o jednoduší řešení, aby tam nemuselo být např. 2× explode() ap.
Tzn.
$unix = prirozena_php_fce($celkovy_cas);
V proměnné $unix by byl unix čas včetně přičtené hodnoty timezone.
Tomáš123
Profil
Milkys:
Prirodzená PHP funkcia na prepočet na unix je mktime().
bestik_63
Profil
ahoj, třída datetime by ti nepomohla?
Jan Tvrdík
Profil
Milkys:
Já ten problém asi vůbec nechápu, strtotime bere časovou zónu normálně v potaz, např.

echo strtotime('2014-11-22T21:27:02+00:00'), "\n";
echo strtotime('2014-11-22T21:27:02+01:00'), "\n";
echo strtotime('2014-11-22T21:27:02+02:00'), "\n";

vypíše tři různá čísla.
Alphard
Profil
Tomáš123:
Prirodzená PHP funkcia na prepočet na unix je mktime().
Co když je čas mimo rozsah unix timestampu? Unix timestamp není ideální metoda pro reprezentaci data.

bestik_63:
ahoj, třída datetime by ti nepomohla?
Měla by...
$t1 = new \Datetime('2014-11-22T21:32:02+01:00');
$t2 = new \Datetime('2014-11-22T21:27:02+01:00');
var_dump($t1 < $t2); // false

$t1 = new \Datetime('2014-11-22T21:32:02+02:00');
$t2 = new \Datetime('2014-11-22T21:27:02+01:00');
var_dump($t1 < $t2); // true

A ještě poznámky k původnímu dotazu.

Milkys:
strtotime() mi to převede na řetězec, ale už nepřičte + 1 hodinu resp. + 2hodiny.
Možná si nerozumíme, ale mně se zdá, že to dělá, až to, že se má odečítat. (A navíc vrací číslo, ne řetězec.)
date_default_timezone_set('Europe/Prague');
echo strtotime('2014-11-22T21:27:02+01:00'), PHP_EOL; // 1416688022
echo strtotime('2014-11-22T21:27:02+02:00'), PHP_EOL; // 1416684422
echo strtotime('2014-11-22T21:27:02+03:00'), PHP_EOL; // 1416680822
echo strtotime('2014-11-22T21:27:02+04:00'), PHP_EOL; // 1416677222
O chování strtotime jsem se nikdy moc nezajímal, snad se nemýlím, ale ta vaše funkce jen kompenzuje tyto změny
date_default_timezone_set('Europe/Prague');
echo timezone_plus_unix_cas('2014-11-22T21:27:02+01:00'), PHP_EOL; // 1416691622
echo timezone_plus_unix_cas('2014-11-22T21:27:02+02:00'), PHP_EOL; // 1416691622
echo timezone_plus_unix_cas('2014-11-22T21:27:02+03:00'), PHP_EOL; // 1416691622
echo timezone_plus_unix_cas('2014-11-22T21:27:02+04:00'), PHP_EOL; // 1416691622

A ještě jedna drobnost, máte tam chybu, na 9. řádku zřejmě měla být proměnná $prepocet.

Jan Tvrdík [#6]:
Už se mi ten můj příspěvek nechtěl mazat :-)

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:

0