11

What is the best way to convert UnixTime to a date?

Is there a function for it or an algorithm?

Cœur
  • 37,241
  • 25
  • 195
  • 267
SuperUser
  • 331
  • 2
  • 6
  • 21

3 Answers3

17

Unix time is seconds since epoch (1970-01-01). Depending on what you mean, you can convert it to a struct tm with localtime or convert it to a string with strftime.

time_t t = time(NULL);
struct tm *tm = localtime(&t);
char date[20];
strftime(date, sizeof(date), "%Y-%m-%d", tm);

As the manual to localtime states

The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.

This is what some refer to as data races. This happens when two or more threads call localtime simultaneously.

To protect from this, some suggest using localtime_s, which is a Microsoft only function. On POSIX systems, you should use localtime_r instead

The localtime_r() function does the same, but stores the data in a user-supplied struct.

Usage would look like

time_t t = time(NULL);
struct tm res;
localtime_r(&t, &res);
Andriy Makukha
  • 7,580
  • 1
  • 38
  • 49
Olaf Dietsche
  • 72,253
  • 8
  • 102
  • 198
  • 1
    Thanks, but compiler says "localtime" is depreceated. Can I simply ignore it and use "#pragma warning(disable:4996)"? – SuperUser Nov 23 '12 at 23:45
  • @Mellnik: See [Are the time functions of MSVC thread-safe?](http://stackoverflow.com/questions/2278919/are-the-time-functions-of-msvc-thread-safe) for more info on that. – Greg Hewgill Nov 23 '12 at 23:49
  • @Mellnik This is new to me. It seems to be a Microsoft Windows issue. In my environment (gcc 4.6.3) there's no such warning. – Olaf Dietsche Nov 23 '12 at 23:55
  • The problem is that localtime() can cause race conditions: http://www.cplusplus.com/reference/ctime/localtime/ On Windows, consider localtime_s() instead (see http://stackoverflow.com/questions/14386923/localtime-vs-localtime-s-and-appropriate-input-arguments). – Bids Oct 28 '16 at 11:43
  • 3
    What if the Epoch time you wish to convert isn't the current time but any other given time (example: 1464545562043 )? – Michael Haephrati Jan 27 '17 at 12:30
  • I don't know, 1464545562043 is *way* beyond the year 2038 (somewhere around 1970 + 46440). But it is still inside the 64 bit limit, so it depends on the implementation (32/64 bit), including any implementation bugs. – Olaf Dietsche Jan 27 '17 at 13:19
2

I'm going to assume you have the time in a time_t. First you need to convert that to a struct tm. You can do this with localtime or gmtime, depending on whether you want to use the local timezone or GMT.

Then you can format that struct tm as a string with strftime. For example, to get a date like 2012-11-24 you'd use the format "%Y-%m-%d".

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
melpomene
  • 84,125
  • 8
  • 85
  • 148
1

See also Convert Unix/Linux time to Windows FILETIME

This function should convert from UnixTime into Windows SYSTEMTIME

SYSTEMTIME intChromeTimeToSysTime(long long int UnixTime)
{
    ULARGE_INTEGER uLarge;
    uLarge.QuadPart = UnixTime;
    FILETIME ftTime;
    ftTime.dwHighDateTime = uLarge.HighPart;
    ftTime.dwLowDateTime = uLarge.LowPart;
    SYSTEMTIME stTime;
    FileTimeToSystemTime(&ftTime, &stTime);
    return stTime;

}
Community
  • 1
  • 1
Michael Haephrati
  • 3,660
  • 1
  • 33
  • 56