2

I've been looking for a way to convert a string (in Epoch time) into a date.

Basically, I need to take this: 1360440555 (in string form) and make it into this: Feb 9 12:09 2013.

I've been looking at strptime and strftime, but neither seems to be working for me. Any suggestions?

Edit: Thanks, guys. I converted it to an int with atoi(), cast it as time_t, then ran ctime() on it. Worked perfectly!

idigyourpast
  • 714
  • 4
  • 12
  • 24

2 Answers2

6

If only you had that value in an integer instead of a string, you could just call ctime. If only there were some way to convert a string to an integer....

time_t c;
c = strtoul( "1360440555", NULL, 0 );
ctime( &c );
William Pursell
  • 204,365
  • 48
  • 270
  • 300
  • +1 for sarcasm. But it gives no help, may be had you asked can you spell strtoul() would have worked better. ctime takes time_t BTW. – jim mcnamara Feb 09 '13 at 23:20
  • Unfortunately, there's no way to convert a string to an integer, since there's no `strtoll()` function in the standard library... –  Feb 09 '13 at 23:20
  • note: in Standard C it's not guaranteed that `time_t` is the seconds since epoch. It is in glibc but IDK about other places. – M.M Dec 01 '14 at 21:28
3

You could use %s (GNU extension), to convert POSIX timestamp given as a string to the broken-down time tm:

#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <time.h>

int main() {
    struct tm tm;
    char buf[255];

    memset(&tm, 0, sizeof(struct tm));
    strptime("1360440555", "%s", &tm);
    strftime(buf, sizeof(buf), "%b %d %H:%M %Y", &tm);
    puts(buf); /* -> Feb 09 20:09 2013 */
    return 0;
}

Note: the local timezone is UTC (with other timezone the result is different).

jfs
  • 399,953
  • 195
  • 994
  • 1,670