您的位置:首页 > 其它

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

2009-05-29 10:45 477 查看
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( >ime );
calcdate = localtime(>ime);

/* カレンダタスクの時間±差分時間を、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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: