title image


Smiley Sorry für die Verspätung, hab mal etwas gebastelt
Hallo Ines,



entschuldige bitte, dass ich mich erst jetzt melde - Hatte einfach keine Zeit.

Ich revidiere meine Meinung am 01.01.0000 beginnen zu wollen - Sinnvoller ist der 01.03.0000 (obwohl's das Datum so im gregorianischen Kalender eigentlich auch nicht gibt). Die Funktionen arbeiten (algorithmisch) korrekt ab dem 01.03.0000. Wie bereits im vorhergehenden Beispiel sind alle Werte 0 basiert (d.h. z.B. Januar = 0).

Immer dran denken, der Gregorianische gilt erst ab 1582 und haut ab 5000-Irgendwas daneben.



Viel Spass damit,



Uli



typedef long date_t;



date_t foo(int y, int m, int d)

{

static int const moff[12] =

/* Month: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec */

{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

date_t ret;



/* calculate plain offset */

ret = (date_t)y*365 + moff[m] + d;



/* add leap days */

if( m<2 ) y-=1;

ret += (date_t)y/4 - y/100 + y/400 - 59;



return ret;

}



void bar(int *py, int *pm, int *pd, register date_t d)

{

int x, y, m;

static char const tt[5] = { 0, 1, 2, 3, 3};

static int const moff[13]=

/* Month: Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, Jan, Feb - */

{ 0, 31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337, 366 };



x=d/146097; d-=x*146097; y =x*400; /* 400 years */

x=tt[d/36524]; d-=x*36524; y+=x*100; /* 100 years */

x=d/1461; d-=x*1461; y+=x*4; /* 4 years */

x=tt[d/365]; d-=x*365; y+=x; /* 1 year */



if(moff[m=d/32+1] > d) m-=1; /* Month */

d-=moff[m];

if(m>9) { m-=10; y+=1;} else m+=2;



*py = y; *pm = m; *pd = d; /* Deliver */

}



PS: Ein ganz ganz klein wenig könnte man das noch tunen. Für date_t kannste übrigens int oder long oder sonstwas verwenden (unsigned oder signed - egal) - Hauptsache es sind Integers und der Wertebereich passt.

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: