Re: c_ letní zimní čas

Aleš Novák alesh.novak na email.cz
Středa Srpen 14 18:20:15 CEST 2013


No vida, ta brožurka mě vůbec nenapadla. A to ji mám doma taky :-)

Dobrý den,
14. srpna 2013, 0:46:34, napsal jste:

KL> Ten vzorec je v knize "Programátorské poklesky" - nevzpomenu si
KL> kdo ji napsal ale je to brožurka která se strašně dobře čte. Mám
KL> ji doma, teď jsem na cestách. Pokud bude zájem pošlu scan té stránky.

KL> Zdravím
KL> Kručinský

KL> -----Original Message-----
KL> From: hw-list-bounces na list.hw.cz
KL> [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Aleš Novák
KL> Sent: Wednesday, August 14, 2013 12:24 AM
KL> To: HW-news
KL> Subject: Re: c_ letní zimní čas

KL> Kdysi jsem narazil na výpočet velikonočního pondělí pomocí
KL> jednoho vzorce a žasnul jsem nad jeho jednoduchostí (relativně).
KL> Když si člověk uvědomí jak jsou velikonoce definované, tak je ten vzorec prostě geniální.

KL> A s výpočtem dne, kdy se mění SEČ na SELČ a opačně je to podobné.
KL> Jeden z výpočtů je např. zde:
KL> http://www.webexhibits.org/daylightsaving/i.html
KL> nebo http://delphiforfun.org/Programs/Math_Topics/DSTCalc.htm

KL> Březnový den = (31 - (5 * yyyy / 4 + 4) mod 7)   v 1:00 UTC
KL> Říjnový den = (31 - (5 * yyyy / 4 + 1) mod 7)   v 1:00 UTC

KL> Údajně to funguje do roku 2099 (nebo než evropští soudruzi neurčí jinak :-))

KL> Výpočty probíhají v celočíselné aritmetice, rok je v plném
KL> čtyřmístném tvaru. Mezi těmito dvěma časy je posun vzhledem k UTC
KL> 2 hodiny (SELČ), v ostatním čase je posun 1 hodina (SEČ). Je nutné
KL> vycházet z UTC a ne z místního času. Pokud by byl právě den změny
KL> v říjnu 2:30 ráno místního času, tak bez informace jestli je to
KL> SEČ nebo SELČ těžko zjistíme jestli je to SEČ nebo SELČ, jelikož
KL> tento místní čas nastane v 0:30 UTC stejně tak jako o hodinu později v 1:30 UTC.

KL> Implementoval jsem tento výpočet do Simatiku ve kterém běží
KL> trvale UTC a já potřeboval spouštět určité funkce na základě
KL> místního času a zdá se, že to funguje.

KL> Pokud by snad někoho zajímal ten výpočet v Simatiku tak klíčová
KL> část vypadá takhle (v jazyku SCL systému PCS7; Year, Month, Day,
KL> Hour je UTC z PLC; OffsetT je výsledek):

KL> OffsetT := TIME#1h;
KL> IF (Month = 3) THEN
KL>   DayChng := 31 - (5 * (2000 + Year) / 4 + 4) MOD 7; // until 2099
KL>   IF (((Day = DayChng) AND (Hour >= 1)) OR (Day > DayChng)) THEN
KL>     OffsetT := TIME#2h;
KL>   END_IF;
ELSIF ((Month >> 3) AND (Month < 10)) THEN
KL>   OffsetT := TIME#2h;
KL> ELSIF (Month = 10) THEN
KL>   DayChng := 31 - (5 * (2000 + Year) / 4 + 1) MOD 7; // until 2099
KL>   IF ((Day < DayChng) OR ((Day = DayChng) AND (Hour < 1))) THEN
KL>     OffsetT := TIME#2h;
KL>   END_IF;
KL> END_IF;


KL> Aleš


KL> Dobrý den,
KL> 13. srpna 2013, 22:00:03, napsal jste:

JM>> Ale to by ta tabulka vyplivla taky. Stačilo by ji projíždět a až by 
JM>> program narazil na datum vyšší, než je aktuální, podle toho, zda by 
JM>> aktuální index byl sudý nebo lichý  by řekl letní/zimní.

JM>> V Pascalu by to byl nějaký cyklus repeat - until , který by 
JM>> zvětšoval index v tabulce až do okamžiku , kdy by aktuální  datum bylo vyšší než v tabulce podle indexu.
JM>> Pak byste se jen podíval na aktuální index a podle lichý/sudý byste řekl letní/zimní.
JM>> Nebo má moje teorie nějakou mezeru ?


JM>> repeat


JM>> Dne 13. srpna 2013 21:44 Miroslav Draxal <evik na volny.cz> napsal(a):
JM>> Možná ano, rád bych to ale dynamicky počítal. Protože když tomu
JM>> zadám jakýkoli datum, tak to na mě vyplivne letní/zimní. Kdybych
JM>> měl tabulku, také tam bude hodně if. I když zřejmě méně. Ony ty IF
JM>> nevadí. Prostě fintička zdali není  




Další informace o konferenci Hw-list