nyari/Teli idoszamitas

 ( kukukk | 2007. augusztus 10., péntek - 10:26 )

Udv!

Egy kis segitsegre lenne szuksegem. Arrol lenne szo, hogy hogyan lehet programilag megallapitani egy adott datumrol hogy az nyari vagy teli idoszamitasba esik? Egeszen pontosan az kellene hogy meg tudjam hatarozni, hogy Marcius utolso vasarnapja 01:00 es Oktober utolso vasarnapja 02:00 kozott van-e. A gondom az utolso vasarnap kinyeresevel van.

Tudnatok ebben segiteni egy kicsit? Faradt vagyok hogy ertelmesen tudjak gondolkodni :}} (Meg nem voltam szabadsagon)

PLC-ben lesz implementalva, ugyhogy a nyelvspecifikus fuggvenyek nem jok. Csak es kizarolag if segitsegevel ha lehet.

Elore is koszonom,
Balogh Szabolcs

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Van egy ilyen algoritmus vagyis fuggveny, hogy:

double get_julian_date(int ye,int mo,int da)
{
 int    lya;
 double jd;

 if ( mo<=2 )   ye--,mo+=12;

 if ( ye>1582 || ( ye==1582 && mo>10 ) || ( ye==1582 && mo==10 && da>14 ) )
        lya=(2)-(ye/100)+(ye/400);
 else
        lya=0;

 jd=    (double)lya+
        1720994.5+
        (double)(((long)ye*1461L)/4L)+
        (double)((153*(mo+1))/5)+
        (double)da;

 return(jd);
}

ez visszaadja az adott e'v (ye), honap (mo) es nap (da)-ra vonatkozo julian-datumot (ez olyasmi mint a timestamp, csak napban, es idoszamitas elott 4317 ota szamoljak, manapsag olyan 2453xxx korul ja'r).

Ennek a 7-es marade'ka visszaadja a he't napja't:

function get_dayofweek($ye,$mo,$da)
{
 $ye=(integer)$ye;$mo=(integer)$mo;
 if ( $mo<=2 )  {       $mo+=12;$ye-=1;         }
 $r=(integer)(5*$ye/4)+(integer)(13*($mo+1)/5)+(integer)$da-(integer)($ye/100)+(integer)($ye/400)+6;
 return($r%7);
}

(bocs, ez csak php-ben van meg...:])

innen ma'r relative egyszeru": kiszamolod hogy marc 31 a he't milyen napja'ra esik, es addig lepteted vissza, amig vasarnapot nem kapsz. Akkor kezdodott a nyari idoszamitas. Es forditva, okt 31-gyel detto ugyanez, akkor volt ve'ge.

A.

Koszonom a valaszt. Igy elso ranezesre kicsit komplikaltnak tunik szegeny automatanak (nagyjabol assambler szeru a programozasi nyelve), de kierul majd miutan alaposan atneztem es megertettem.

Szerintem asm-ben sem annyira veszes, egy if van benne es par maradekos es/vagy ege'szoszta's. Inkabb ezutobbi lehet a szuk keresztmetszet, bar mindig vegtelenszer jobb a helyzet, mintha to"rtsza'mokkal kellene operalni...

Gondolkodom valami olyasmin, hogy a (31 - aktualis nap) valamint a (6 - aktualis dayofweek) kombinaciojabol nem-e lehet megkapni valahogy hogy marcius utolso vasarnapja utan, illetve elotte oktober utolso vasarnapja elott vagyok-e

Ram ferne mar egy szabadsag :}}

Hm, mi is a pontos definicio? Tehat, ha marc 31 az szombat, akkor mikor kezdodik a nyisz (24/25-e'n ejjel vagy 31/apr 1 e'jjel), illetve ha marc 31 az vasarnap, akkor mikor mezdodik (23/24-en ejjel vagy 30/31-en ejjel). A tobbi eset nyilvanvalo...

A.

Lehet, hogy hülyeség, de csak brainstorming szinten: nem lenne értelme tárolni ezeket? Mennyi időre tervezed az automatát? Legyen mondjuk 10 év. Az 20 byte.
2007 március utolsó vasárnap, 2007 október utolsó vasárnap, 2008 március utolsó vasárnap, 2008 október utolsó vasárnap, stb.
Vagyis lenne egy ilyen tömböd, hogy:
25,28,30,26,stb.
És csak ebből kéne kiválasztani az (év-2007)*2., ill. az (év-2007)*2+1. elemet.
--
Debian - The "What?!" starts not!

Nem biztos, hogy hueseg. Vegul is annyi helyem van hogy eltaroljak akar tobbet is. Ha nem talalom meg a kapcsolatot a hatralevo napok szama es az aktualis nap a hetbol kozott, akkor lehet az lesz belole. De erzem, hogy nagyon ott vagyok a koztuk levo kapcsolat kornyeken, de csak nem akarja felfedni magat :}}}

Gondolkodtam a dolgon, és rájöttem, hogy ez jó megoldás. 16 év adatait kell tárolnod, 32 byte-on, a 17. évtől kezdve ismétlődik.

--
Debian - The "What?!" starts not!

Hellyel-kozzel, inkabb 28 e'v adatait kell tarolni, ha jol tevedek (legalabbis 7 es 4 legkisebb kozos tobbszorose a 28), 28 e'ves periodusban ismetlodik. Es csak 2100-ig... bar akkor mar valoszinuleg nem lesz annyira aktualis a problema...

Nem, nézz utána naptárban nyugodtan! A magyarázat pedig valami olyasmi, hogy ha nem lenne szökőév, 7 évente esnének a dátumok ugyanarra a napra. De 7 évben vagy 1, vagy 2 szökőév van, vagyis 8 ill. 9 évre jön ki. És 8+9=17.

--
Debian - The "What?!" starts not!