Autor Zpráva
Pepan223ER
Profil *
Ahoj, mám problém, který potřebuji vyřešit. V databázi mám uložený datumy v UNIX formátu (2011-10-17 13:56:25) převádím je na aktuální časové pásmo a převádím na jiný typ data podle nastavení (není důležité). Toto mi funguje. Jen potřebuji zjistit, zda se jedná o datup, kde je letní čas, pokud ano, připočíst 1 hodinu (jde mi pouze o zjištění, zda daný datum je v intervalu, kdy se mění čas)

Napadlo mně, že bych si mohl najít poslední neděli v březnu a říjnu a podle toho bych připočetl hodinu. Nevím však jak toto zjistit.
Nenapadá Vás nějaká možnost?

Děkuji Pepan223ER
Str4wberry
Profil
Je potřeba upravovat data za několik mnoho let, že je vyhledání si intervalů v kalendáři takový problém?
Pepan223ER
Profil *
Str4wberry:
vůbec ale netuším jak :-/
Str4wberry
Profil
Co netušíš? Jak se podívat do kalendáře a vypsat si dané intervaly, nebo jak sestrojit potřebný SQL dotaz?
Pepan223ER
Profil *
když mám datum, jak zjistit jestli je v intervalu, kde se musí připočítat jedna hodina (letní čas)
Marek88
Profil
Pseudokód pro rok 2011:
if(datum > 27.3.2011 1:59:59 AND datum < 30.10.2011 2:00:00){
    // koncový čas je možná 3:00:00 (záleží, co s tím chceš dělat)
    datum = datum + 1 hodina;
}
// nebo pro databázi:
UPDATE tabulka SET datum = datum + 1 hodina WHERE datum > 27.3.2011 1:59:59 AND datum < 30.10.2011 2:00:00
Pepan223ER
Profil *
Marek88:
nepotřebuji pro tento rok, potřebuju pro n let dopředu
okolojdouci
Profil *
Pepan223ER:
A máš problém si ten řádek zkopírovat 20x pod sebe, rok upravit a dotazy provést?
Marek88
Profil
[#7] Pepan223ER
Přečti si [#2] od Str4wberryho. Měl jsi mu na to pořádně odpovědět...

Kolik let? Například 20 let je podle mě pořád ještě rychlejší udělat kouknutím do kalendáře, než vymýšlet extra script, který to zjistí sám...
Kajman_
Profil *
Pepan223ER:
Nemůžete použít nějakou funkci, která to převádí včetně přihlédnutí k letnímu času? Např. v mysql můžete jednoduše převést čas do chtěné časové zóny pomocí

select convert_tz('2011-10-17 13:56:25','GMT','CET') from dual;
select convert_tz('2011-11-17 13:56:25','GMT','CET') from dual;
Pepan223R
Profil *
Ja ale potrebuju script v PHP a universalni protoze datum bude moct bejt jakykoliv
Kajman_
Profil *
Tak si to převeďte s použitím php.
<?php

$tz_from = new DateTimeZone('GMT');
$tz_to = new DateTimeZone('Europe/Prague');

$date =  new DateTime('2011-10-17 13:56:25', $tz_from);
$date->setTimezone($tz_to);
echo $date->format('Y-m-d H:i:s'); 
//echo " offset=",$date->getOffset();

echo "<br>";

$date =  new DateTime('2011-11-17 13:56:25', $tz_from);   
$date->setTimezone($tz_to);
echo $date->format('Y-m-d H:i:s'); 
//echo " offset=",$date->getOffset();

?>
Pepan223ER
Profil *
toto už je lepší řešení - děkuji, určitě ho někde použiji. Stále ale neřeší můj problém já nemám problém s převodem času, potřebuji pouze zjistit, zda dané datum je v intervalu letního data - tedy zda je datum mezi poslední nedělí v v březnu a poslední nedělí v říjnu
Kajman_
Profil *
A chápete, že když to chcete univerzálně, tak neplatí, že všechny časové zóny používají letní čas a u některých je to právě naopak (mají tam léto, když je prosinec)? Proto je lepší použít fungující řešení, než přičítat hodiny ručně.

Jinak v tom minulém příkladě je zakomentováno vypisování časových posunů vůči GMT.
Pepan223ER
Profil *
letní čas se mění všude ve stejný čas se stejným posunem! Pro státy, kde letní čas není bude možnost vypnout letní čas
Joker
Profil
Pepan223ER:
zda dané datum je v intervalu letního data
Nestačilo by náhodou:
$letni = date("I");
if($letni == 1) echo "Letní čas!";
else echo "Mimo letní čas!";

zda je datum mezi poslední nedělí v v březnu a poslední nedělí v říjnu
Ani to by ale nebylo těžké zjistit:
S výjimkou 25.-30. března a října je to jasné.
Ve sporné datum: Jestliže pořadí dne v týdnu je menší než datum - 24, je to už po změně času.
(Poznámka, připomínám, že pořadí dne v týdnu v PHP je 0 neděle, 1 pondělí atd.)

letní čas se mění všude ve stejný čas se stejným posunem!
Není pravda, například v USA se mění, nebo minimálně měnil, o týden jinak (tzn. mezi ČR a daným místem v USA byl 2 týdny v roce jiný časový posun než zbytek roku)

Dodatek k tomu algoritmu:
V případě, že den v týdnu je zrovna neděle, je to akorát poslední neděle a pak by bylo nutné ještě zkoumat kolik je hodin.
To platí i pro 31. března a října.
Pepan223ER
Profil *
děkuji za vysvětlení - požiji kóde s fcí date('I'), zdá se být nejlepší :-)
Kajman_
Profil *
Pepan223ER:
letní čas se mění všude ve stejný čas se stejným posunem!

Ale to je nesmysl. Viz. přehled letních časů tento rok.
margin
Profil *
Pepan223ER:
letní čas se mění všude ve stejný čas se stejným posunem!
I kdyby k tomu existovala vůle, tak je to nemožné, protože na jižní polokouli je "z technických důvodů" léto jindy, než na polokouli severní.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0