php date 함수 를 c 로..

acidd15의 이미지

joinc에 올렸던 건데..

뭐..제가 100%만들었다기 보단 php의 date함수의 소스를 좀 참고해서 베낀겁니다.ㅋ..작동법은 php의 date함수의 사용법과 비슷한데 몇가지는 지원하지 않습니다.추가해서 쓰실분들은 추가해서 쓰십시요.

#include <stdio.h>
#include <time.h>
#include <sys/time.h>

char *mon_full[12] = {
  "January", "February", "March", "April",
  "May", "June", "July", "August",
  "September", "October", "November", "December"
};

char *mon_short[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

char *day_full[7] = {
  "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};

char *day_short[7]={
  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};

#define isleap(year) ((((year) % 4) == 0 && ((year) % 100) != 0) || ((year) % 400)==0)
#define YEAR_BASE 1900

static int day_tab[2][12] = {
  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

int date(char *,long int ,char **);

int date(char *format,long int timestamp,char **ret){

  char buf[11]={0};
  char *ret_tmp;
  char chr;
  int cnt=0;
  int mem_size=0,str_len=0;
  int num_tmp=0,wd,yd,fd,wk;
  struct tm *tm_date;
  time_t time_date;

  if(timestamp<0){
    time_date=time(NULL);
  }else{
    time_date=timestamp;
  }
    
  while((chr=*(format+cnt))){

    switch(chr){

      case '\\':
        ++cnt;
        ++mem_size;
        break;
      case 'U':
        mem_size+=10;
        break;
      case 'Y':
        mem_size+=4;
        break;
      case 'B':
      case 'D':
      case 'M':
        mem_size+=3;
        break;
      case 'l':
      case 'F':
        mem_size+=9;//l Wednesday,F September
        break;
      case 'g':
      case 'G':
      case 'h':
      case 'm':
      case 'd':
      case 'H':
      case 'i':
      case 'j':
      case 's':
      case 'A':
      case 'a':
      case 'n':
      case 't':
      case 'W':
      case 'y':
      case 'z':
        mem_size+=2;
        break;
      case 'I':
      case 'L':
      case 'w':
      default:
        ++mem_size;
        break;

    }

    ++cnt;

  }

  (*ret)=(char *)malloc(sizeof(char)*mem_size+1);
  memset((*ret),0x0,sizeof(char)*mem_size+1);
  ret_tmp=(*ret);
  
  cnt=0;
  tm_date=gmtime((time_t *)&time_date);

  while((chr=*(format+cnt))){

    switch(chr){

      case '\\':
        ++cnt;
        *(*ret)=*(format+cnt);
        ++(*ret);
        break;
      case 'U':
        sprintf(buf,"%ld",time_date);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 'Y':
        sprintf(buf,"%04d",(tm_date->tm_year)+YEAR_BASE);
        memcpy((*ret),buf,4);
        (*ret)+=4;
        break;
      case 'B':
        num_tmp=(((((long)time_date)-(((long)time_date)-
        ((((long)time_date)%86400)+3600)))*10)/864);
        while(num_tmp<0){
          num_tmp+=1000;
        }
        num_tmp=num_tmp%1000;
        sprintf(buf,"%03d",num_tmp);
        memcpy((*ret),buf,3);
        (*ret)+=3;
        break;
      case 'D':
        memcpy((*ret),day_short[tm_date->tm_wday],3);
        (*ret)+=3;
        break;
      case 'M':
        memcpy((*ret),mon_short[tm_date->tm_mon],3);
        (*ret)+=3;
        break;
      case 'l':
        str_len=strlen(day_full[tm_date->tm_wday]);
        memcpy((*ret),day_full[tm_date->tm_wday],str_len);
        (*ret)+=str_len;
        break;
      case 'F':
        str_len=strlen(mon_full[tm_date->tm_mon]);
        memcpy((*ret),mon_full[tm_date->tm_mon],str_len);
        (*ret)+=str_len;
        break;
      case 'g':
        num_tmp=tm_date->tm_hour%12;
        if(num_tmp==0) num_tmp=12;
        sprintf(buf,"%d",num_tmp);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 'G':
        sprintf(buf,"%d",tm_date->tm_hour);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 'h':
        num_tmp=tm_date->tm_hour%12;
        if(num_tmp==0) num_tmp=12;
        sprintf(buf,"%02d",num_tmp);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=2;
        break;
      case 'm':
        sprintf(buf,"%02d",(tm_date->tm_mon)+1);
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'd':
        sprintf(buf,"%02d",tm_date->tm_mday);
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'H':
        sprintf(buf,"%02d",tm_date->tm_hour);
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'i':
        sprintf(buf,"%02d",tm_date->tm_min);
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'j':
        sprintf(buf,"%d",tm_date->tm_mday);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 's':
        sprintf(buf,"%02d",tm_date->tm_sec);
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'A':
        memcpy((*ret),(tm_date->tm_hour>=12 ? "PM" : "AM"),2);
        (*ret)+=2;
        break;
      case 'a':
        memcpy((*ret),(tm_date->tm_hour>=12 ? "pm" : "am"),2);
        (*ret)+=2;
        break;
      case 'n':
        sprintf(buf,"%d",(tm_date->tm_mon)+1);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 't':
        sprintf(buf,"%d",day_tab[isleap((tm_date->tm_year+YEAR_BASE))][tm_date->tm_mon]);
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'W':
        wd=(tm_date->tm_wday==0 ? 6 : tm_date->tm_wday-1); /* weekday */
        yd=tm_date->tm_yday+1;  /* days since January 1st */

        fd=(7+wd-yd%7+1)%7; /* weekday (1st January) */

        /* week is a last year week (52 or 53) */
        if((yd<=7-fd)&&fd>3){
          wk=((fd==4||(fd==5&&isleap((tm_date->tm_year+YEAR_BASE-1)))) ? 53 : 52);
        }
        /* week is a next year week (1) */
        else if(isleap((tm_date->tm_year+YEAR_BASE))+365-yd<3-wd){
          wk=1;
        }
        /* normal week */
        else{
          wk=(yd+6-wd+fd)/7-(fd>3);
        }

        sprintf(buf,"%d",wk);  /* SAFE */
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 'y':
        sprintf(buf,"%02d",((tm_date->tm_year)%100));
        memcpy((*ret),buf,2);
        (*ret)+=2;
        break;
      case 'z':
        sprintf(buf,"%d",tm_date->tm_yday);
        str_len=strlen(buf);
        memcpy((*ret),buf,str_len);
        (*ret)+=str_len;
        break;
      case 'I':
        sprintf(buf,"%d",tm_date->tm_isdst);
        memcpy((*ret),buf,1);
        ++(*ret);
        break;
      case 'L':
        sprintf(buf,"%d",(isleap((tm_date->tm_year+YEAR_BASE)) ? 1 : 0));
        memcpy((*ret),buf,1);
        ++(*ret);
        break;
      case 'w':
        sprintf(buf,"%d",tm_date->tm_wday);
        memcpy((*ret),buf,1);
        ++(*ret);
        break;
      default:
        *(*ret)=chr;
        ++(*ret);
        break;

    }

    ++cnt;

  }

  (*ret)=ret_tmp;

  return 0;

}

EXAMPLE CODE BELOW

#include <stdio.h>
#include <date.h>

int main(int argc,char **argv){

  char *format="\\suppor\\te\\d \\l\\e\\t\\t\\er\\s : \\Y\\m\\d\\H\\i\\s\\A\\a\\B\\D\\l\\F\\g\\G\\h\\I\\j\\L\\M\\n\\t\\w\\W\\U\\y\\Z \n\\ex\\a\\mp\\l\\e\\s : Y년 m월 d일 (A/a) H시 i분 s초 D l B F g G h I j L M n t w W U y z";
  char *ret=NULL;
  
  date(format,-1,&ret); 

  printf("%s\n",ret);

  free(ret);

  return 0;

}

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.