2011年11月11日金曜日

無効な日付の補正方法

日付設定をするときに、たとえば 2010/02/30 などとありえない日付を指定したときにその値を適当に補正してほしい場合に使います。

mktime()でおかしな値でもよいので日付を突っ込んで、秒数にして(ここで補正がかかっている)、localtimeで日付を取り出します。

ということですね。

// for Linux
#include 
#include 

int main(int argc, const char** argv)
{
    if (6 != argc) {
        printf("年 月 日 時 分\n");
        printf("USAGE: %s 2009 11 2 13 58\n", argv[0]);
        return 0;
    }
    
    time_t timer;
    struct tm t;
    struct tm *t_st;

    int year, month, day, hour, min;
    char *endptr;

    year  = strtol(argv[1], &endptr, 10);
    month = strtol(argv[2], &endptr, 10);
    day   = strtol(argv[3], &endptr, 10);
    hour  = strtol(argv[4], &endptr, 10);
    min   = strtol(argv[5], &endptr, 10);

    printf("%d/%d/%d %d:%d\n", year, month, day, hour, min);

    t.tm_year = year - 1900; /* 2001年 */
    t.tm_mon  = month - 1;       /* 5月    */
    t.tm_mday = day;      /* 20日   */
//    t.tm_wday = 0;       /* 日曜日 */
    t.tm_hour = hour;      /* 14時   */
    t.tm_min  = min;      /* 20分   */
    t.tm_sec  = 0;       /* 00秒   */
    t.tm_isdst= -1;      /* 夏時間無効 */

   /* 構造体を時刻に変換 */
   timer = mktime(&t);

   printf("時刻 : %ld\n",timer);

   /* 再変換して確認 */
   t_st = localtime(&timer);

   printf("年  : %d\n",t_st->tm_year+1900);
   printf("月  : %d\n",t_st->tm_mon+1);
   printf("日  : %d\n",t_st->tm_mday);
   //printf("曜日: %d\n",t_st->tm_wday);
   printf("時  : %d\n",t_st->tm_hour);
   printf("分  : %d\n",t_st->tm_min);
   printf("秒  : %d\n",t_st->tm_sec);

   return 0;
}

0 件のコメント:

コメントを投稿