일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- docker
- CSS
- html input
- raspberrypi
- TensorflowServer
- HTML
- 웹페이지 기본
- Raid
- html input tag
- 다항회귀예제
- tensorflow
- html환경구축
- 다항회귀
- RAID개념설명
- C언어
- ubuntu18.04
- jupyter
- Ubunrtu
- 코딩테스트후기
- Linux
- 라즈베리파이
- html태그정리
- 개념설명
- RIAD0
- 삼성SW역량테스트
- multicast
- 삼성sw역량테스트b형
- 멀티캐스트
- RAID구축
- HTML예제
- Today
- Total
Easy ways
[C 언어] 현재 시간을 표시하는 방법 [time, ftime, ctime] 본문
코딩을 하다 보면 현재 시간을 불러와야 할 필요가 생깁니다.
그럴 때는 다음과 같이 코드를 구성해야 합니다.
개발환경 : linux
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t seconds = time(NULL);
struct tm *now = localtime(&seconds);
printf("[%04d/%02d/%02d] %02d:%02d:%02d\n", 1900 + now->tm_year,
now->tm_mon + 1, now->tm_mday, now->tm_hour,
now->tm_min, now->tm_sec);
return 0;
}
실행결과
time함수는 1970년 1월 1일 0시부터 경과된 현재까지 몇 초 지났는지를 알려줍니다
이 초 단위의 시간을 localtime을 통해 년/월/일/시간으로 우리가 알기 쉽게 변환하여 tm 구조체에 담아줍니다.
tm 구조체는 다음과 같이 구성되어 있습니다.
struct tm {
int tm_sec; //초
int tm_min; //분
int tm_hour; //시
int tm_mday; //일
int tm_mon; //월 [0~11]
int tm_year; //년 [현재시간 표시시 +1900 필요]
int tm_wday; //요일 [0-일요일, 1-월요일, ... ,6-토요일]
int tm_yday; //이번해의 몇번째 일인지
int tm_isdst;
};
msec까지 알고 싶을 때 [ftime, clock_gettime]
시간을 상세하게 milli second 단위,, 혹은 더 작은 단위까지도 까지 알아야 할 때가 있습니다.
그럴때는 조금 더 복잡한 방법을 써야합니다
[clock_gettime]
time.h 에 포함되어있는 clock_gettime을 사용하여 현재 시간의 milliseconds 단위까지 확인하는 법은 다음과 같습니다.
#include <stdio.h>
#include <time.h>
#include <math.h>
int main( void) {
struct timespec specific_time;
struct tm *now;
int millsec;
clock_gettime( CLOCK_REALTIME, &specific_time);
now = localtime(&specific_time.tv_sec);
millsec = specific_time.tv_nsec;
millsec = floor (specific_time.tv_nsec/1.0e6);
printf("[%04d/%02d/%02d] %02d:%02d:%02d msec : %d\n", 1900 + now->tm_year,
now->tm_mon + 1, now->tm_mday, now->tm_hour,
now->tm_min, now->tm_sec, millsec);
return 0;
}
//gcc test.c -lm
실행결과
timespec의 구조는 다음과 같습니다.
struct timespec {
time_t tv_sec
long tv_nsec
}
초단위의 사간 뿐만 아니라 nano 단위의 시간까지 표시할 수 있음을 볼 수 있습니다.
하지만 이 nano 시간은 시스템별로 정확도가 보장되지는 않는다고 합니다.
저희는 이 nano second를 사용하여 millisecond로 변환시켜줄 겁니다.
floor 를 사용하여 nanosecods 를 milli sencods 로 변환 시켜줍니다.
floor(math.h) 를 사용하기 위해서 컴파일 시에 -m을 사용해야합니다.
[ftime]
제가 선호하는 방식은 조금더 단순한 ftime 입니다.
하지만 더 이상 지원되지 않고 향후 GNU 버전에선 삭제될 수 있는 함수입니다..
삭제될 때까지는 간단한 함수 짤때는 사용할 수 있습니다.
사용법은 다음과 같습니다.
sys/timeb.h 를 불러와서 timeb 구조체 및 ftime 함수를 사용해야 합니다.
sys/timeb.h는 리눅스에서 지원하는 헤더로 윈도에선 사용이 어렵습니다
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
int main(void)
{
struct timeb milli_now;
struct tm *now;
ftime(&milli_now);
now = localtime(&milli_now.time);
printf("[%04d/%02d/%02d] %02d:%02d:%02d (%02dmsec)\n", 1900 + now->tm_year,
now->tm_mon + 1, now->tm_mday, now->tm_hour,
now->tm_min, now->tm_sec, milli_now.millitm/10);
return 0;
}
실행결과
구조체 timeb는 다음과 같은 구조로 구성되어 있습니다.
struct timeb{
time_t time; // 시간 구조체 (초단위)
unsigned short millitm; // 현재 시간의 milliseconds
short timezone; //UTC 시간과 현재 local 시간 차이 표시
short dstflag;
};
구조를 보시면 time_t 구조체가 timeb 구조체 안에 들어가 있는 것을 볼 수 있습니다.
조금 더 상위 구조체인 거죠.
또한 millitm을 가지고 있어 현재시간의 milliscond 단위도 표현할 수 있습니다.
현재 시간을 문자열로 출력하고 싶을 때 [ctime]
단순하게 시간만 보면 될 때 쓰는 간단한 방식은 다음과 같습니다.
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t seconds = time(NULL);
printf("Now :%s\n", ctime(&seconds));
return 0;
}
실행결과
'프로그래밍 언어 > C언어' 카테고리의 다른 글
[C 언어] 프로그램이 read 에서 멈출때 해결법(read() 타임 아웃 설정:select) (2) | 2021.03.03 |
---|---|
[Linux/C 언어] 멀티캐스트 송신 코드 및 테스트 (Multicast Sender) (2) | 2021.02.26 |
[C 언어] 시리얼 통신 Open 함수 (struct termios) (1) | 2021.02.23 |
[C 언어] 디렉토리에서 가장 최근에/오래전에 수정된 파일 찾기. (0) | 2021.01.14 |