# Linux - System Time Library Usage Manual > This manual explains how to use the system clock native Linux libraries. [name=Ender Yang][time=Monday, December 22, 2025] [ToC] ## Basics of System Time - Most computer systems use the Unix Timestamp, which counts the number of seconds elapsed since 00:00:00 UTC on January 1, 1970, known as the *Unix Epoch*. - The Unix Timestamp is typically stored as a 32-bit signed integer, with a maximum value of 2,147,483,647 (corresponding to 03:14:07 UTC on January 19, 2038). After this point, the value overflows and becomes negative (-2,147,483,648, corresponding to December 13, 1901), leading to the *Year 2038 problem* (Y2K38). ## How to Use This manual introduces four essential functions from the native Linux library for working with system time: - [`gettimeofday()`](#gettimeofday-Usage): Retrieves the current system time with microsecond precision. It fills [`struct timeval`](#struct-timeval-structure) structure with the number of seconds and microseconds since the Unix Epoch. - [`settimeofday()`](#settimeofday-Usage): Sets the system time and date using [`struct timeval`](#struct-timeval-structure) structures value. This function usually requires superuser privileges. - [`localtime()`](#localtime-Usage): Converts Unix Timestamp (seconds since the Unix Epoch) to human-readable local time, represented as [`struct tm`](#struct-tm-structure) structure. - [`mktime()`](#mktime-Usage): Converts [`struct tm`](#struct-tm-structure) structure representing local time back into Unix Timestamp. ## Structures - This section describes the key data structures used for handling system time in Linux. - These structures are fundamental for manipulating and representing time in C programs on Linux systems. ### `struct tm` structure The `struct tm` structure breaks down a calendar date and time into its components: | Member | Type | Description | Range | |----------|------|-----------------------------|--------| | tm_sec | int | Seconds after the minute | 0–61* | | tm_min | int | Minutes after the hour | 0–59 | | tm_hour | int | Hours since midnight | 0–23 | | tm_mday | int | Day of the month | 1–31 | | tm_mon | int | Months since January | 0–11 | | tm_year | int | Years since 1900 | | | tm_wday | int | Days since Sunday | 0–6 | | tm_yday | int | Days since January 1 | 0–365 | | tm_isdst | int | Daylight Saving Time flag | | \* The range for `tm_sec` can be up to 60 or 61 to account for leap seconds. ### `struct timeval` structure The `struct timeval` structure represents time with microsecond precision: | Member | Type | Description | |----------|-------------|-------------------------------------------| | tv_sec | time_t | Seconds since the Unix Epoch | | tv_usec | suseconds_t | Microseconds past the value in `tv_sec` | --- ## System Time Functions ### `gettimeofday()` Usage Retrieves the current time. ```c #include <sys/time.h> #include <stdio.h> int main() { struct timeval tv; gettimeofday(&tv, NULL); // Get seconds since Unix Epoch printf("Unix Time: %ld (Microseconds: %ld)\n", (long)tv.tv_sec, tv.tv_usec); return 0; } ``` Output example: ```log Unix Time: 1745203454 (Microseconds: 123456) ``` ### `settimeofday()` Usage Sets the system time. Requires root privileges. ```c #include <sys/time.h> #include <stdio.h> #include <errno.h> int main() { struct timeval tv; tv.tv_sec = 1745203454; // Example: set to a specific Unix timestamp tv.tv_usec = 0; // Reset microseconds (Optional) if (settimeofday(&tv, NULL) == 0) { printf("System time updated successfully.\n"); } else { perror("settimeofday"); return 1; } return 0; } ``` Output example: ```log System time updated successfully. ``` If failed to set system time: ```log settimeofday: Operation not permitted ``` ### `localtime()` Usage Converts a Unix Timestamp to local time. ```c #include <sys/time.h> #include <stdio.h> int main() { struct timeval tv; struct tm *t; tv.tv_sec = 1745203454; // Example: set to a specific Unix timestamp t = localtime(&tv.tv_sec); // Converts Unix Timestamp to local time with `struct tm` structure printf("Local Time: %04d/%02d/%02d %02d:%02d:%02d (Unix Time: %ld)\n", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, (long)tv.tv_sec); return 0; } ``` Output example: ```log Local Time: 2025/4/21 02:44:14 (Unix Time: 1745203454) ``` ### `mktime()` Usage Converts a `struct tm` to a Unix Timestamp. ```c #include <sys/time.h> #include <stdio.h> int main() { struct tm t = {0}; // Fill the `struct tm` structure with the desired date and time to convert. t.tm_year = 2025 - 1900; // Example: set to specific year (years since 1900) t.tm_mon = 4 - 1; // April (months since January, 0–11) t.tm_mday = 21; // Month of the day t.tm_hour = 2; // Hour t.tm_min = 44; // Minute t.tm_sec = 14; // Second time_t ts = mktime(&t); // Convert `struct tm` structure to Unix Timestamp printf("Unix Timestamp: %ld\n", ts); return 0; } ``` Output example: ```log Unix Timestamp: 1745203454 ```