C Program to find day of week given date

后端 未结 14 1312
梦谈多话
梦谈多话 2020-11-29 05:14

Is there a way to find out day of the week given date in just one line of C code?

For example

Given 19-05-2011(dd-mm-yyyy) gives me Thursday

相关标签:
14条回答
  • 2020-11-29 05:32

    This one works: I took January 2006 as a reference. (It is a Sunday)

    int isLeapYear(int year) {
    
         if(((year%4==0)&&(year%100!=0))||((year%400==0))) 
            return 1;
         else 
            return 0;
    
     }
    
    int isDateValid(int dd,int mm,int yyyy) {
    
        int isValid=-1; 
        if(mm<0||mm>12) {
            isValid=-1;
        }
        else {
    
        if((mm==1)||(mm==3)||(mm==5)||(mm==7)||(mm==8)||(mm==10)||(mm==12)) {
               if((dd>0)&&(dd<=31))
                 isValid=1;
        }  else if((mm==4)||(mm==6)||(mm==9)||(mm==11)) {
             if((dd>0)&&(dd<=30))
                 isValid=1;
        }  else {
                 if(isLeapYear(yyyy)){
                     if((dd>0)&&dd<30)
                         isValid=1;
                 } else {
                       if((dd>0)&&dd<29)
                         isValid=1;
                 }
            }  
    
    
    
        }
                   return isValid;
    
    
    
     }
    
    
    int calculateDayOfWeek(int dd,int mm,int yyyy)  {
    
                    if(isDateValid(dd,mm,yyyy)==-1) {
                        return -1;
                    }
    
                     int days=0;
                      int i; 
    
                       for(i=yyyy-1;i>=2006;i--) {
                             days+=(365+isLeapYear(i));
    
                         }
                         printf("days after years is %d\n",days);
    
                       for(i=mm-1;i>0;i--) {
    
                           if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)) {
    
                               days+=31;
                           }
                           else if((i==4)||(i==6)||(i==9)||(i==11)) {
                               days+=30;
                           } else {
    
                               days+= (28+isLeapYear(i));
    
                           }
    
    
                       }
                           printf("days after months is %d\n",days);
    
                       days+=dd;
    
                       printf("days after days is %d\n",days);
    
                       return ((days-1)%7);                
    
    
                  }
    
    0 讨论(0)
  • 2020-11-29 05:33
    #include<stdio.h>
    int main(void) {
    int n,y;
    int ly=0;
    int mon;
    printf("enter the date\n");
    scanf("%d",&n);
    printf("enter the month in integer\n");
    scanf("%d",&mon);
    mon=mon-1;
    printf("enter year\n");
    scanf("%d",&y);
    int dayT;
    dayT=n%7;
    if((y%4==0&&y%100!=0)|(y%4==0&&y%100==0&&y%400==0))
    {
        ly=y;
        printf("the given year is a leap year\n");
    }
    char a[12]={6,2,2,5,0,3,5,1,4,6,2,4};
    if(ly!=0)
    {
        a[0]=5;
        a[1]=1;
    }
    int m,p;
    m=a[mon];
    int i,j=0,t=1;
    for(i=1600;i<=3000;i++)
    {
     i=i+99;
        if(i<y)
        {
    
            if(t==1)
            {
            p=5;t++;
            }
            else if(t==2)
            {
                p=3;
                t++;
            }
            else if(t==3)
            {
                p=1;
                t++;
            }
            else
            {
                p=0;
                t=1;
            }
    
    }}
    int q,r,s;
    q=y%100;
    r=q%7;
    s=q/4;
    int yTerm;
    yTerm=p+r+s;
    int w=dayT+m+yTerm;
    w=w%7;
    if(w==0)
    printf("SUNDAY");
    else if(w==1)
    printf("MONDAY");
    else if(w==2)
    printf("TUESDAY");
    else if(w==3)
    printf("WEDNESDAY");
    else if(w==4)
    printf("THURSDAY");
    else if(w==5)
    printf("FRIDAY");
    else
    printf("SATURDAY");
    return 0;
    

    }

    0 讨论(0)
  • 2020-11-29 05:34

    I think you can find that in glib: http://developer.gnome.org/glib/unstable/glib-Date-and-Time-Functions.html#g-date-get-day

    Regards

    0 讨论(0)
  • 2020-11-29 05:35
    #include<stdio.h>
    static char day_tab[2][13] = {
            {0,31,28,31,30,31,30,31,31,30,31,30,31},
            {0,31,29,31,30,31,30,31,31,30,31,30,31}
            };
    int main()
    {
         int year,month;
         scanf("%d%d%d",&year,&month,&day);
         printf("%d\n",day_of_year(year,month,day));
         return 0;
    }
    int day_of_year(int year ,int month,int day)
    {
            int i,leap;
            leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
            if(month < 1 || month >12)
            return -1;
            if (day <1 || day > day_tab[leap][month])
            return -1;
            for(i= 1;i<month ; i++)
            {
                    day += day_tab[leap][year];
            }
            return day;
    }
    
    0 讨论(0)
  • 2020-11-29 05:37

    This is my implementation. It's very short and includes error checking. If you want dates before 01-01-1900, you could easily change the anchor to the starting date of the Gregorian calendar.

    #include <stdio.h>
    
    int main(int argv, char** arv) {
        int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        char* day[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};   
        int d, m, y, i; 
    
        printf("Fill in a date after 01-01-1900 as dd-mm-yyyy: ");
        scanf("%d-%d-%d",  &d, &m, &y);
    
        // correction for leap year
        if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0))
            month[1] = 29;
    
        if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
            printf("This is an invalid date.\n");
            return 1;
        }
    
        for (i = 1900; i < y; i++)
            if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0))
                d += 366;
            else
                d += 365;
    
        for (i = 0; i < m - 1; i++) 
            d += month[i];
    
        printf("This is a %s.\n", day[d % 7]);
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-29 05:37

    For Day of Week, years 2000 - 2099.

    uint8_t rtc_DayOfWeek(uint8_t year, uint8_t month, uint8_t day)
    {
        //static const uint8_t month_offset_table[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5}; // Typical table.
    
        // Added 1 to Jan, Feb. Subtracted 1 from each instead of adding 6 in calc below.
    
        static const uint8_t month_offset_table[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    
        // Year is 0 - 99, representing years 2000 - 2099
    
        // Month starts at 0.
    
        // Day starts at 1.
    
        // Subtract 1 in calc for Jan, Feb, only in leap years.
        // Subtracting 1 from year has the effect of subtracting 2 in leap years, subtracting 1 otherwise.
        // Adding 1 for Jan, Feb in Month Table so calc ends up subtracting 1 for Jan, Feb, only in leap years.
        // All of this complication to avoid the check if it is a leap year.
        if (month < 2) {
            year--;
        }
    
        // Century constant is 6. Subtract 1 from Month Table, so difference is 7.
    
        // Sunday (0), Monday (1) ...
    
        return (day + month_offset_table[month] + year + (year >> 2)) % 7;
    
    } /* end rtc_DayOfWeek() */
    
    0 讨论(0)
提交回复
热议问题