Try it yourself with our free Epoch Converter tool — runs entirely in your browser, no signup needed.

How to Convert Unix timestamps in C

How to Convert Unix Timestamps in C

Converting Unix timestamps to human-readable dates is a common task in many C applications. A Unix timestamp is the number of seconds that have elapsed since January 1, 1970, at 00:00:00 UTC. In this article, we will explore how to convert Unix timestamps in C, covering the basics, common edge cases, and performance tips.

Quick Example

Here is a minimal example that converts a Unix timestamp to a human-readable date:

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

int main() {
    time_t timestamp = 1643723400; // February 10, 2022, 14:30:00 UTC
    struct tm* dt;
    char buffer[80];

    dt = gmtime(&timestamp);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", dt);
    printf("%s\n", buffer);

    return 0;
}

This code uses the gmtime function to convert the Unix timestamp to a struct tm object, which represents a broken-down time. The strftime function is then used to format the struct tm object into a human-readable string.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • time_t timestamp = 1643723400; declares a time_t variable and initializes it with a Unix timestamp.
  • struct tm* dt; declares a pointer to a struct tm object.
  • dt = gmtime(&timestamp); converts the Unix timestamp to a struct tm object using the gmtime function. The gmtime function returns a pointer to a static struct tm object, which is why we need to declare a pointer to store the result.
  • char buffer[80]; declares a character array to store the formatted date string.
  • strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", dt); formats the struct tm object into a human-readable string using the strftime function. The format string "%Y-%m-%d %H:%M:%S" specifies the desired format.
  • printf("%s\n", buffer); prints the formatted date string to the console.

Handling Edge Cases

Here are some common edge cases to consider:

Empty/Null Input

If the input timestamp is empty or null, the gmtime function will return a null pointer. We can add a simple null check to handle this case:

if (dt == NULL) {
    printf("Invalid timestamp\n");
    return 1;
}

Invalid Input

If the input timestamp is invalid (e.g., a negative number), the gmtime function will return a null pointer. We can add a simple check to handle this case:

if (timestamp < 0) {
    printf("Invalid timestamp\n");
    return 1;
}

Large Input

If the input timestamp is very large, the gmtime function may return an error. We can use the gmtime_r function instead, which is thread-safe and can handle large timestamps:

struct tm dt;
if (gmtime_r(&timestamp, &dt) == NULL) {
    printf("Invalid timestamp\n");
    return 1;
}

Unicode/Special Characters

If the format string contains Unicode or special characters, the strftime function may not work correctly. We can use the strftime_l function instead, which supports Unicode and special characters:

#include <locale.h>
setlocale(LC_ALL, "");
strftime_l(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &dt, NULL);

Common Mistakes

Here are three common mistakes developers make when converting Unix timestamps in C:

Mistake 1: Using localtime instead of gmtime

The localtime function returns the local time, which may not be what you want. Use gmtime instead to get the UTC time.

Wrong code:

dt = localtime(&timestamp);

Corrected code:

dt = gmtime(&timestamp);

Mistake 2: Not checking for null pointers

The gmtime function may return a null pointer if the input timestamp is invalid. Always check for null pointers before using the result.

Wrong code:

strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", gmtime(&timestamp));

Corrected code:

dt = gmtime(&timestamp);
if (dt == NULL) {
    printf("Invalid timestamp\n");
    return 1;
}
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", dt);

Mistake 3: Not using the correct format string

The format string should match the desired output format. Use the correct format string to avoid incorrect results.

Wrong code:

strftime(buffer, sizeof(buffer), "%Y-%d-%m %H:%M:%S", dt);

Corrected code:

strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", dt);

Performance Tips

Here are three performance tips for converting Unix timestamps in C:

Tip 1: Use gmtime_r instead of gmtime

The gmtime_r function is thread-safe and can handle large timestamps. Use it instead of gmtime for better performance.

Tip 2: Use a buffer size of at least 80 characters

The strftime function requires a buffer size of at least 80 characters to avoid truncation. Use a larger buffer size to avoid errors.

Tip 3: Avoid using localtime

The localtime function is slower than gmtime because it needs to handle time zone conversions. Use gmtime instead for better performance.

FAQ

Q: What is the difference between gmtime and localtime?

A: gmtime returns the UTC time, while localtime returns the local time.

Q: How do I handle invalid timestamps?

A: Check for null pointers and invalid input values before using the result.

Q: Can I use strftime with Unicode format strings?

A: No, use strftime_l instead to support Unicode format strings.

Q: What is the recommended buffer size for strftime?

A: Use a buffer size of at least 80 characters to avoid truncation.

Q: Is gmtime_r thread-safe?

A: Yes, gmtime_r is thread-safe and can handle large timestamps.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp