Avatar billede kierch Nybegynder
13. januar 2005 - 11:03 Der er 7 kommentarer

uge nummer med strftime

Hvorfor får jeg forket uge nummer i følgende kode der retuneres uge 1 og det skullle være uge 53. Ifølge ISO 8601. Findes der en anden løsning i Visual C 6.0 ???

// Get Current Week and year
char tmpbuf[128];
time_t Fltime;
struct tm *today;
_tzset();
         

/* Use time structure to build a customized time string. */
time(&Fltime); // Get Current time
today = localtime( &Fltime );
int Week;

strftime(tmpbuf,128,"%W",today);    //Get the week number
Week = atoi(tmpbuf)+1;  //week number starts at week 0
Avatar billede jpk Nybegynder
13. januar 2005 - 11:26 #1
Skulle vi være i uge 53 ifl. ISO 8601..?
Avatar billede kierch Nybegynder
13. januar 2005 - 11:29 #2
Sorry jeg mener hvis jeg sætter datoen til den 2 januar 2005
Avatar billede kierch Nybegynder
13. januar 2005 - 11:44 #3
Har selv fundet en løsning
Avatar billede jpk Nybegynder
13. januar 2005 - 11:51 #4
Så post venligst koden her, så andre der får samme problem i fremtiden, ikke finder dit eget svar forgæves.
Avatar billede kierch Nybegynder
13. januar 2005 - 11:53 #5
Skal lige hvave den renset lidt inden
Avatar billede kierch Nybegynder
13. januar 2005 - 13:45 #6
/*ISO 8601 definerer uge numrene som følgende:

Ugen starter med mandag
Uge 1 er den uge der indeholder den første torsdag
Årets sidste uge er den uge der indeholder årets sidste torsdag
Vores funktion kan derfor siges at skulle implementerer følgende:
Ugen for en hvilken som helst dag, er den samme, som ugen for den nærmeste torsdag.
o For at finde den nærmeste torsdag, kan man gøre følgende: Dato += 4 dage - Dag i ugen (hvor mandag=1, tirsdag=2....)
Den første torsdag i et kalenderår, befinder sig i uge 01
Uge nummeret for den nærmeste torsdag, er: Torsdagens dag-i-kalenderåret divideret med 7 dage - rundet ned plus 1.
*/

// Get Current Week and year
char tmpbuf[128];
time_t Fltime, now,result;
struct tm *today;
struct tm when;
       

int IsoDayOfWeek, IDayOfYear, WeekOfYear,iTemp;
time(&now); // Get Current time
today = gmtime( &now );

strftime(tmpbuf,128,"%w",today);    //Weekday as decimal number (0 – 6; Sunday is 0)
IsoDayOfWeek = (atoi(tmpbuf)==0)? 7: (atoi(tmpbuf)); //If sunday change to number to 7
time(&now); // Get Current time
when = *gmtime( &now );
when.tm_mday = (when.tm_mday + 4)-IsoDayOfWeek; // The nearest thursday 
result = mktime( &when ) ; //converts the supplied time structure  where day have changed to thursday
       
IDayOfYear = when.tm_yday; //Day of year as decimal number (001 – 366)
WeekOfYear = floor(IDayOfYear/7)+1;
Avatar billede arne_v Ekspert
13. januar 2005 - 22:52 #7
Og hvis nogen vil se et komplet program:

#include <stdio.h>
#include <time.h>

time_t cvt(int y, int m, int d)
{
    struct tm ts;
    ts.tm_year = y - 1900;
    ts.tm_mon = m - 1;
    ts.tm_mday = d;
    ts.tm_hour = 12;
    ts.tm_min = 0;
    ts.tm_sec = 0;
    return mktime(&ts);
}

/* din algoritme */
int week1(time_t t)
{
    time_t t2;
    struct tm *ts;
    ts = localtime(&t);
    ts->tm_mday = ts->tm_mday + 4 - (ts->tm_wday > 0 ? ts->tm_wday : 7);
    t2 = mktime(ts);
    ts = localtime(&t2);
    return ts->tm_yday/7 + 1;
}

/* alternativ */
int week2(time_t t)
{
    int a,y,m,JD,d4,L,d1;
    struct tm *ts;
    ts = localtime(&t);
    a = (13 - ts->tm_mon) / 12;
    y = ts->tm_year + 6700 - a;
    m = ts->tm_mon + 12*a - 2;
    JD = ts->tm_mday + (153 * m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;
    d4 = (((JD + 31741 - JD % 7) % 146097) % 36524) % 1461;
    L = d4 / 1460;
    d1 = ((d4 - L) % 365) + L;
    return d1/7 + 1;
}

void test(time_t t)
{
    char buf[100];
    strftime(buf,sizeof(buf),"%a %d/%m/%Y : %W %U",localtime(&t));
    printf("%s %02d %02d\n",buf,week1(t),week2(t));
}

int main()
{
    int d;
    for(d=20;d<=31;d++) test(cvt(2004,12,d));
    for(d=1;d<=12;d++) test(cvt(2005,1,d));
    return 0;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester