tags:

views:

68

answers:

2

I am trying to get Saturday's date of the week in Linux C. Using the function time and localtime, I got today's date and time details. How to proceed further to get Saturday's date?


#include <time.h> 
#include <stdio.h> 
#include <string.h> 
int main() 
{ 
char date[20]; 
struct tm *curr_tm = NULL; 
time_t curr_time; 
curr_time = time(NULL); 
curr_tm = localtime(&curr_time); 
curr_tm->tm_wday = 6; 
//Refers to saturday. 
printf("new date %d\t%d\t%d\n", curr_tm->tm_mday, curr_tm->tm_mon, curr_tm->tm_year+1900); 
return 1; 
}

How should I proceed with this?

+1  A: 
struct tm orig;
// ...
// struct tm correctly set with everything within range.
orig.tm_mday += 6 - orig.tm_wday;
mktime(&orig);

tm_mday is the number of days since Sunday. Thus, 6 minus that is the number of days until Saturday (if today is Saturday it does nothing). This puts the structure out of range, which mktime fixes.

EDIT:

curr_time->tm_mday += 6 - curr_time->tm_wday;
mktime(curr_time);
Matthew Flaschen
#include <time.h>#include <stdio.h>#include <string.h>int main(){ char date[20]; struct tm *curr_tm = NULL; time_t curr_time; curr_time = time(NULL); curr_tm = localtime( curr_tm->tm_wday = 6; //Refers to saturday. printf("new date %d\t%d\t%d\n", curr_tm->tm_mday, curr_tm->tm_mon, curr_tm->tm_year+1900); return 1;}how to proceed with this.
Raja
A: 

Based on your code, the following will get you the next Saturday (today if it's Saturday).

#include <time.h>
#include <stdio.h>
#include <string.h>
int main() {
    char date[20];
    struct tm *curr_tm = NULL;
    time_t curr_time;
    curr_time = time(NULL);
    curr_tm = localtime(&curr_time);

    // Add the difference between todays day of week and Saturday, then re-make.
    curr_tm->tm_mday += 6 - curr_tm->tm_wday;
    mktime (curr_tm);

    printf("new date %d\t%d\t%d\n",
        curr_tm->tm_mday, curr_tm->tm_mon+1, curr_tm->tm_year+1900);
    return 1;
}

You can replace the curr_tm->tm_mday += 6 - curr_tm->tm_wday; line with:

curr_tm->tm_mday += (curr_tm->tm_wday == 6) ? 7 : 6 - curr_tm->tm_wday;

to get next Saturday even if today is Saturday.

paxdiablo