ภาษา c Function find previous day หาวันที่ย้อนหลัง (ไว้ใช้กับ UNIX)

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

/*============ Substring Function ===================*/

char *substring(size_t start, size_t stop, const char *src, char *dst, size_t size)
{
   int count = stop - start;
   if ( count >= --size )
   {
      count = size;
   }
   sprintf(dst, "%.*s", count, src + start);
   return dst;
}
/*=================== Substring Function ==================*/

/*================== Time diff Function ====================*/
int date_diff(char nowdate[20], int diff)
{
    int i,maxday,nowday,nowmonth,nowyear,prevday,prevmonth,prevyear,monthdiff,diffyear,len;
    long long prevdate;
    char tempnowday[2],tempnowmonth[2],tempnowyear[20],tempprevday[2],tempprevmonth[2],tempprevyear[20],resultday[2],resultmonth[2],resultyear[5],result[20];

//printf("nowdate %s\n",nowdate);

    substring(0,4,nowdate,tempnowyear,100);
    nowyear = atoi(tempnowyear);
//printf("tempnowyear %s\n",tempnowyear);
   
    substring(4,6, nowdate, tempnowmonth, sizeof nowdate);
    nowmonth = atoi(tempnowmonth);

    substring(6,8,nowdate,tempnowday,sizeof nowdate);
    nowday = atoi(tempnowday);

//printf("now year str %s %s %s\n",tempnowyear,tempnowmonth,tempnowday);
//printf("now year int %d %d %d\n",nowyear,nowmonth,nowday);

//printf("diff %d\n",diff);

    prevday = nowday - diff;
    if (prevday <= 0){
        prevmonth = nowmonth - 1;
        if (prevmonth <= 0){
            prevyear = nowyear - 1;
            prevmonth = 12 + prevmonth;
        }else{

            prevyear = nowyear;
        }

        switch (prevmonth){
                    case 1: maxday = 31;
                        break;
                    case 2:
                            if ((nowyear % 4) == 0){
                                maxday = 29;       
                            }else{
                                maxday = 28;
                            }
                            break;
                    case 3: maxday = 31;
                            break;
                    case 4: maxday = 30;
                            break;
                    case 5: maxday = 31;
                            break;
                    case 6: maxday = 30;
                            break;
                    case 7: maxday = 31;
                            break;
                    case 8: maxday = 31;
                            break;
                    case 9: maxday = 30;
                            break;
                    case 10: maxday = 31;
                            break;
                    case 11: maxday = 30;
                            break;
                    case 12: maxday = 31;
                            break;
                    default: return -2;
                            break;
                }
            //printf("prevday %d\n",prevday);
                prevday = maxday + prevday;
    }else{
        prevmonth = nowmonth;
        prevyear = nowyear;
    }
    sprintf(tempprevday,"%d",prevday);
//printf("tempprevday %s\n",tempprevday);
    len = strlen(tempprevday);
    if (len < 2){
        strcpy(resultday,"0");
        strcat(resultday,tempprevday);
    //printf("resultday1 %s\n",resultday);
    }else{
        strcpy(resultday,tempprevday);
    //printf("resultday2 %s\n",resultday);
    }

    sprintf(tempprevmonth,"%d",prevmonth);
    len = strlen(tempprevmonth);
    if (len < 2){
        strcpy(resultmonth,"0");
        strcat(resultmonth,tempprevmonth);
    //printf("resultmonth1 %s\n",resultmonth);
    }else{
        strcpy(resultmonth,tempprevmonth);
    //printf("resultmonth2 %s\n",resultmonth);
    }

    sprintf(tempprevyear,"%d",prevyear);
    len = strlen(tempprevyear);
    strcpy(resultyear,tempprevyear);
   //printf("resultyear %s\n",resultyear);

    strcpy(result,resultyear);
    strcat(result,resultmonth);
    strcat(result,resultday);
//printf("result %s\n",result);

    prevdate = atoll(result);
//printf("prevdate %lld\n",prevdate);
    return(prevdate);
}
/*=================== Time diff Function ==============*/

/*==================== Main =====================*/
main(int argc, char *argv[])
{
    char nowdate[20],prevdate[20];
    int diffday,prev,i;

    for (i = 1; i<argc; i++) {      
        if (i == 1){
            strcpy(nowdate,argv[i]);
        }else if (i == 2){
            strcpy(prevdate,argv[i]);
        }
    }

/*printf("Enter now date: ");
    scanf("%s",nowdate);
printf("Enter diffday: ");
    scanf("%s",prevdate);
*/   
    diffday = atoi(prevdate);
//printf("diffday %d\n",diffday);

    prev = date_diff(nowdate,diffday);
printf("%d\n",prev);
}
/*================== Main ======================*/

 

วิธีเรียกใช้ ./previousdate <current date> <expect previous day>

Ex: ./previousdate 20100630 1

Output: 20100629

ความคิดเห็น

เพื่อนกูเก่งจริงๆ

เพื่อนกูเก่งจริงๆ

กูก็มั่วๆ เอา

กูก็มั่วๆ เอา

ก่อนจะ ./previousdate

ก่อนจะ ./previousdate <current date> <expect previous day>

อย่าลืม chmod +x previousdate ก่อนนะ

ไม่ต้องก็ได้ #gcc -o

ไม่ต้องก็ได้

#gcc -o previousdate previousdate.c

#./previousdate <current date> <expect previous day>

ได้เลย มันเป็น c อะไม่ต้องเปลี่ยน excute mode

แต่ถ้า gcc ไม่ผ่านให้ลอง

#dos2unix previousdate.c previousdate.c

ดูก่อนครับ

ความรู้ใหม่

ความรู้ใหม่

แม่งไปรันบน HP เอ๋ออีกละ

แม่งไปรันบน HP เอ๋ออีกละ แก้ไขสำหรับ HP ครับ

strcpy(result,resultyear);
    strcat(result,resultmonth);
    strcat(result,resultday);

    substring(0,8,result,result,9); //เพิ่มบรรทัดนี้เข้าไปครับ เพื่อทำการตัดสริงเอาแค่ 8 Digits ครับ เพราะ HP Return มาเป็น 10 digits ซะงั้น ไม่รู้มายังไง
//printf("result %s\n",result);

    prevdate = atoll(result);
//printf("prevdate %lld\n",prevdate);
    return(prevdate);

กระทู้ pop ใช้ได้วุ้ย 90+ ละ

กระทู้ pop ใช้ได้วุ้ย 90+ ละ แต่ไม่มีใครเจอปัญหาไรเลยเหรอ

ไ่ม่เห็นมีใครโพสถามเลย หรือว่า่ไม่มีใครเอาไปใช้หว่า