aboutsummaryrefslogtreecommitdiff
path: root/time2posix.3.txt
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2026-03-02 17:21:42 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2026-03-02 17:21:42 +0000
commitcd59570c180e34a6716c2d61a3047ac2f9407795 (patch)
treeb497c0ef940ed1c5c5bed2fa08b87e03d81b7924 /time2posix.3.txt
parent0d46d875e60091694abe5d38e0cbb4c8019bfd71 (diff)
Diffstat (limited to 'time2posix.3.txt')
-rw-r--r--time2posix.3.txt85
1 files changed, 50 insertions, 35 deletions
diff --git a/time2posix.3.txt b/time2posix.3.txt
index 6b0e0449b816..57556b8789dc 100644
--- a/time2posix.3.txt
+++ b/time2posix.3.txt
@@ -13,10 +13,9 @@ SYNOPSIS
cc ... -ltz
DESCRIPTION
- IEEE Standard 1003.1 (POSIX) requires the time_t value 536457599 to
- stand for 1986-12-31 23:59:59 UTC. This effectively implies that POSIX
- time_t values cannot include leap seconds and, therefore, that the
- system time must be adjusted as each leap occurs.
+ IEEE Standard 1003.1 (POSIX) says that time_t values cannot count leap
+ seconds and, therefore, that the system time must be adjusted as each
+ leap occurs.
If the time package is configured with leap-second support enabled,
however, no such adjustment is needed and time_t values continue to
@@ -24,53 +23,69 @@ DESCRIPTION
means that these values will differ from those required by POSIX by the
net number of leap seconds inserted since the Epoch.
- Typically this is not a problem as the type time_t is intended to be
- (mostly) opaque – time_t values should only be obtained-from and
- passed-to functions such as time(2), localtime(3), mktime(3), and
+ For many C programs this is not a problem as the C standard says that
+ time_t is (mostly) opaque – time_t values should be obtained from and
+ passed to functions such as time(2), localtime(3), mktime(3), and
difftime(3). However, POSIX gives an arithmetic expression for
- directly computing a time_t value from a given date/time, and the same
- relationship is assumed by some (usually older) applications. Any
+ computing a time_t value directly from a given Universal date and time,
+ and the same relationship is assumed by some applications. Any
programs creating/dissecting time_t values using such a relationship
will typically not handle intervals over leap seconds correctly.
- The time2posix and posix2time functions are provided to address this
- time_t mismatch by converting between local time_t values and their
- POSIX equivalents. This is done by accounting for the number of time-
- base changes that would have taken place on a POSIX system as leap
- seconds were inserted or deleted. These converted values can then be
- used in lieu of correcting the older applications, or when
- communicating with POSIX-compliant systems.
+ The time2posix and posix2time functions address this mismatch by
+ converting between local time_t values and their POSIX equivalents.
+ This is done by accounting for the number of time-base changes that
+ would have taken place on a POSIX system as leap seconds were inserted
+ or deleted. These converted values can then be used when communicating
+ with POSIX-compliant systems.
- The time2posix function is single-valued. That is, every local time_t
- corresponds to a single POSIX time_t. The posix2time function is less
- well-behaved: for a positive leap second hit the result is not unique,
- and for a negative leap second hit the corresponding POSIX time_t
- doesn't exist so an adjacent value is returned. Both of these are good
- indicators of the inferiority of the POSIX representation.
+ The time2posix function converts a time_t value to its POSIX
+ counterpart, if one exists. The posix2time function does the reverse
+ but is less well-behaved: for a positive leap second hit the result is
+ not unique, and for a negative leap second hit the corresponding POSIX
+ time_t doesn't exist so an adjacent value is returned. Both of these
+ are indicate problems with the POSIX representation.
The following table summarizes the relationship between a time T and
its conversion to, and back from, the POSIX representation over the
- leap second inserted at the end of June, 1993.
- DATE TIME T X=time2posix(T) posix2time(X)
- 93/06/30 23:59:59 A+0 B+0 A+0
- 93/06/30 23:59:60 A+1 B+1 A+1 or A+2
- 93/07/01 00:00:00 A+2 B+1 A+1 or A+2
- 93/07/01 00:00:01 A+3 B+2 A+3
+ leap second inserted at the end of June, 1993. In this table,
+ X=time2posix(T), Y=posix2time(X), A=741484816, and B=A-17 because 17
+ positive leap seconds preceded this leap second.
- A leap second deletion would look like...
+ DATE TIME T X Y
+ 1993-06-30 23:59:59 A B A
+ 1993-06-30 23:59:60 A+1 B+1 A+1 or A+2
+ 1993-07-01 00:00:00 A+2 B+1 A+1 or A+2
+ 1993-07-01 00:00:01 A+3 B+2 A+3
- DATE TIME T X=time2posix(T) posix2time(X)
- ??/06/30 23:59:58 A+0 B+0 A+0
- ??/07/01 00:00:00 A+1 B+2 A+1
- ??/07/01 00:00:01 A+2 B+3 A+2
+ A leap second deletion would look like the following, and
+ posix2time(B+1) would return either A or A+1.
- [Note: posix2time(B+1) => A+0 or A+1]
+ DATE TIME T X Y
+ ????-06-30 23:59:58 A B A
+ ????-07-01 00:00:00 A+1 B+2 A+1
+ ????-07-01 00:00:01 A+2 B+3 A+2
If leap-second support is not enabled, local time_t and POSIX time_t
values are equivalent, and both time2posix and posix2time degenerate to
the identity function.
+RETURN VALUE
+ If successful, these functions return the resulting timestamp without
+ modifying errno. Otherwise, they set errno and return ((time_t) -1).
+
+ERRORS
+ These functions fail if:
+
+ [EOVERFLOW]
+ The resulting value cannot be represented. This can happen for
+ posix2time if its argument is close to the maximum time_t value.
+ In environments where the TZ environment variable names a TZif
+ file, overflow can happen for either function for an argument
+ sufficiently close to an extreme time_t value if the TZif file
+ specifies unrealistic leap second corrections.
+
SEE ALSO
- difftime(3), localtime(3), mktime(3), time(2)
+ difftime(3), localtime(3), mktime(3), time(2).
Time Zone Database time2posix(3)