본문 바로가기
Source Code/my-code

Convert Unix Timetamp to readable Data/Time

by lifeseed 2015. 3. 10.

우선 아래의 사이트를 방문해보자.

 

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 <sys/time.h>
#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