C/명품 C언어 프로젝트(안기수 저)

[C언어] 시간과 날짜와 관련된 함수들

꾸준함. 2017. 6. 2. 21:38

아래 함수들은 헤더파일 <time.h>를 필요


 시간 계산

 time_t time(time_t *timeptr);

 1970년 1월 1일 자정부터 경과된 현재 시간을 초단위로 계산

 시간을 문자열로 변환

 char *asctime(struct tm *time);

 구조체 tm 형식의 시간을 문자열로 변환

 char *ctime(time_t *time);

 함수 time으로부터 계산된 현재 시간을 문자열로 변환

 시간을 구조체로 변환

struct tm *localtime(time_t *time); 

 지역시간(local time)을 구조체 tm의 형식으로 가져오는 함수

 struct tm *gmtime(time_t *time);

 Greenwich Mean Time(GMT)을 구조체 tm 형식으로 가져옴

 시간 차이 계산

 clock_t clock(void);

 clock tick으로 경과된 시간 

 double difftime(time_t time2, time_t time1);

 두 시간의 차이를 초단위로 계산

 시간 지연

 void Sleep(unsigned millisecond);

 인자가 지정하는 만큼의 1/1000초 단위의 시간을 지연

void delay(unsigned millisecond); 


[예시]

/*

날짜와 시간을 문자열로 출력(time, localtime, asctime, ctime)

*/

#include <time.h>

#include <stdio.h>

 

int main(void)

{

        time_t now;

        time(&now);

        printf("현재 날짜와 시간:%s", asctime(localtime(&now)));

        printf("현재 날짜와 시간:%s", ctime(&now));

        return 0;

}

 


[구조체 tm]

struct tm

{

        int tm_sec; //(second) 범위[0, 59]

        int tm_min; //(minutes) 범위[0, 59]

        int tm_hour; //시간(hour) 범위[0, 23]

        int tm_mday; //날짜(day) 범위[1, 31]

        int tm_mon;; //(month) 범위[0, 11]

        int tm_year; //1900 이후의 연도 

        int tm_wday; //요일(second) 범위[0, 6]

        int tm_yday; //연중날짜(day) 범위[0, 365]

        int tm_isdst; //일광절약시간 범위[0, 59]

};


[예시]

/*

날짜와 시간에 대해 구조체 멤버별로 구분하여 출력

*/

#include <time.h>

#include <stdio.h>

 

int main(void)

{

        time_t curr;

        struct tm *d;

        curr = time(NULL);

        d = localtime(&curr);

        printf("현재날짜\n");

        printf("%d%d%d\n", d->tm_year + 1900, d->tm_mon + 1, d->tm_mday);

        printf("현재시간\n");

        printf("%d%d%d\n", d->tm_hour, d->tm_min, d->tm_sec);

        return 0;

}

 


구분 

함수 time 

함수 clock 

원형 

time_t time(time_t *timer); 

clock_t clock(void); 

기능 

절대시간 또는 달력시간(calender time)을 계산 

프로세서 시간을 계산 

반환 값 

1970년 1월 1일 자정 이후 현재까지 경과된 시간을 초(second)로 반환 

프로세서 시간을 반환 


[time 예시]

/*

함수 time clock 비교

*/

#include <stdio.h>

#include <time.h>

 

int main(void)

{

        time_t start, end;

        long i = 0;

        double pst;

        start = time(NULL);

        while (i < 3000000)

        {

               i++;

        }

        end = time(NULL);

        pst = difftime(end, start);

        printf("time:%f\n", pst);

        return 0;

}

 

 

초 단위의 계산을 하는 time()은 1초보다 적게 걸린 시간은 그냥 0초라고 출력


[clock 예시]

/*

함수 time clock 비교

*/

#include <stdio.h>

#include <time.h>

 

int main(void)

{

        clock_t start, end;

        long i = 0;

        double pst;

        start = clock();

        while (i < 3000000)

        {

               i++;

        }

        end = clock();

        pst = (double)(end - start) / CLK_TCK;

        printf("time:%f\n", pst);

        return 0;

}

 

반면 clock 결과 값은 적은 시간이라도 출력


구분 

함수 원형과 인자 

함수 설명 

시간 지연 

void Sleep(unsigned millisecond) 

인자가 지정하는 만큼의 1/1000초 단위의 시간을 지연 


[예시]

/*

시간을 지연하는 함수 Sleep

*/

#include <time.h>

#include <stdio.h>

#include <Windows.h>

 

int main(void)

{

        clock_t start, end;

        double pst;

        start = clock();

        printf("start!\n");

        Sleep(3500);

        end = clock();

        printf("end\n");

        pst = (double)(end - start) / CLK_TCK;

        printf("경과시간::%f\n", pst);

        return 0;

}

 

빌드 되고 나서 3.5초 이후에 end가 출력된다


기준일(1년 1월 1일)로부터 특정일 사이의 날짜 수의 계산 함수 total_days

/*

기준일(1 1 1)로부터 특정일 사이의 날짜 수의 계산 함수 total_days

*/

long total_days(int year, int month, int day)

{

        int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        int i;

        long total = 0L;

        //4 나누어지는 회수-100으로 나누어지는 횟수(평년)+400으로 나누어지는 횟수

        total = (year - 1) * 365L + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;

        if (!(year % 4) && year % 100 || !(year % 400)) //윤년일 때만 2월달 하루 추가

               months[1]++;

        for (i = 0; i < month - 1; i++)

               total += months[i];

        total += day;

        return total;

}

 

[예시]

/*

특정일의 요일 계산

*/

#include <stdio.h>

 

long total_days(int year, int month, int day);

 

int main(void)

{

        int year, month, day;

        char *week_day[] = { "","","","","","","" };

        long total;

 

        printf("특정일의 요일 구하는 프로그램\n\n");

        printf("입력될 숫자는 space bar 분리하고\n");

        printf("Enter 키를 누릅니다\n");

        printf("예로 2005 5 1 Enter\n");

        printf("년월일 입력:");

        scanf("%d %d %d", &year, &month, &day);

        total = total_days(year, month, day);

        printf("%s 요일입니다\n", week_day[total % 7]);

        return 0;

}

 

long total_days(int year, int month, int day)

{

        int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        int i;

        long total = 0L;

        total = (year - 1) * 365L + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;

        if (!(year % 4) && year % 100 || !(year % 400))

               months[i]++;

        for (i = 0; i < month - 1; i++)

               total += months[i];

        total += day;

        return total;

}


/*

특정일 사이의 날짜 계산

*/

#include <stdio.h>

 

long total_days(int year, int month, int day);

 

int main(void)

{

        long total;

        total = total_days(2009, 9, 16) - total_days(1983, 5, 6);

        printf(" 날짜 사이의 날짜 :%ld\n", total);

        return 0;

}

 

long total_days(int year, int month, int day)

{

        int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        int i;

        long total = 0L;

        total = (year - 1) * 365L + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;

        if (!(year % 4) && year % 100 || !(year % 400))

               months[i]++;

        for (i = 0; i < month - 1; i++)

               total += months[i];

        total += day;

        return total;

}


[참고] 명품 C언어 프로젝트 안기수 저

반응형