우선 아래의 사이트를 방문해보자.
http://www.onlineconversion.com/unix_time.htm
32Bit의 정수 값으로 년월일시분초를 표시하는데, 이를 흔히 Timestamp라고 부른다.
특히 Unix 에서 제공되는 기준을 따라 표시하는 시간에 대한 정수값을 Unix TimeStamp 라고 한다.
표준 C Library에서 제공되는 gettimeofday() 함수를 통해 timestamp를 구할 수 있으며,
localtime() 함수를 통해 timestamp 로 부터 읽을수 있는 날짜 시간을 구해 올 수 있다.
이때 localtime의 기준값을 1900년 1월 1일 0시 0분 인 듯하다.
#include <time.h> // struct tm *ptm;
unsigned int get_Time(void)
{
struct timeval xtv;
struct tm *ptm;
gettimeofday(&xtv, NULL);
fprintf(stderr, "%ld, 0x%x \n", xtv.tv_sec, (unsigned int)xtv.tv_sec);
ptm = localtime(&xtv.tv_sec);
fprintf(stderr, "%d - %d - %d %d:%d\n"
, ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday
, ptm->tm_hour, ptm->tm_min);
return (unsigned int) xtv.tv_sec;
}
Unix TimeStamp 값을 Liberay를 사용하지 않고 구해보자.
우선 Unix Time Stamp의 값의 기준은 GMT 1970년 1월 1일 0시 0분 0초이다.
그리고 4년마다 한번씩 2월달은 29일을 가진다.
즉 1년을 날수로 계산하면 4년중 3년은 365일이며, 나머지 1년은 366일이다.
그 해 년수를 4로 나누어 떨어지는 해의 1년 날수가 366일을 가진다.
그리고 대한민국은 GMT+9 로서 9시간을 앞선다. 즉 GMT보다 9시간 더한 시간으로 년월일을 계산해야한다.
이정도 정보를 가지고 timestamp를 년월일시분초로 변경해보자.
~~~~~~
#define BASE_YEAR 1970
#define SEC_GMTPLUS9 32400 // Korea GMT+9h 9*60*60
#define SEC_4YEAR 126230400 // (365*3+366)*24*60*60
#define SEC_DAY 86400 // 24*60*60
#define SEC_HOUR 3600 // 60*60
#define SEC_MIN 60
unsigned int secOfYear[4] = {0
, 31536000 // last 1 year day :: 365
, 63072000 // last 2 year day :: 365*2
, 94694400}; // last 3 year day :: 365*2 + 366
unsigned int dayOfMonth[2][12] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334} // 365 days
,{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335} // 366 days
};
void time_from_unixtime(unsigned int timestamp)
{
int gmt_timestamp = timestamp+SEC_GMTPLUS9;
unsigned int sec_of_year, sec_of_month, sec_of_hour, sec_of_min;
int year, month, day, hour, min, sec;
int bFeb29 = 0;
int idx;
sec_of_year = gmt_timestamp / SEC_4YEAR;
year = BASE_YEAR + sec_of_year*4;
sec_of_month = gmt_timestamp % SEC_4YEAR;
for(idx = 0; idx<2; idx++)
{
if(sec_of_month < secOfYear[idx+1])
{
break;
}
}
sec_of_month -= secOfYear[idx];
year += idx;
// end of year ========================================================
day = sec_of_month / SEC_DAY;
for(idx = 0; idx < 11; idx++)
{
if(day < dayOfMonth[bFeb29][idx+1])
{
break;
}
}
// idx == 11 => Descemble
month = idx+1;
day -= dayOfMonth[bFeb29][idx];
day += 1;
// end of Month ========================================================
sec_of_hour = sec_of_month % SEC_DAY;
hour = sec_of_hour/SEC_HOUR;
sec_of_min = sec_of_hour%SEC_HOUR;
min = sec_of_min/SEC_MIN;
sec = sec_of_min%SEC_MIN;
printf("%04d-%02d-%02d :: ", year, month, day);
printf("%02d:%02d:%02d \n", hour, min, sec);
}
return 값을 각자 알아서 고치고 prinf를 통해서 출력되는 값을 확인할 수 있다.
1425959906
=> 2015-03-10 :: 12:58:26