ภาษา c Function หา different Date เวลาใช้ mktime(); ไม่ได้

เท่าที่เจอมาเป็นปัญหาของเครื่อง HP-Unix ครับ พอคอนเวิดฟอร์แมทเป็นวันที่ได้แต่เวลาจะเอามาหาว่าห่างกันกี่วันสั่ง mktime(); ไปดันรีเทินเป็น -1 ซะงั้น เลยเป็นเวรเป็นกรรมที่จะต้องมาเขียนฟังก์ชั่นใช้เอง (ไม่ง้อมันก็ได้วะ) ใครมีปัญหาเดียวกันจะเอาไปปรับใช้ก็ได้นะครับ

==============================

#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], char prevdate[20])
{
    int i,maxday,nowday,nowmonth,nowyear,prevday,prevmonth,prevyear,monthdiff,diff,diffyear;
    char tempnowday[2],tempnowmonth[2],tempnowyear[20],tempprevday[2],tempprevmonth[2],tempprevyear[20];

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

    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);

    substring(0,4,prevdate,tempprevyear,100);
    prevyear = atoi(tempprevyear);
    //printf("tempprevyear %s\n",tempprevyear);

    substring(4,6,prevdate,tempprevmonth,sizeof prevdate);
    prevmonth = atoi(tempprevmonth);

    substring(6,8,prevdate,tempprevday,sizeof prevdate);
    prevday = atoi(tempprevday);

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

    //printf("prev year str %s %s %s\n",tempprevyear,tempprevmonth,tempprevday);
    //printf("prev year int %d %d %d\n",prevyear,prevmonth,prevday);
    diffyear= nowyear - prevyear;
    //printf("Diff year %d\n",diffyear);
    /*if(diffyear >= 2){
        diff = diffyear * 365;
        return diff;
    }else*/ if(nowyear < prevyear){
        return -1;
    }else{
        //printf("nowmonth %d,prevmonth %d,diffyear %d\n",nowmonth,prevmonth,diffyear);
        if(nowmonth == prevmonth){
            if (diffyear >= 1){
                diff = nowday - prevday;
                diff = (diffyear * 365) + diff;
            }else{
                diff = nowday - prevday;
            }
        }else if(nowmonth > prevmonth){
            monthdiff = nowmonth - prevmonth;
            //printf("monthdiff %d\n",monthdiff);
            i = 1;
            while(i <= monthdiff){
                nowmonth--;
                i++;
                //printf("nowmonth %d,i %d\n",nowmonth,i);
                switch (nowmonth){
                    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;
                }
                nowday = nowday + maxday;
                //printf("nowday %d,maxday %d\n",nowday,maxday);
            }
            diff = nowday - prevday;
            if (diffyear >= 1){
                diff = (diffyear * 365) + diff;
            }
            //printf("03|diff %d\n",diff);
           
        }else if((nowmonth < prevmonth) && (diffyear == 1)){
            //printf("=====\n");
            while(i <= diffyear){
            while ((prevmonth >= nowmonth) && (prevmonth <= 12)){
                switch (prevmonth){
                    case 1: maxday = 31;
                            break;
                    case 2:
                            if ((prevyear % 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 -3;
                            break;
                }
                prevmonth++;
                nowday = nowday + maxday;
            }
            }
            if (prevmonth >= 12){
                    prevmonth = 1;
                    prevyear++;
                }
            if (prevmonth == 1){
                monthdiff = nowmonth - prevmonth;
                //printf("monthdiff %d\n",monthdiff);
                i = 1;
                while(i <= monthdiff){
                    nowmonth--;
                    i++;
                    //printf("nowmonth %d,i %d\n",nowmonth,i);
                    switch (nowmonth){
                        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 -4;
                                break;
                    }
                    nowday = nowday + maxday;
                    //printf("nowday %d,maxday %d\n",nowday,maxday);
                }
            }
            diff = nowday - prevday;
            //printf("03|diff %d\n",diff);
        }else{
            diff = diffyear * 365;
        }
        //printf("02|diff %d\n",diff);
        return diff;
    }
}
/*/*============ Time diff Function ===============*/

/*========= Main ==========*/
main(){
    char nowdate[20],prevdate[20];
    int diffday=30,difftmp;

    printf("Enter now date: ");
    scanf("%s",nowdate);
    printf("Enter prev date: ");
    scanf("%s",prevdate);

    difftmp = date_diff(nowdate,prevdate);
    printf("diff day %d,diff temp %d\n",diffday,difftmp);
}
/*======== Main ==========*/

 

ส่ง paramiter ไปเป็น ฟอร์แมท YYYYMMDD ครับ

โดย assume เป็นวันที่ปัจจุบันก่อน แล้วใส่วันที่ย้อนหลังครับ

โปรแกรมจะไปทำการตัดสตริงแยกเป็น ปี เดือน วัน ก่อน แล้วนำมาคำนวน แล้วรีเทินค่ากลับมาครับ

ให้เฉพาะโค๊ตนะครับ เอ้าพุตกับอินพุตยังไงลองก็อบโค๊ตไปรันศึกษาดูครับ รันได้ทุก os เพราะใช้แต่คำสั่งพื้นฐาน ไม่มีฟังก์ชันเฉพาะมาเกี่ยวครับมีแค่ if else while switch ครับ

ความคิดเห็น

เป็นเฉพาะ hp-unix เหรอครับ

เป็นเฉพาะ hp-unix เหรอครับ เพราะปกติใช้ ลินิกซ์ ไม่เคยเจอปัญหานี้

เป็นเฉพาะ hp-unix เหรอครับ

เป็นเฉพาะ hp-unix เหรอครับ เพราะปกติใช้ ลินิกซ์ ไม่เคยเจอปัญหานี้

linux กับ solaris ไม่เจอครับ

linux กับ solaris ไม่เจอครับ แต่ผมไปเจอใน hp-unix ที่ AIS ครับ เลยต้องเขียนไว้ใช้เอง เลยเอามาเผื่อใครไปเจอมาเหมือนกันจะได้เอาไปปรับใช้ได้ครับ