xref: /aosp_15_r20/bionic/libc/include/time.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #pragma once
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker /**
32*8d67ca89SAndroid Build Coastguard Worker  * @file time.h
33*8d67ca89SAndroid Build Coastguard Worker  * @brief Clock and timer functionality.
34*8d67ca89SAndroid Build Coastguard Worker  */
35*8d67ca89SAndroid Build Coastguard Worker 
36*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
37*8d67ca89SAndroid Build Coastguard Worker #include <sys/time.h>
38*8d67ca89SAndroid Build Coastguard Worker #include <xlocale.h>
39*8d67ca89SAndroid Build Coastguard Worker 
40*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
41*8d67ca89SAndroid Build Coastguard Worker 
42*8d67ca89SAndroid Build Coastguard Worker /* If we just use void* in the typedef, the compiler exposes that in error messages. */
43*8d67ca89SAndroid Build Coastguard Worker struct __timezone_t;
44*8d67ca89SAndroid Build Coastguard Worker 
45*8d67ca89SAndroid Build Coastguard Worker /**
46*8d67ca89SAndroid Build Coastguard Worker  * The `timezone_t` type that represents a timezone.
47*8d67ca89SAndroid Build Coastguard Worker  *
48*8d67ca89SAndroid Build Coastguard Worker  * To use this with std::unique_ptr you'll want something like
49*8d67ca89SAndroid Build Coastguard Worker  * `std::unique_ptr<std::remove_pointer_t<timezone_t>, decltype(&tzfree)> tz{tzalloc("Asia/Seoul"), tzfree};`
50*8d67ca89SAndroid Build Coastguard Worker  * to remove the pointer.
51*8d67ca89SAndroid Build Coastguard Worker  */
52*8d67ca89SAndroid Build Coastguard Worker typedef struct __timezone_t* timezone_t;
53*8d67ca89SAndroid Build Coastguard Worker 
54*8d67ca89SAndroid Build Coastguard Worker /** Divisor to compute seconds from the result of a call to clock(). */
55*8d67ca89SAndroid Build Coastguard Worker #define CLOCKS_PER_SEC 1000000
56*8d67ca89SAndroid Build Coastguard Worker 
57*8d67ca89SAndroid Build Coastguard Worker /**
58*8d67ca89SAndroid Build Coastguard Worker  * The name of the current timezone's non-daylight savings (`tzname[0]`) and
59*8d67ca89SAndroid Build Coastguard Worker  * daylight savings (`tzname[1]`) variants. See tzset().
60*8d67ca89SAndroid Build Coastguard Worker  */
61*8d67ca89SAndroid Build Coastguard Worker extern char* _Nonnull tzname[];
62*8d67ca89SAndroid Build Coastguard Worker 
63*8d67ca89SAndroid Build Coastguard Worker /** Whether the current timezone ever uses daylight savings time. See tzset(). */
64*8d67ca89SAndroid Build Coastguard Worker extern int daylight;
65*8d67ca89SAndroid Build Coastguard Worker 
66*8d67ca89SAndroid Build Coastguard Worker /** The difference in seconds between UTC and the current timezone. See tzset(). */
67*8d67ca89SAndroid Build Coastguard Worker extern long int timezone;
68*8d67ca89SAndroid Build Coastguard Worker 
69*8d67ca89SAndroid Build Coastguard Worker struct sigevent;
70*8d67ca89SAndroid Build Coastguard Worker 
71*8d67ca89SAndroid Build Coastguard Worker /**
72*8d67ca89SAndroid Build Coastguard Worker  * A "broken-down" time, useful for parsing/formatting times for human consumption.
73*8d67ca89SAndroid Build Coastguard Worker  */
74*8d67ca89SAndroid Build Coastguard Worker struct tm {
75*8d67ca89SAndroid Build Coastguard Worker   /** Seconds, 0-60. (60 is a leap second.) */
76*8d67ca89SAndroid Build Coastguard Worker   int tm_sec;
77*8d67ca89SAndroid Build Coastguard Worker   /** Minutes, 0-59. */
78*8d67ca89SAndroid Build Coastguard Worker   int tm_min;
79*8d67ca89SAndroid Build Coastguard Worker   /** Hours, 0-23. */
80*8d67ca89SAndroid Build Coastguard Worker   int tm_hour;
81*8d67ca89SAndroid Build Coastguard Worker   /** Day of month, 1-31. */
82*8d67ca89SAndroid Build Coastguard Worker   int tm_mday;
83*8d67ca89SAndroid Build Coastguard Worker   /** Month of year, 0-11. (Not 1-12!) */
84*8d67ca89SAndroid Build Coastguard Worker   int tm_mon;
85*8d67ca89SAndroid Build Coastguard Worker   /** Years since 1900. (So 2023 is 123, not 2023!) */
86*8d67ca89SAndroid Build Coastguard Worker   int tm_year;
87*8d67ca89SAndroid Build Coastguard Worker   /** Day of week, 0-6. (Sunday is 0, Saturday is 6.) */
88*8d67ca89SAndroid Build Coastguard Worker   int tm_wday;
89*8d67ca89SAndroid Build Coastguard Worker   /** Day of year, 0-365. */
90*8d67ca89SAndroid Build Coastguard Worker   int tm_yday;
91*8d67ca89SAndroid Build Coastguard Worker   /** Daylight savings flag, positive for DST in effect, 0 for DST not in effect, and -1 for unknown. */
92*8d67ca89SAndroid Build Coastguard Worker   int tm_isdst;
93*8d67ca89SAndroid Build Coastguard Worker   /** Offset from UTC (GMT) in seconds for this time. */
94*8d67ca89SAndroid Build Coastguard Worker   long int tm_gmtoff;
95*8d67ca89SAndroid Build Coastguard Worker   /** Name of the timezone for this time. */
96*8d67ca89SAndroid Build Coastguard Worker   const char* _Nullable tm_zone;
97*8d67ca89SAndroid Build Coastguard Worker };
98*8d67ca89SAndroid Build Coastguard Worker 
99*8d67ca89SAndroid Build Coastguard Worker /** Alternative name for `tm_zone` in `struct tm`. */
100*8d67ca89SAndroid Build Coastguard Worker #define TM_ZONE tm_zone
101*8d67ca89SAndroid Build Coastguard Worker 
102*8d67ca89SAndroid Build Coastguard Worker /**
103*8d67ca89SAndroid Build Coastguard Worker  * [time(2)](https://man7.org/linux/man-pages/man2/time.2.html) returns
104*8d67ca89SAndroid Build Coastguard Worker  * the number of seconds since the Unix epoch (1970-01-01 00:00:00 +0000).
105*8d67ca89SAndroid Build Coastguard Worker  *
106*8d67ca89SAndroid Build Coastguard Worker  * Returns the time in seconds on success, and returns -1 and sets `errno` on failure.
107*8d67ca89SAndroid Build Coastguard Worker  */
108*8d67ca89SAndroid Build Coastguard Worker time_t time(time_t* _Nullable __t);
109*8d67ca89SAndroid Build Coastguard Worker 
110*8d67ca89SAndroid Build Coastguard Worker /**
111*8d67ca89SAndroid Build Coastguard Worker  * [nanosleep(2)](https://man7.org/linux/man-pages/man2/nanosleep.2.html) sleeps
112*8d67ca89SAndroid Build Coastguard Worker  * for at least the given time (or until a signal arrives).
113*8d67ca89SAndroid Build Coastguard Worker  *
114*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and sets `errno` on failure. If the sleep
115*8d67ca89SAndroid Build Coastguard Worker  * was interrupted by a signal, `errno` will be `EINTR` and `remainder` will be
116*8d67ca89SAndroid Build Coastguard Worker  * the amount of time remaining.
117*8d67ca89SAndroid Build Coastguard Worker  */
118*8d67ca89SAndroid Build Coastguard Worker int nanosleep(const struct timespec* _Nonnull __duration, struct timespec* _Nullable __remainder);
119*8d67ca89SAndroid Build Coastguard Worker 
120*8d67ca89SAndroid Build Coastguard Worker /**
121*8d67ca89SAndroid Build Coastguard Worker  * [asctime(3)](https://man7.org/linux/man-pages/man3/asctime.3p.html) formats
122*8d67ca89SAndroid Build Coastguard Worker  * the time `tm` as a string.
123*8d67ca89SAndroid Build Coastguard Worker  *
124*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a string on success, and returns NULL on failure.
125*8d67ca89SAndroid Build Coastguard Worker  *
126*8d67ca89SAndroid Build Coastguard Worker  * That string will be overwritten by later calls to this function.
127*8d67ca89SAndroid Build Coastguard Worker  *
128*8d67ca89SAndroid Build Coastguard Worker  * New code should prefer strftime().
129*8d67ca89SAndroid Build Coastguard Worker  */
130*8d67ca89SAndroid Build Coastguard Worker char* _Nullable asctime(const struct tm* _Nonnull __tm);
131*8d67ca89SAndroid Build Coastguard Worker 
132*8d67ca89SAndroid Build Coastguard Worker /**
133*8d67ca89SAndroid Build Coastguard Worker  * [asctime_r(3)](https://man7.org/linux/man-pages/man3/asctime_r.3p.html) formats
134*8d67ca89SAndroid Build Coastguard Worker  * the time `tm` as a string in the given buffer `buf`.
135*8d67ca89SAndroid Build Coastguard Worker  *
136*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a string on success, and returns NULL on failure.
137*8d67ca89SAndroid Build Coastguard Worker  *
138*8d67ca89SAndroid Build Coastguard Worker  * New code should prefer strftime().
139*8d67ca89SAndroid Build Coastguard Worker  */
140*8d67ca89SAndroid Build Coastguard Worker char* _Nullable asctime_r(const struct tm* _Nonnull __tm, char* _Nonnull __buf);
141*8d67ca89SAndroid Build Coastguard Worker 
142*8d67ca89SAndroid Build Coastguard Worker /**
143*8d67ca89SAndroid Build Coastguard Worker  * [difftime(3)](https://man7.org/linux/man-pages/man3/difftime.3.html) returns
144*8d67ca89SAndroid Build Coastguard Worker  * the difference between two times.
145*8d67ca89SAndroid Build Coastguard Worker  *
146*8d67ca89SAndroid Build Coastguard Worker  * Returns the difference in seconds.
147*8d67ca89SAndroid Build Coastguard Worker  */
148*8d67ca89SAndroid Build Coastguard Worker double difftime(time_t __lhs, time_t __rhs);
149*8d67ca89SAndroid Build Coastguard Worker 
150*8d67ca89SAndroid Build Coastguard Worker /**
151*8d67ca89SAndroid Build Coastguard Worker  * [mktime(3)](https://man7.org/linux/man-pages/man3/mktime.3p.html) converts
152*8d67ca89SAndroid Build Coastguard Worker  * broken-down time `tm` into the number of seconds since the Unix epoch.
153*8d67ca89SAndroid Build Coastguard Worker  *
154*8d67ca89SAndroid Build Coastguard Worker  * See tzset() for details of how the timezone is set, and mktime_rz()
155*8d67ca89SAndroid Build Coastguard Worker  * for an alternative.
156*8d67ca89SAndroid Build Coastguard Worker  *
157*8d67ca89SAndroid Build Coastguard Worker  * Returns the time in seconds on success, and returns -1 and sets `errno` on failure.
158*8d67ca89SAndroid Build Coastguard Worker  */
159*8d67ca89SAndroid Build Coastguard Worker time_t mktime(struct tm* _Nonnull __tm);
160*8d67ca89SAndroid Build Coastguard Worker 
161*8d67ca89SAndroid Build Coastguard Worker /**
162*8d67ca89SAndroid Build Coastguard Worker  * mktime_z(3) converts broken-down time `tm` into the number of seconds
163*8d67ca89SAndroid Build Coastguard Worker  * since the Unix epoch, assuming the given timezone.
164*8d67ca89SAndroid Build Coastguard Worker  *
165*8d67ca89SAndroid Build Coastguard Worker  * Returns the time in seconds on success, and returns -1 and sets `errno` on failure.
166*8d67ca89SAndroid Build Coastguard Worker  *
167*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
168*8d67ca89SAndroid Build Coastguard Worker  */
169*8d67ca89SAndroid Build Coastguard Worker 
170*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35)
171*8d67ca89SAndroid Build Coastguard Worker time_t mktime_z(timezone_t _Nonnull __tz, struct tm* _Nonnull __tm) __INTRODUCED_IN(35);
172*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */
173*8d67ca89SAndroid Build Coastguard Worker 
174*8d67ca89SAndroid Build Coastguard Worker 
175*8d67ca89SAndroid Build Coastguard Worker /**
176*8d67ca89SAndroid Build Coastguard Worker  * [localtime(3)](https://man7.org/linux/man-pages/man3/localtime.3p.html) converts
177*8d67ca89SAndroid Build Coastguard Worker  * the number of seconds since the Unix epoch in `t` to a broken-down time, taking
178*8d67ca89SAndroid Build Coastguard Worker  * the device's timezone into account.
179*8d67ca89SAndroid Build Coastguard Worker  *
180*8d67ca89SAndroid Build Coastguard Worker  * That broken-down time will be overwritten by later calls to this function.
181*8d67ca89SAndroid Build Coastguard Worker  *
182*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure.
183*8d67ca89SAndroid Build Coastguard Worker  */
184*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable localtime(const time_t* _Nonnull __t);
185*8d67ca89SAndroid Build Coastguard Worker 
186*8d67ca89SAndroid Build Coastguard Worker /**
187*8d67ca89SAndroid Build Coastguard Worker  * [localtime_r(3)](https://man7.org/linux/man-pages/man3/localtime_r.3p.html) converts
188*8d67ca89SAndroid Build Coastguard Worker  * the number of seconds since the Unix epoch in `t` to a broken-down time.
189*8d67ca89SAndroid Build Coastguard Worker  * That broken-down time will be written to the given struct `tm`.
190*8d67ca89SAndroid Build Coastguard Worker  *
191*8d67ca89SAndroid Build Coastguard Worker  * See tzset() for details of how the timezone is set, and localtime_rz()
192*8d67ca89SAndroid Build Coastguard Worker  * for an alternative.
193*8d67ca89SAndroid Build Coastguard Worker  *
194*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure.
195*8d67ca89SAndroid Build Coastguard Worker  */
196*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable localtime_r(const time_t* _Nonnull __t, struct tm* _Nonnull __tm);
197*8d67ca89SAndroid Build Coastguard Worker 
198*8d67ca89SAndroid Build Coastguard Worker /**
199*8d67ca89SAndroid Build Coastguard Worker  * localtime_rz(3) converts the number of seconds since the Unix epoch in
200*8d67ca89SAndroid Build Coastguard Worker  * `t` to a broken-down time, assuming the given timezone. That broken-down
201*8d67ca89SAndroid Build Coastguard Worker  * time will be written to the given struct `tm`.
202*8d67ca89SAndroid Build Coastguard Worker  *
203*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure.
204*8d67ca89SAndroid Build Coastguard Worker  *
205*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
206*8d67ca89SAndroid Build Coastguard Worker  */
207*8d67ca89SAndroid Build Coastguard Worker 
208*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35)
209*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable localtime_rz(timezone_t _Nonnull __tz, const time_t* _Nonnull __t, struct tm* _Nonnull __tm) __INTRODUCED_IN(35);
210*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */
211*8d67ca89SAndroid Build Coastguard Worker 
212*8d67ca89SAndroid Build Coastguard Worker 
213*8d67ca89SAndroid Build Coastguard Worker /**
214*8d67ca89SAndroid Build Coastguard Worker  * Inverse of localtime().
215*8d67ca89SAndroid Build Coastguard Worker  */
216*8d67ca89SAndroid Build Coastguard Worker time_t timelocal(struct tm* _Nonnull __tm);
217*8d67ca89SAndroid Build Coastguard Worker 
218*8d67ca89SAndroid Build Coastguard Worker /**
219*8d67ca89SAndroid Build Coastguard Worker  * [gmtime(3)](https://man7.org/linux/man-pages/man3/gmtime.3p.html) converts
220*8d67ca89SAndroid Build Coastguard Worker  * the number of seconds since the Unix epoch in `t` to a broken-down time, using
221*8d67ca89SAndroid Build Coastguard Worker  * UTC (historically also known as GMT).
222*8d67ca89SAndroid Build Coastguard Worker  *
223*8d67ca89SAndroid Build Coastguard Worker  * That broken-down time will be overwritten by later calls to this function.
224*8d67ca89SAndroid Build Coastguard Worker  *
225*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure.
226*8d67ca89SAndroid Build Coastguard Worker  */
227*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable gmtime(const time_t* _Nonnull __t);
228*8d67ca89SAndroid Build Coastguard Worker 
229*8d67ca89SAndroid Build Coastguard Worker /**
230*8d67ca89SAndroid Build Coastguard Worker  * [gmtime_r(3)](https://man7.org/linux/man-pages/man3/gmtime_r.3p.html) converts
231*8d67ca89SAndroid Build Coastguard Worker  * the number of seconds since the Unix epoch in `t` to a broken-down time, using
232*8d67ca89SAndroid Build Coastguard Worker  * UTC (historically also known as GMT).
233*8d67ca89SAndroid Build Coastguard Worker  *
234*8d67ca89SAndroid Build Coastguard Worker  * That broken-down time will be written to the provided struct `tm`.
235*8d67ca89SAndroid Build Coastguard Worker  *
236*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure.
237*8d67ca89SAndroid Build Coastguard Worker  */
238*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable gmtime_r(const time_t* _Nonnull __t, struct tm* _Nonnull __tm);
239*8d67ca89SAndroid Build Coastguard Worker 
240*8d67ca89SAndroid Build Coastguard Worker /**
241*8d67ca89SAndroid Build Coastguard Worker  * Inverse of gmtime().
242*8d67ca89SAndroid Build Coastguard Worker  */
243*8d67ca89SAndroid Build Coastguard Worker time_t timegm(struct tm* _Nonnull __tm);
244*8d67ca89SAndroid Build Coastguard Worker 
245*8d67ca89SAndroid Build Coastguard Worker /**
246*8d67ca89SAndroid Build Coastguard Worker  * [strptime(3)](https://man7.org/linux/man-pages/man3/strptime.3.html) parses
247*8d67ca89SAndroid Build Coastguard Worker  * a string `s` assuming format `fmt` into broken-down time `tm`.
248*8d67ca89SAndroid Build Coastguard Worker  *
249*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the first character _not_ parsed, or null if no characters were parsed.
250*8d67ca89SAndroid Build Coastguard Worker  */
251*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strptime(const char* _Nonnull __s, const char* _Nonnull __fmt, struct tm* _Nonnull __tm) __strftimelike(2);
252*8d67ca89SAndroid Build Coastguard Worker 
253*8d67ca89SAndroid Build Coastguard Worker /**
254*8d67ca89SAndroid Build Coastguard Worker  * Equivalent to strptime() on Android where only C/POSIX locales are available.
255*8d67ca89SAndroid Build Coastguard Worker  */
256*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strptime_l(const char* _Nonnull __s, const char* _Nonnull __fmt, struct tm* _Nonnull __tm, locale_t _Nonnull __l) __strftimelike(2) __RENAME(strptime);
257*8d67ca89SAndroid Build Coastguard Worker 
258*8d67ca89SAndroid Build Coastguard Worker /**
259*8d67ca89SAndroid Build Coastguard Worker  * [strftime(3)](https://man7.org/linux/man-pages/man3/strftime.3.html) formats
260*8d67ca89SAndroid Build Coastguard Worker  * a broken-down time `tm` into the buffer `buf` using format `fmt`.
261*8d67ca89SAndroid Build Coastguard Worker  *
262*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the first character _not_ parsed, or null if no characters were parsed.
263*8d67ca89SAndroid Build Coastguard Worker  */
264*8d67ca89SAndroid Build Coastguard Worker size_t strftime(char* _Nonnull __buf, size_t __n, const char* _Nonnull __fmt, const struct tm* _Nullable __tm) __strftimelike(3);
265*8d67ca89SAndroid Build Coastguard Worker 
266*8d67ca89SAndroid Build Coastguard Worker /**
267*8d67ca89SAndroid Build Coastguard Worker  * Equivalent to strftime() on Android where only C/POSIX locales are available.
268*8d67ca89SAndroid Build Coastguard Worker  */
269*8d67ca89SAndroid Build Coastguard Worker size_t strftime_l(char* _Nonnull __buf, size_t __n, const char* _Nonnull __fmt, const struct tm* _Nullable __tm, locale_t _Nonnull __l) __strftimelike(3);
270*8d67ca89SAndroid Build Coastguard Worker 
271*8d67ca89SAndroid Build Coastguard Worker /**
272*8d67ca89SAndroid Build Coastguard Worker  * [ctime(3)](https://man7.org/linux/man-pages/man3/ctime.3p.html) formats
273*8d67ca89SAndroid Build Coastguard Worker  * the time `tm` as a string.
274*8d67ca89SAndroid Build Coastguard Worker  *
275*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a string on success, and returns NULL on failure.
276*8d67ca89SAndroid Build Coastguard Worker  *
277*8d67ca89SAndroid Build Coastguard Worker  * That string will be overwritten by later calls to this function.
278*8d67ca89SAndroid Build Coastguard Worker  *
279*8d67ca89SAndroid Build Coastguard Worker  * New code should prefer strftime().
280*8d67ca89SAndroid Build Coastguard Worker  */
281*8d67ca89SAndroid Build Coastguard Worker char* _Nullable ctime(const time_t* _Nonnull __t);
282*8d67ca89SAndroid Build Coastguard Worker 
283*8d67ca89SAndroid Build Coastguard Worker /**
284*8d67ca89SAndroid Build Coastguard Worker  * [ctime_r(3)](https://man7.org/linux/man-pages/man3/ctime.3p.html) formats
285*8d67ca89SAndroid Build Coastguard Worker  * the time `tm` as a string in the given buffer `buf`.
286*8d67ca89SAndroid Build Coastguard Worker  *
287*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to a string on success, and returns NULL on failure.
288*8d67ca89SAndroid Build Coastguard Worker  *
289*8d67ca89SAndroid Build Coastguard Worker  * New code should prefer strftime().
290*8d67ca89SAndroid Build Coastguard Worker  */
291*8d67ca89SAndroid Build Coastguard Worker char* _Nullable ctime_r(const time_t* _Nonnull __t, char* _Nonnull __buf);
292*8d67ca89SAndroid Build Coastguard Worker 
293*8d67ca89SAndroid Build Coastguard Worker /**
294*8d67ca89SAndroid Build Coastguard Worker  * [tzset(3)](https://man7.org/linux/man-pages/man3/tzset.3.html) tells
295*8d67ca89SAndroid Build Coastguard Worker  * libc that the timezone has changed.
296*8d67ca89SAndroid Build Coastguard Worker  *
297*8d67ca89SAndroid Build Coastguard Worker  * tzset() on Android looks at both the system property
298*8d67ca89SAndroid Build Coastguard Worker  * `persist.sys.timezone` and the environment variable `TZ`. The former is
299*8d67ca89SAndroid Build Coastguard Worker  * the device's current timezone as shown in Settings, while the latter is
300*8d67ca89SAndroid Build Coastguard Worker  * usually unset but can be used to override the global setting. This is a
301*8d67ca89SAndroid Build Coastguard Worker  * bad idea outside of unit tests or single-threaded programs because it's
302*8d67ca89SAndroid Build Coastguard Worker  * inherently thread-unsafe. See tzalloc(), localtime_rz(), mktime_z(),
303*8d67ca89SAndroid Build Coastguard Worker  * and tzfree() for an alternative.
304*8d67ca89SAndroid Build Coastguard Worker  */
305*8d67ca89SAndroid Build Coastguard Worker void tzset(void);
306*8d67ca89SAndroid Build Coastguard Worker 
307*8d67ca89SAndroid Build Coastguard Worker /**
308*8d67ca89SAndroid Build Coastguard Worker  * tzalloc(3) allocates a timezone corresponding to the given Olson ID.
309*8d67ca89SAndroid Build Coastguard Worker  *
310*8d67ca89SAndroid Build Coastguard Worker  * A null `id` returns the system timezone (as seen in Settings) from
311*8d67ca89SAndroid Build Coastguard Worker  * the system property `persist.sys.timezone`, ignoring `$TZ`. Although
312*8d67ca89SAndroid Build Coastguard Worker  * tzset() honors `$TZ`, callers of tzalloc() can use `$TZ` themselves if
313*8d67ca89SAndroid Build Coastguard Worker  * that's the (thread-unsafe) behavior they want, but by ignoring `$TZ`
314*8d67ca89SAndroid Build Coastguard Worker  * tzalloc() is thread safe (though obviously the system timezone can
315*8d67ca89SAndroid Build Coastguard Worker  * change, especially if your mobile device is actually mobile!).
316*8d67ca89SAndroid Build Coastguard Worker  *
317*8d67ca89SAndroid Build Coastguard Worker  * To use this with std::unique_ptr you'll want something like
318*8d67ca89SAndroid Build Coastguard Worker  * `std::unique_ptr<std::remove_pointer_t<timezone_t>, decltype(&tzfree)> tz{tzalloc("Asia/Seoul"), tzfree};`
319*8d67ca89SAndroid Build Coastguard Worker  * to remove the pointer.
320*8d67ca89SAndroid Build Coastguard Worker  *
321*8d67ca89SAndroid Build Coastguard Worker  * Returns a timezone object on success, and returns NULL and sets `errno` on failure.
322*8d67ca89SAndroid Build Coastguard Worker  *
323*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
324*8d67ca89SAndroid Build Coastguard Worker  */
325*8d67ca89SAndroid Build Coastguard Worker 
326*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35)
327*8d67ca89SAndroid Build Coastguard Worker timezone_t _Nullable tzalloc(const char* _Nullable __id) __INTRODUCED_IN(35);
328*8d67ca89SAndroid Build Coastguard Worker 
329*8d67ca89SAndroid Build Coastguard Worker /**
330*8d67ca89SAndroid Build Coastguard Worker  * tzfree(3) frees a timezone object returned by tzalloc().
331*8d67ca89SAndroid Build Coastguard Worker  *
332*8d67ca89SAndroid Build Coastguard Worker  * To use this with std::unique_ptr you'll want something like
333*8d67ca89SAndroid Build Coastguard Worker  * `std::unique_ptr<std::remove_pointer_t<timezone_t>, decltype(&tzfree)> tz{tzalloc("Asia/Seoul"), tzfree};`
334*8d67ca89SAndroid Build Coastguard Worker  * to remove the pointer.
335*8d67ca89SAndroid Build Coastguard Worker  *
336*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
337*8d67ca89SAndroid Build Coastguard Worker  */
338*8d67ca89SAndroid Build Coastguard Worker void tzfree(timezone_t _Nullable __tz) __INTRODUCED_IN(35);
339*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */
340*8d67ca89SAndroid Build Coastguard Worker 
341*8d67ca89SAndroid Build Coastguard Worker 
342*8d67ca89SAndroid Build Coastguard Worker /**
343*8d67ca89SAndroid Build Coastguard Worker  * [clock(3)](https://man7.org/linux/man-pages/man3/clock.3.html)
344*8d67ca89SAndroid Build Coastguard Worker  * returns an approximation of CPU time used, equivalent to
345*8d67ca89SAndroid Build Coastguard Worker  * `clock_gettime(CLOCK_PROCESS_CPUTIME_ID)` but with more confusing
346*8d67ca89SAndroid Build Coastguard Worker  * units. Use `CLOCKS_PER_SEC` to convert the result to seconds.
347*8d67ca89SAndroid Build Coastguard Worker  *
348*8d67ca89SAndroid Build Coastguard Worker  * Returns the time in seconds on success, and returns -1 and sets `errno` on failure.
349*8d67ca89SAndroid Build Coastguard Worker  *
350*8d67ca89SAndroid Build Coastguard Worker  * New code should prefer `clock_gettime(CLOCK_PROCESS_CPUTIME_ID)`.
351*8d67ca89SAndroid Build Coastguard Worker  */
352*8d67ca89SAndroid Build Coastguard Worker clock_t clock(void);
353*8d67ca89SAndroid Build Coastguard Worker 
354*8d67ca89SAndroid Build Coastguard Worker /**
355*8d67ca89SAndroid Build Coastguard Worker  * [clock_getcpuclockid(3)](https://man7.org/linux/man-pages/man3/clock_getcpuclockid.3.html)
356*8d67ca89SAndroid Build Coastguard Worker  * gets the clock ID of the cpu-time clock for the given `pid`.
357*8d67ca89SAndroid Build Coastguard Worker  *
358*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and returns an error number on failure.
359*8d67ca89SAndroid Build Coastguard Worker  */
360*8d67ca89SAndroid Build Coastguard Worker 
361*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
362*8d67ca89SAndroid Build Coastguard Worker int clock_getcpuclockid(pid_t __pid, clockid_t* _Nonnull __clock) __INTRODUCED_IN(23);
363*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
364*8d67ca89SAndroid Build Coastguard Worker 
365*8d67ca89SAndroid Build Coastguard Worker 
366*8d67ca89SAndroid Build Coastguard Worker /**
367*8d67ca89SAndroid Build Coastguard Worker  * [clock_getres(2)](https://man7.org/linux/man-pages/man2/clock_getres.2.html)
368*8d67ca89SAndroid Build Coastguard Worker  * gets the resolution of the given clock.
369*8d67ca89SAndroid Build Coastguard Worker  *
370*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and returns an error number on failure.
371*8d67ca89SAndroid Build Coastguard Worker  */
372*8d67ca89SAndroid Build Coastguard Worker int clock_getres(clockid_t __clock, struct timespec* _Nullable __resolution);
373*8d67ca89SAndroid Build Coastguard Worker 
374*8d67ca89SAndroid Build Coastguard Worker /**
375*8d67ca89SAndroid Build Coastguard Worker  * [clock_gettime(2)](https://man7.org/linux/man-pages/man2/clock_gettime.2.html)
376*8d67ca89SAndroid Build Coastguard Worker  * gets the time according to the given clock.
377*8d67ca89SAndroid Build Coastguard Worker  *
378*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and returns an error number on failure.
379*8d67ca89SAndroid Build Coastguard Worker  */
380*8d67ca89SAndroid Build Coastguard Worker int clock_gettime(clockid_t __clock, struct timespec* _Nonnull __ts);
381*8d67ca89SAndroid Build Coastguard Worker 
382*8d67ca89SAndroid Build Coastguard Worker /**
383*8d67ca89SAndroid Build Coastguard Worker  * [clock_nanosleep(2)](https://man7.org/linux/man-pages/man2/clock_nanosleep.2.html)
384*8d67ca89SAndroid Build Coastguard Worker  * sleeps for the given time (or until the given time if the TIMER_ABSTIME flag
385*8d67ca89SAndroid Build Coastguard Worker  * is used), as measured by the given clock.
386*8d67ca89SAndroid Build Coastguard Worker  *
387*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and returns an error number on failure.
388*8d67ca89SAndroid Build Coastguard Worker  * If the sleep was interrupted by a signal, the return value will be `EINTR`
389*8d67ca89SAndroid Build Coastguard Worker  * and `remainder` will be the amount of time remaining.
390*8d67ca89SAndroid Build Coastguard Worker  */
391*8d67ca89SAndroid Build Coastguard Worker int clock_nanosleep(clockid_t __clock, int __flags, const struct timespec* _Nonnull __time, struct timespec* _Nullable __remainder);
392*8d67ca89SAndroid Build Coastguard Worker 
393*8d67ca89SAndroid Build Coastguard Worker /**
394*8d67ca89SAndroid Build Coastguard Worker  * [clock_settime(2)](https://man7.org/linux/man-pages/man2/clock_settime.2.html)
395*8d67ca89SAndroid Build Coastguard Worker  * sets the time for the given clock.
396*8d67ca89SAndroid Build Coastguard Worker  *
397*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and returns an error number on failure.
398*8d67ca89SAndroid Build Coastguard Worker  */
399*8d67ca89SAndroid Build Coastguard Worker int clock_settime(clockid_t __clock, const struct timespec* _Nonnull __ts);
400*8d67ca89SAndroid Build Coastguard Worker 
401*8d67ca89SAndroid Build Coastguard Worker /**
402*8d67ca89SAndroid Build Coastguard Worker  * [timer_create(2)](https://man7.org/linux/man-pages/man2/timer_create.2.html)
403*8d67ca89SAndroid Build Coastguard Worker  * creates a POSIX timer.
404*8d67ca89SAndroid Build Coastguard Worker  *
405*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and sets `errno` on failure.
406*8d67ca89SAndroid Build Coastguard Worker  */
407*8d67ca89SAndroid Build Coastguard Worker int timer_create(clockid_t __clock, struct sigevent* _Nullable __event, timer_t _Nonnull * _Nonnull __timer_ptr);
408*8d67ca89SAndroid Build Coastguard Worker 
409*8d67ca89SAndroid Build Coastguard Worker /**
410*8d67ca89SAndroid Build Coastguard Worker  * [timer_delete(2)](https://man7.org/linux/man-pages/man2/timer_delete.2.html)
411*8d67ca89SAndroid Build Coastguard Worker  * destroys a POSIX timer.
412*8d67ca89SAndroid Build Coastguard Worker  *
413*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and sets `errno` on failure.
414*8d67ca89SAndroid Build Coastguard Worker  */
415*8d67ca89SAndroid Build Coastguard Worker int timer_delete(timer_t _Nonnull __timer);
416*8d67ca89SAndroid Build Coastguard Worker 
417*8d67ca89SAndroid Build Coastguard Worker /**
418*8d67ca89SAndroid Build Coastguard Worker  * [timer_settime(2)](https://man7.org/linux/man-pages/man2/timer_settime.2.html)
419*8d67ca89SAndroid Build Coastguard Worker  * starts or stops a POSIX timer.
420*8d67ca89SAndroid Build Coastguard Worker  *
421*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and sets `errno` on failure.
422*8d67ca89SAndroid Build Coastguard Worker  */
423*8d67ca89SAndroid Build Coastguard Worker int timer_settime(timer_t _Nonnull __timer, int __flags, const struct itimerspec* _Nonnull __new_value, struct itimerspec* _Nullable __old_value);
424*8d67ca89SAndroid Build Coastguard Worker 
425*8d67ca89SAndroid Build Coastguard Worker /**
426*8d67ca89SAndroid Build Coastguard Worker  * [timer_gettime(2)](https://man7.org/linux/man-pages/man2/timer_gettime.2.html)
427*8d67ca89SAndroid Build Coastguard Worker  * gets the time until the given timer next fires.
428*8d67ca89SAndroid Build Coastguard Worker  *
429*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns -1 and sets `errno` on failure.
430*8d67ca89SAndroid Build Coastguard Worker  */
431*8d67ca89SAndroid Build Coastguard Worker int timer_gettime(timer_t _Nonnull _timer, struct itimerspec* _Nonnull __ts);
432*8d67ca89SAndroid Build Coastguard Worker 
433*8d67ca89SAndroid Build Coastguard Worker /**
434*8d67ca89SAndroid Build Coastguard Worker  * [timer_getoverrun(2)](https://man7.org/linux/man-pages/man2/timer_getoverrun.2.html)
435*8d67ca89SAndroid Build Coastguard Worker  * gets the overrun count (the number of times the timer should have fired, but
436*8d67ca89SAndroid Build Coastguard Worker  * didn't) for the last time the timer fired.
437*8d67ca89SAndroid Build Coastguard Worker  *
438*8d67ca89SAndroid Build Coastguard Worker  * Returns the overrun count on success, and returns -1 and sets `errno` on failure.
439*8d67ca89SAndroid Build Coastguard Worker  */
440*8d67ca89SAndroid Build Coastguard Worker int timer_getoverrun(timer_t _Nonnull __timer);
441*8d67ca89SAndroid Build Coastguard Worker 
442*8d67ca89SAndroid Build Coastguard Worker /**
443*8d67ca89SAndroid Build Coastguard Worker  * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_REALTIME.
444*8d67ca89SAndroid Build Coastguard Worker  *
445*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 29.
446*8d67ca89SAndroid Build Coastguard Worker  */
447*8d67ca89SAndroid Build Coastguard Worker #define TIME_UTC (CLOCK_REALTIME+1)
448*8d67ca89SAndroid Build Coastguard Worker 
449*8d67ca89SAndroid Build Coastguard Worker /**
450*8d67ca89SAndroid Build Coastguard Worker  * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_MONOTONIC.
451*8d67ca89SAndroid Build Coastguard Worker  *
452*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
453*8d67ca89SAndroid Build Coastguard Worker  */
454*8d67ca89SAndroid Build Coastguard Worker #define TIME_MONOTONIC (CLOCK_MONOTONIC+1)
455*8d67ca89SAndroid Build Coastguard Worker 
456*8d67ca89SAndroid Build Coastguard Worker /**
457*8d67ca89SAndroid Build Coastguard Worker  * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_PROCESS_CPUTIME_ID.
458*8d67ca89SAndroid Build Coastguard Worker  *
459*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
460*8d67ca89SAndroid Build Coastguard Worker  */
461*8d67ca89SAndroid Build Coastguard Worker #define TIME_ACTIVE (CLOCK_PROCESS_CPUTIME_ID+1)
462*8d67ca89SAndroid Build Coastguard Worker 
463*8d67ca89SAndroid Build Coastguard Worker /**
464*8d67ca89SAndroid Build Coastguard Worker  * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_THREAD_CPUTIME_ID.
465*8d67ca89SAndroid Build Coastguard Worker  *
466*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
467*8d67ca89SAndroid Build Coastguard Worker  */
468*8d67ca89SAndroid Build Coastguard Worker #define TIME_THREAD_ACTIVE (CLOCK_THREAD_CPUTIME_ID+1)
469*8d67ca89SAndroid Build Coastguard Worker 
470*8d67ca89SAndroid Build Coastguard Worker /**
471*8d67ca89SAndroid Build Coastguard Worker  * timespec_get(3) is equivalent to clock_gettime() for the clock corresponding to the given base.
472*8d67ca89SAndroid Build Coastguard Worker  *
473*8d67ca89SAndroid Build Coastguard Worker  * Returns the base on success and returns 0 on failure.
474*8d67ca89SAndroid Build Coastguard Worker  *
475*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 29 for TIME_UTC; other bases arrived later.
476*8d67ca89SAndroid Build Coastguard Worker  * Code for Android should prefer clock_gettime().
477*8d67ca89SAndroid Build Coastguard Worker  */
478*8d67ca89SAndroid Build Coastguard Worker 
479*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(29)
480*8d67ca89SAndroid Build Coastguard Worker int timespec_get(struct timespec* _Nonnull __ts, int __base) __INTRODUCED_IN(29);
481*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(29) */
482*8d67ca89SAndroid Build Coastguard Worker 
483*8d67ca89SAndroid Build Coastguard Worker 
484*8d67ca89SAndroid Build Coastguard Worker /**
485*8d67ca89SAndroid Build Coastguard Worker  * timespec_getres(3) is equivalent to clock_getres() for the clock corresponding to the given base.
486*8d67ca89SAndroid Build Coastguard Worker  *
487*8d67ca89SAndroid Build Coastguard Worker  * Returns the base on success and returns 0 on failure.
488*8d67ca89SAndroid Build Coastguard Worker  *
489*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 35.
490*8d67ca89SAndroid Build Coastguard Worker  * Code for Android should prefer clock_gettime().
491*8d67ca89SAndroid Build Coastguard Worker  */
492*8d67ca89SAndroid Build Coastguard Worker 
493*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35)
494*8d67ca89SAndroid Build Coastguard Worker int timespec_getres(struct timespec* _Nonnull __ts, int __base) __INTRODUCED_IN(35);
495*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */
496*8d67ca89SAndroid Build Coastguard Worker 
497*8d67ca89SAndroid Build Coastguard Worker 
498*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
499