아래 함수들은 헤더파일 <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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 3.1장 연습문제 (0) | 2017.06.07 |
---|---|
명품 C언어 프로젝트 2.3장 연습문제 (0) | 2017.06.02 |
명품 C언어 프로젝트 2.2장 연습문제 (0) | 2017.05.31 |
명품 C언어 프로젝트 2.1장 연습문제 (7) | 2017.05.28 |
명품 C언어 프로젝트 1장 연습문제 (8) | 2017.05.25 |