RE: c_ letní zimní čas

Miroslav Draxal evik na volny.cz
Středa Srpen 14 09:13:41 CEST 2013


Ha, já to říkal, že nějaká finta bude…

 

 

From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Kručinský Ladislav
Sent: Wednesday, August 14, 2013 12:47 AM
To: HW-news
Subject: RE: c_ letní zimní čas

 

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

Zdravím
Kručinský

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

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

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

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

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

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

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

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

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


Aleš


Dobrý den,
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í 


JM> -----Original Message-----
JM> From: hw-list-bounces na list.hw.cz
JM> [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jirka MWW
JM> Sent: Tuesday, August 13, 2013 9:36 PM
JM> To: HW-news
JM> Subject: Re: c_ letní zimní čas

JM> Nebyla by lepší ( a kratší ) tabulka na příštích 100 let dopředu ?


JM> Dne 13. srpna 2013 21:31 Miroslav Draxal <evik na volny.cz> napsal(a):

>> To je v poznámkách ty pravidla. Já jenom že pro všechny možnosti je to
>> nějak hodně IF… Jestli neexistuje nějaká finta****
>>
>> ** **
>>
>> ** **
>>
>> //na letní čas poslední neděli v březnu +1 hod ve 2hod na 3hod****
>>
>> // na zimní čas poslední neděli v říjnu -1 hod ve 3hod na 2hod****
>>
>> ** **
>>
>> ** **
>>
>> *From:* hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz]
>> *On Behalf Of *Vláďa Anděl
>> *Sent:* Tuesday, August 13, 2013 11:47 AM
>> *To:* HW-news
>> *Subject:* Re: c_ letní zimní čas****
>>
>> ** **
>>
>> Pokud vyhodnocuju signál DCF, tam ten příznak je. Počítač přechází na
>> letní/zimní čas nějak podle kalendáře a dělá to správně.  Teď mi žena
>> říkala že základem je nějaké datum a to se upravuje tak, aby to vyšlo
>> ze sobody na neděli.
>> Anděl
>>
>> Dne 13.8.2013 10:32, Miroslav Draxal napsal(a):****
>>
>> Dobrý den,****
>>
>> ** **
>>
>> Neznáte někdo nějakou fintu jak zjistit, v dané datum a čas jaký je
>> čas?****

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



__________ Informace od ESET NOD32 Antivirus, verze databaze 8685 (20130813) __________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz



__________ Informace od ESET NOD32 Antivirus, verze databaze 8685 (20130813) __________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130814/820337c1/attachment.htm>


Další informace o konferenci Hw-list