May 15th Friday (五月 十五日 金曜日)

  There is a function that is used to calculate a border of time is so puzzled.  Yesterday evening I extracted the main source of that and made
a test program.  I am going to testing it and reading the source.  I hope that it can give me some help in this way.

//calSimeDate.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define     GKCMN_OK            0
#define     GKCMN_NG            -1

typedef struct{
    int     year;           /*  年  */
    int     month;          /*  月  */
    int     day;            /*  日  */
    int     hour;           /*  時  */
    int     min;            /*  分  */
}GSDATCMNdate;

/*  日報作成日締め開始情報  */
typedef struct{
    GSDATCMNdate        sime;               /*  当月の月締め日              */
    GSDATCMNdate        kaisi;              /*  当月の月開始日              */
    int                 sime_month;         /*  年締め月の対象月(31日ない日対応)  */
    int                 sime_day_flg;       /*  月締め日フラグ              */
    int                 kaisi_day_flg;      /*  月開始日フラグ              */
    int                 sime_month_flg;     /*  年締め月フラグ              */
    int                 kaisi_month_flg;    /*  年開始月フラグ              */
}LSDATRD_MakedateBorder;


int     DATCMNCalcDate( GSDATCMNdate *srcdate, GSDATCMNdate *objdate, GSDATCMNdate *calc )
{
    struct  tm  *calcdate;              /*  mktimeをする為のtm構造体データ  */
    time_t      timeerr;                /*  mktimeの処理結果    */
    time_t      gtime;
    int         ret;                    /*  関数リターン    */
   
   
    ret = GKCMN_OK;
   
    /*  計算用calcdateの初期設定として、システム時刻をセットする    */
    time( &gtime );
    calcdate = localtime(&gtime);
   
    /*  カレンダタスクの時間±差分時間を、tm構造体にセット  */
    calcdate->tm_year   = srcdate->year - 1900 + calc->year;
    calcdate->tm_mon    = srcdate->month - 1 + calc->month;
    calcdate->tm_mday   = srcdate->day + calc->day;
    calcdate->tm_hour   = srcdate->hour + calc->hour;
    calcdate->tm_min    = srcdate->min + calc->min;
    calcdate->tm_sec    = 0;
   
    /*  日付変換    */
    timeerr = mktime( calcdate );

    /*  正常に変換できた場合、レスポンス用データ領域にセット    */
    if( timeerr != GKCMN_NG )
    {
        objdate->year   = calcdate->tm_year + 1900;
        objdate->month  = calcdate->tm_mon + 1;
        objdate->day    = calcdate->tm_mday;
        objdate->hour   = calcdate->tm_hour;
        objdate->min    = calcdate->tm_min;
    }
    else
    {
        ret = GKCMN_NG;
    }
   
    return( ret );
}


int     DATRDCalcDateDay( GSDATCMNdate *srcdate, GSDATCMNdate *objdate, int dat )
{
    int             ret;
    GSDATCMNdate    calc;
   
    memset( &calc, 0, sizeof( calc ) );
   
    calc.day = dat;
   
    ret = DATCMNCalcDate( srcdate, objdate, &calc  );
   
    return( ret );
   
}


int     DATRDCalcSimedate( GSDATCMNdate *basedate, short eday_of_amonth, GSDATCMNdate *simedate, int *sime_month, int month )
{
    int             ret;
    GSDATCMNdate    wkdate;                     /*  締め日取得用ワーク  */
    int             wkdate_month;               /*  締め日取得用ワークの月を保持する用  */
    GSDATCMNdate    calc;
   
    /*  加減算用変数初期化  */
    memset( &calc, 0, sizeof(calc) );
   
    /*  basedateを取り出し、計算用のwkdateにコピー  */
    memcpy( &wkdate, basedate, sizeof(wkdate) );
   
   
    /* 締め日を計算する年月を求める */
    wkdate.month    = wkdate.month + month;
    ret = DATRDCalcDateDay( &wkdate, &wkdate, 0 );

    if( ret == GKCMN_OK )
    {
        /*  締め日が月をまたいだ場合の判断用に、月をワークに保持    */
        wkdate_month = wkdate.month;
       
        /*  締め日を求める  */
        memset( &calc, 0, sizeof(calc) );
        wkdate.day      = eday_of_amonth;
        ret = DATRDCalcDateDay( &wkdate, &wkdate, 0 );
       
        /*  締め日が取得できた場合  */
        if( ret == GKCMN_OK )
        {
            /*  締め日が月を跨いだ場合は、強制的に1日にする */
            if( wkdate.month != wkdate_month  )
            {
                wkdate.day = 1;
               
                /* 月末を締め日とする */
                /* (注)本処理の追加により、下記sime_month[0]=の計算結果は常に0となるが、*/
                /*       デグレード防止のため、削除は行わないこととする                   */
                ret = DATRDCalcDateDay( &wkdate, &wkdate, -1 );
            }
           
            /*  1月締め日と、締め時に月報を書き込む月領域の差分を求める(31日無い日対応)   */
            sime_month[0] = (( wkdate.month + 12 - wkdate_month ) % 12) * (-1);
            /*  求めた締め日をセット    */
            memcpy( simedate, &wkdate, sizeof( wkdate ));
        }
   }
   
    return( ret );
}

int main(int argc, char *argv[]) {
   
    GSDATCMNdate now_date;
    GSDATCMNdate make_date;
    int sime_month = 0;
   
    memset(&now_date, 0, sizeof(GSDATCMNdate));
    memset(&make_date, 0, sizeof(GSDATCMNdate));
   
    if (argc < 8) {
        printf("%s year month day hour min sime_day sime_month/n", argv[0]);
        exit(0);
    }
   
    now_date.year = atoi(argv[1]);
    now_date.month = atoi(argv[2]);
    now_date.day = atoi(argv[3]);
    now_date.hour = atoi(argv[4]);
    now_date.min = atoi(argv[5]);
   
    DATRDCalcSimedate(&now_date, atoi(argv[6]), &make_date, &sime_month, atoi(argv[7]));
   
    printf("year: %d/n", make_date.year);
    printf("month: %d/n", make_date.month);
    printf("day: %d/n", make_date.day);
    printf("hour: %d/n", make_date.hour);
    printf("min: %d/n", make_date.min);
   
    printf("sime month: %d/n", sime_month);
   
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值