blob: 16f4f6d95dd8823e5cb979a590faa4cfda631727 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Time module */
2
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00003#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00004
Guido van Rossum87ce7bb1998-06-09 16:30:31 +00005#include <ctype.h>
6
Victor Stinnerec895392012-04-29 02:41:27 +02007#ifdef HAVE_SYS_TIMES_H
8#include <sys/times.h>
9#endif
10
Thomas Wouters0e3f5912006-08-11 14:57:12 +000011#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#include <sys/types.h>
Victor Stinnerec895392012-04-29 02:41:27 +020013#endif
14
15#if defined(HAVE_SYS_RESOURCE_H)
16#include <sys/resource.h>
17#endif
Guido van Rossum6d946f91992-08-14 13:49:30 +000018
Guido van Rossumb6775db1994-08-01 11:34:53 +000019#ifdef QUICKWIN
20#include <io.h>
21#endif
22
Guido van Rossum7bf22de1997-12-02 20:34:19 +000023#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000024#include <i86.h>
25#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000026#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000027#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000028#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000029#include "pythread.h"
30
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000031#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000032/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000033#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000034#define tzname _tzname
35#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000036#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000037#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000038#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000039
40/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000041static int floatsleep(double);
Victor Stinnerec895392012-04-29 02:41:27 +020042static PyObject* floattime(_Py_clock_info_t *info);
43
44#ifdef MS_WINDOWS
45static OSVERSIONINFOEX winver;
46#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000048static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +010049time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050{
Victor Stinnerec895392012-04-29 02:41:27 +020051 return floattime(NULL);
Guido van Rossumb6775db1994-08-01 11:34:53 +000052}
53
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000054PyDoc_STRVAR(time_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +010055"time() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +000056\n\
57Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000058Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000059
Victor Stinner85fdfa82012-01-27 00:38:48 +010060#if defined(HAVE_CLOCK)
61
62#ifndef CLOCKS_PER_SEC
63#ifdef CLK_TCK
64#define CLOCKS_PER_SEC CLK_TCK
65#else
66#define CLOCKS_PER_SEC 1000000
67#endif
68#endif
69
Victor Stinner4195b5c2012-02-08 23:03:19 +010070static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +020071floatclock(_Py_clock_info_t *info)
Victor Stinner85fdfa82012-01-27 00:38:48 +010072{
Victor Stinner4195b5c2012-02-08 23:03:19 +010073 clock_t value;
74 value = clock();
75 if (value == (clock_t)-1) {
Victor Stinner85fdfa82012-01-27 00:38:48 +010076 PyErr_SetString(PyExc_RuntimeError,
77 "the processor time used is not available "
78 "or its value cannot be represented");
Victor Stinner4195b5c2012-02-08 23:03:19 +010079 return NULL;
Victor Stinner85fdfa82012-01-27 00:38:48 +010080 }
Victor Stinnerec895392012-04-29 02:41:27 +020081 if (info) {
82 info->implementation = "clock()";
83 info->resolution = 1.0 / (double)CLOCKS_PER_SEC;
Benjamin Peterson49a69e42012-05-01 09:38:34 -040084 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +020085 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +020086 }
Victor Stinner4195b5c2012-02-08 23:03:19 +010087 return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
Victor Stinner85fdfa82012-01-27 00:38:48 +010088}
89#endif /* HAVE_CLOCK */
90
Thomas Wouters477c8d52006-05-27 19:21:47 +000091#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinnerec895392012-04-29 02:41:27 +020092#define WIN32_PERF_COUNTER
Victor Stinner9122fdd2011-07-04 13:55:40 +020093/* Win32 has better clock replacement; we have our own version, due to Mark
94 Hammond and Tim Peters */
Victor Stinner54884492014-08-29 16:51:33 +020095static PyObject*
96win_perf_counter(_Py_clock_info_t *info)
Guido van Rossum3917c221997-04-02 05:35:28 +000097{
Victor Stinner8b302012012-02-07 23:29:46 +010098 static LONGLONG cpu_frequency = 0;
Victor Stinner4195b5c2012-02-08 23:03:19 +010099 static LONGLONG ctrStart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 LARGE_INTEGER now;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100101 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000102
Victor Stinner8b302012012-02-07 23:29:46 +0100103 if (cpu_frequency == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 LARGE_INTEGER freq;
Victor Stinner8b302012012-02-07 23:29:46 +0100105 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100106 ctrStart = now.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
Victor Stinner54884492014-08-29 16:51:33 +0200108 PyErr_SetFromWindowsErr(0);
109 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 }
Victor Stinner8b302012012-02-07 23:29:46 +0100111 cpu_frequency = freq.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 }
113 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100114 diff = (double)(now.QuadPart - ctrStart);
Victor Stinnerec895392012-04-29 02:41:27 +0200115 if (info) {
116 info->implementation = "QueryPerformanceCounter()";
117 info->resolution = 1.0 / (double)cpu_frequency;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400118 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200119 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200120 }
Victor Stinner54884492014-08-29 16:51:33 +0200121 return PyFloat_FromDouble(diff / (double)cpu_frequency);
Guido van Rossum3917c221997-04-02 05:35:28 +0000122}
Victor Stinner8b302012012-02-07 23:29:46 +0100123#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000124
Victor Stinnerec895392012-04-29 02:41:27 +0200125#if defined(WIN32_PERF_COUNTER) || defined(HAVE_CLOCK)
126#define PYCLOCK
127static PyObject*
128pyclock(_Py_clock_info_t *info)
129{
130#ifdef WIN32_PERF_COUNTER
Victor Stinner54884492014-08-29 16:51:33 +0200131 return win_perf_counter(info);
132#else
Victor Stinnerec895392012-04-29 02:41:27 +0200133 return floatclock(info);
Victor Stinner54884492014-08-29 16:51:33 +0200134#endif
Victor Stinnerec895392012-04-29 02:41:27 +0200135}
136
Victor Stinner9122fdd2011-07-04 13:55:40 +0200137static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100138time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200139{
Victor Stinnerec895392012-04-29 02:41:27 +0200140 return pyclock(NULL);
Victor Stinner9122fdd2011-07-04 13:55:40 +0200141}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100144"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000145\n\
146Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000147the first call to clock(). This has as much precision as the system\n\
148records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000149#endif
150
Victor Stinnere0be4232011-10-25 13:06:09 +0200151#ifdef HAVE_CLOCK_GETTIME
152static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100153time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200154{
155 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200156 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200157 struct timespec tp;
158
Victor Stinner4195b5c2012-02-08 23:03:19 +0100159 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200160 return NULL;
161
162 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100163 if (ret != 0) {
Victor Stinnera734af32014-07-31 13:07:17 +0200164 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100165 return NULL;
166 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100167 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200168}
169
170PyDoc_STRVAR(clock_gettime_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100171"clock_gettime(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200172\n\
173Return the time of the specified clock clk_id.");
Victor Stinner30d79472012-04-03 00:45:07 +0200174
175static PyObject *
176time_clock_settime(PyObject *self, PyObject *args)
177{
Victor Stinnerb8d01692012-04-13 23:44:05 +0200178 int clk_id;
Victor Stinner30d79472012-04-03 00:45:07 +0200179 PyObject *obj;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200180 time_t tv_sec;
181 long tv_nsec;
Victor Stinner30d79472012-04-03 00:45:07 +0200182 struct timespec tp;
183 int ret;
184
185 if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
186 return NULL;
187
Victor Stinner3c1b3792014-02-17 00:02:43 +0100188 if (_PyTime_ObjectToTimespec(obj, &tv_sec, &tv_nsec, _PyTime_ROUND_DOWN) == -1)
Victor Stinner30d79472012-04-03 00:45:07 +0200189 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200190 tp.tv_sec = tv_sec;
191 tp.tv_nsec = tv_nsec;
Victor Stinner30d79472012-04-03 00:45:07 +0200192
193 ret = clock_settime((clockid_t)clk_id, &tp);
194 if (ret != 0) {
Victor Stinnera734af32014-07-31 13:07:17 +0200195 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinner30d79472012-04-03 00:45:07 +0200196 return NULL;
197 }
198 Py_RETURN_NONE;
199}
200
201PyDoc_STRVAR(clock_settime_doc,
202"clock_settime(clk_id, time)\n\
203\n\
204Set the time of the specified clock clk_id.");
Victor Stinnere0be4232011-10-25 13:06:09 +0200205
Victor Stinnere0be4232011-10-25 13:06:09 +0200206static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100207time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200208{
209 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200210 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200211 struct timespec tp;
212
Victor Stinner4195b5c2012-02-08 23:03:19 +0100213 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200214 return NULL;
215
216 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100217 if (ret != 0) {
Victor Stinnera734af32014-07-31 13:07:17 +0200218 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100219 return NULL;
220 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100221
222 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200223}
224
225PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100226"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200227\n\
228Return the resolution (precision) of the specified clock clk_id.");
Victor Stinnerb8d01692012-04-13 23:44:05 +0200229#endif /* HAVE_CLOCK_GETTIME */
Victor Stinnere0be4232011-10-25 13:06:09 +0200230
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000231static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000232time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 double secs;
235 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
236 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200237 if (secs < 0) {
238 PyErr_SetString(PyExc_ValueError,
239 "sleep length must be non-negative");
240 return NULL;
241 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 if (floatsleep(secs) != 0)
243 return NULL;
244 Py_INCREF(Py_None);
245 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246}
247
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000248PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000249"sleep(seconds)\n\
250\n\
251Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000252a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000253
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000254static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000255 {"tm_year", "year, for example, 1993"},
256 {"tm_mon", "month of year, range [1, 12]"},
257 {"tm_mday", "day of month, range [1, 31]"},
258 {"tm_hour", "hours, range [0, 23]"},
259 {"tm_min", "minutes, range [0, 59]"},
260 {"tm_sec", "seconds, range [0, 61])"},
261 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
262 {"tm_yday", "day of year, range [1, 366]"},
263 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400264#ifdef HAVE_STRUCT_TM_TM_ZONE
265 {"tm_zone", "abbreviation of timezone name"},
266 {"tm_gmtoff", "offset from UTC in seconds"},
267#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000269};
270
271static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000273 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
274 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
275 " sequence of 9 integers.\n\n"
276 " Note that several fields' values are not the same as those defined by\n"
277 " the C language standard for struct tm. For example, the value of the\n"
278 " field tm_year is the actual year, not year - 1900. See individual\n"
279 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 struct_time_type_fields,
281 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000282};
Tim Peters9ad4b682002-02-13 05:14:18 +0000283
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000284static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000285static PyTypeObject StructTimeType;
286
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400287
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000288static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000289tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 PyObject *v = PyStructSequence_New(&StructTimeType);
292 if (v == NULL)
293 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000294
Christian Heimes217cfd12007-12-02 14:31:20 +0000295#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 SET(0, p->tm_year + 1900);
298 SET(1, p->tm_mon + 1); /* Want January == 1 */
299 SET(2, p->tm_mday);
300 SET(3, p->tm_hour);
301 SET(4, p->tm_min);
302 SET(5, p->tm_sec);
303 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
304 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
305 SET(8, p->tm_isdst);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400306#ifdef HAVE_STRUCT_TM_TM_ZONE
307 PyStructSequence_SET_ITEM(v, 9,
308 PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape"));
309 SET(10, p->tm_gmtoff);
310#endif /* HAVE_STRUCT_TM_TM_ZONE */
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000311#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 if (PyErr_Occurred()) {
313 Py_XDECREF(v);
314 return NULL;
315 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000318}
319
Fred Drakef901abd2004-08-03 17:58:55 +0000320/* Parse arg tuple that can contain an optional float-or-None value;
321 format needs to be "|O:name".
322 Returns non-zero on success (parallels PyArg_ParseTuple).
323*/
324static int
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100325parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100328 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 if (!PyArg_ParseTuple(args, format, &ot))
331 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100332 if (ot == NULL || ot == Py_None) {
333 whent = time(NULL);
334 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 else {
Victor Stinner3c1b3792014-02-17 00:02:43 +0100336 if (_PyTime_ObjectToTime_t(ot, &whent, _PyTime_ROUND_DOWN) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100337 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100339 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000341}
342
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000343static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000344time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000345{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100346 time_t when;
347 struct tm buf, *local;
348
349 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100351
352 errno = 0;
353 local = gmtime(&when);
354 if (local == NULL) {
355#ifdef EINVAL
356 if (errno == 0)
357 errno = EINVAL;
358#endif
359 return PyErr_SetFromErrno(PyExc_OSError);
360 }
361 buf = *local;
362 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000363}
364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000365PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000366"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000367 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000368\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000369Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400370GMT). When 'seconds' is not passed in, convert the current time instead.\n\
371\n\
372If the platform supports the tm_gmtoff and tm_zone, they are available as\n\
373attributes only.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000374
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100375static int
376pylocaltime(time_t *timep, struct tm *result)
377{
378 struct tm *local;
379
380 assert (timep != NULL);
381 local = localtime(timep);
382 if (local == NULL) {
383 /* unconvertible time */
384#ifdef EINVAL
385 if (errno == 0)
386 errno = EINVAL;
387#endif
388 PyErr_SetFromErrno(PyExc_OSError);
389 return -1;
390 }
391 *result = *local;
392 return 0;
393}
394
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000395static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000396time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000397{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100398 time_t when;
399 struct tm buf;
400
401 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 return NULL;
Alexander Belopolskyd9738242012-06-12 16:14:17 -0400403 if (pylocaltime(&when, &buf) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100404 return NULL;
405 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000406}
407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000408PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000409"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000411\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000412Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000413When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000414
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000415/* Convert 9-item tuple to tm structure. Return 1 on success, set
416 * an exception and return 0 on error.
417 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000418static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000419gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000424
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000425 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 PyErr_SetString(PyExc_TypeError,
427 "Tuple or struct_time argument required");
428 return 0;
429 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000430
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000431 if (!PyArg_ParseTuple(args, "iiiiiiiii",
432 &y, &p->tm_mon, &p->tm_mday,
433 &p->tm_hour, &p->tm_min, &p->tm_sec,
434 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 p->tm_year = y - 1900;
437 p->tm_mon--;
438 p->tm_wday = (p->tm_wday + 1) % 7;
439 p->tm_yday--;
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400440#ifdef HAVE_STRUCT_TM_TM_ZONE
441 if (Py_TYPE(args) == &StructTimeType) {
442 PyObject *item;
443 item = PyTuple_GET_ITEM(args, 9);
444 p->tm_zone = item == Py_None ? NULL : _PyUnicode_AsString(item);
445 item = PyTuple_GET_ITEM(args, 10);
446 p->tm_gmtoff = item == Py_None ? 0 : PyLong_AsLong(item);
447 if (PyErr_Occurred())
448 return 0;
449 }
450#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000452}
453
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000454/* Check values of the struct tm fields before it is passed to strftime() and
455 * asctime(). Return 1 if all values are valid, otherwise set an exception
456 * and returns 0.
457 */
Victor Stinneref128102010-10-07 01:00:52 +0000458static int
459checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000460{
Victor Stinneref128102010-10-07 01:00:52 +0000461 /* Checks added to make sure strftime() and asctime() does not crash Python by
462 indexing blindly into some array for a textual representation
463 by some bad index (fixes bug #897625 and #6608).
464
465 Also support values of zero from Python code for arguments in which
466 that is out of range by forcing that value to the lowest value that
467 is valid (fixed bug #1520914).
468
469 Valid ranges based on what is allowed in struct tm:
470
471 - tm_year: [0, max(int)] (1)
472 - tm_mon: [0, 11] (2)
473 - tm_mday: [1, 31]
474 - tm_hour: [0, 23]
475 - tm_min: [0, 59]
476 - tm_sec: [0, 60]
477 - tm_wday: [0, 6] (1)
478 - tm_yday: [0, 365] (2)
479 - tm_isdst: [-max(int), max(int)]
480
481 (1) gettmarg() handles bounds-checking.
482 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000483 thus need to check against automatic decrement by gettmarg().
484 */
485 if (buf->tm_mon == -1)
486 buf->tm_mon = 0;
487 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
488 PyErr_SetString(PyExc_ValueError, "month out of range");
489 return 0;
490 }
491 if (buf->tm_mday == 0)
492 buf->tm_mday = 1;
493 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
494 PyErr_SetString(PyExc_ValueError, "day of month out of range");
495 return 0;
496 }
497 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
498 PyErr_SetString(PyExc_ValueError, "hour out of range");
499 return 0;
500 }
501 if (buf->tm_min < 0 || buf->tm_min > 59) {
502 PyErr_SetString(PyExc_ValueError, "minute out of range");
503 return 0;
504 }
505 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
506 PyErr_SetString(PyExc_ValueError, "seconds out of range");
507 return 0;
508 }
509 /* tm_wday does not need checking of its upper-bound since taking
510 ``% 7`` in gettmarg() automatically restricts the range. */
511 if (buf->tm_wday < 0) {
512 PyErr_SetString(PyExc_ValueError, "day of week out of range");
513 return 0;
514 }
515 if (buf->tm_yday == -1)
516 buf->tm_yday = 0;
517 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
518 PyErr_SetString(PyExc_ValueError, "day of year out of range");
519 return 0;
520 }
521 return 1;
522}
523
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200524#ifdef MS_WINDOWS
525 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
526# undef HAVE_WCSFTIME
527#endif
Alexander Belopolskycf774542012-10-02 18:39:16 -0400528#define STRFTIME_FORMAT_CODES \
529"Commonly used format codes:\n\
530\n\
531%Y Year with century as a decimal number.\n\
532%m Month as a decimal number [01,12].\n\
533%d Day of the month as a decimal number [01,31].\n\
534%H Hour (24-hour clock) as a decimal number [00,23].\n\
535%M Minute as a decimal number [00,59].\n\
536%S Second as a decimal number [00,61].\n\
537%z Time zone offset from UTC.\n\
538%a Locale's abbreviated weekday name.\n\
539%A Locale's full weekday name.\n\
540%b Locale's abbreviated month name.\n\
541%B Locale's full month name.\n\
542%c Locale's appropriate date and time representation.\n\
543%I Hour (12-hour clock) as a decimal number [01,12].\n\
544%p Locale's equivalent of either AM or PM.\n\
545\n\
546Other codes may be available on your platform. See documentation for\n\
547the C library strftime function.\n"
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200548
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000549#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000550#ifdef HAVE_WCSFTIME
551#define time_char wchar_t
552#define format_time wcsftime
553#define time_strlen wcslen
554#else
555#define time_char char
556#define format_time strftime
557#define time_strlen strlen
558#endif
559
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000560static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000561time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 PyObject *tup = NULL;
564 struct tm buf;
565 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000566#ifdef HAVE_WCSFTIME
567 wchar_t *format;
568#else
569 PyObject *format;
570#endif
Victor Stinneref128102010-10-07 01:00:52 +0000571 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000573 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000575 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 /* Will always expect a unicode string to be passed as format.
580 Given that there's no str type anymore in py3k this seems safe.
581 */
Victor Stinneref128102010-10-07 01:00:52 +0000582 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 if (tup == NULL) {
586 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100587 if (pylocaltime(&tt, &buf) == -1)
588 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000589 }
590 else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000592
Victor Stinner36b82d82013-06-25 02:33:53 +0200593#if defined(_MSC_VER) || defined(sun) || defined(_AIX)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000594 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100595 PyErr_SetString(PyExc_ValueError,
596 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000597 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000598 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000599#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 /* Normalize tm_isdst just in case someone foolishly implements %Z
602 based on the assumption that tm_isdst falls within the range of
603 [-1, 1] */
604 if (buf.tm_isdst < -1)
605 buf.tm_isdst = -1;
606 else if (buf.tm_isdst > 1)
607 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000608
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000609#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000610 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000611 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000613 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000614#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100616 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 if (format == NULL)
618 return NULL;
619 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000620#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000621
Stefan Krah4aea7d32012-02-27 16:30:26 +0100622#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 /* check that the format string contains only valid directives */
Victor Stinner5a3ff792011-10-16 19:08:23 +0200624 for(outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200626 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 {
628 if (outbuf[1]=='#')
629 ++outbuf; /* not documented by python, */
630 if (outbuf[1]=='\0' ||
Victor Stinner5a3ff792011-10-16 19:08:23 +0200631 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 {
633 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Stefan Krah4aea7d32012-02-27 16:30:26 +0100634 Py_DECREF(format);
635 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 }
Tim Golden6e51b8f2013-11-12 12:36:54 +0000637 if ((outbuf[1] == 'y') && buf.tm_year < 0)
638 {
639 PyErr_SetString(PyExc_ValueError,
640 "format %y requires year >= 1900 on Windows");
641 Py_DECREF(format);
642 return NULL;
643 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 }
Victor Stinner93965f72013-11-23 14:59:33 +0100645#elif (defined(_AIX) || defined(sun)) && defined(HAVE_WCSFTIME)
Victor Stinner55329f82013-11-17 23:39:21 +0100646 for(outbuf = wcschr(fmt, '%');
647 outbuf != NULL;
648 outbuf = wcschr(outbuf+2, '%'))
649 {
650 /* Issue #19634: On AIX, wcsftime("y", (1899, 1, 1, 0, 0, 0, 0, 0, 0))
651 returns "0/" instead of "99" */
652 if (outbuf[1] == L'y' && buf.tm_year < 0) {
653 PyErr_SetString(PyExc_ValueError,
654 "format %y requires year >= 1900 on AIX");
Victor Stinner55329f82013-11-17 23:39:21 +0100655 return NULL;
656 }
657 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000658#endif
659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 /* I hate these functions that presume you know how big the output
663 * will be ahead of time...
664 */
665 for (i = 1024; ; i += i) {
Victor Stinner136ea492011-12-17 22:37:18 +0100666#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100667 int err;
Victor Stinner136ea492011-12-17 22:37:18 +0100668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
670 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000671 PyErr_NoMemory();
672 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 }
674 buflen = format_time(outbuf, i, fmt, &buf);
Victor Stinner136ea492011-12-17 22:37:18 +0100675#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100676 err = errno;
Victor Stinner136ea492011-12-17 22:37:18 +0100677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 if (buflen > 0 || i >= 256 * fmtlen) {
679 /* If the buffer is 256 times as long as the format,
680 it's probably not failing for lack of room!
681 More likely, the format yields an empty result,
682 e.g. an empty format, or %Z when the timezone
683 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000684#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000686#else
Victor Stinner1b579672011-12-17 05:47:23 +0100687 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
688 "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000691 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 }
693 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000694#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* VisualStudio .NET 2005 does this properly */
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100696 if (buflen == 0 && err == EINVAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Victor Stinnerb2904782010-09-29 10:34:19 +0000698 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000702#ifdef HAVE_WCSFTIME
703 PyMem_Free(format);
704#else
705 Py_DECREF(format);
706#endif
707 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000708}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000709
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000710#undef time_char
711#undef format_time
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000712PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000713"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000714\n\
715Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000716See the library reference manual for formatting codes. When the time tuple\n\
Alexander Belopolskycf774542012-10-02 18:39:16 -0400717is not present, current time as returned by localtime() is used.\n\
718\n" STRFTIME_FORMAT_CODES);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000719#endif /* HAVE_STRFTIME */
720
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000721static PyObject *
722time_strptime(PyObject *self, PyObject *args)
723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
725 PyObject *strptime_result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200726 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 if (!strptime_module)
729 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200730 strptime_result = _PyObject_CallMethodId(strptime_module,
731 &PyId__strptime_time, "O", args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 Py_DECREF(strptime_module);
733 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000734}
735
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000737PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000738"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000739\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000740Parse a string to a time tuple according to a format specification.\n\
Alexander Belopolskycf774542012-10-02 18:39:16 -0400741See the library reference manual for formatting codes (same as\n\
742strftime()).\n\
743\n" STRFTIME_FORMAT_CODES);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000744
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000745static PyObject *
746_asctime(struct tm *timeptr)
747{
748 /* Inspired by Open Group reference implementation available at
749 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Victor Stinner499dfcf2011-03-21 13:26:24 +0100750 static char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000751 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
752 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100753 static char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000754 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
755 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
756 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100757 return PyUnicode_FromFormat(
758 "%s %s%3d %.2d:%.2d:%.2d %d",
759 wday_name[timeptr->tm_wday],
760 mon_name[timeptr->tm_mon],
761 timeptr->tm_mday, timeptr->tm_hour,
762 timeptr->tm_min, timeptr->tm_sec,
763 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000764}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000765
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000766static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000767time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PyObject *tup = NULL;
770 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
773 return NULL;
774 if (tup == NULL) {
775 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100776 if (pylocaltime(&tt, &buf) == -1)
777 return NULL;
778
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000779 } else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 return NULL;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000781 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000782}
783
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000784PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000785"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000786\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000787Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
788When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000789is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000790
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000791static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000792time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100795 struct tm buf;
796 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100798 if (pylocaltime(&tt, &buf) == -1)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000799 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100800 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000801}
802
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000803PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000804"ctime(seconds) -> string\n\
805\n\
806Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000807This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000808not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000809
Guido van Rossum60cd8131998-03-06 17:16:21 +0000810#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000811static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100812time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 struct tm buf;
815 time_t tt;
816 if (!gettmarg(tup, &buf))
817 return NULL;
Victor Stinner1ac42612014-02-21 09:27:17 +0100818#ifdef _AIX
819 /* year < 1902 or year > 2037 */
820 if (buf.tm_year < 2 || buf.tm_year > 137) {
821 /* Issue #19748: On AIX, mktime() doesn't report overflow error for
822 * timestamp < -2^31 or timestamp > 2**31-1. */
823 PyErr_SetString(PyExc_OverflowError,
824 "mktime argument out of range");
825 return NULL;
826 }
827#else
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000828 buf.tm_wday = -1; /* sentinel; original value ignored */
Victor Stinner1ac42612014-02-21 09:27:17 +0100829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000831 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200832 * cannot remain set to -1 if mktime succeeded. */
Victor Stinner93037492013-06-25 22:54:35 +0200833 if (tt == (time_t)(-1)
834#ifndef _AIX
835 /* Return value of -1 does not necessarily mean an error, but
836 * tm_wday cannot remain set to -1 if mktime succeeded. */
837 && buf.tm_wday == -1
838#else
839 /* on AIX, tm_wday is always sets, even on error */
840#endif
841 )
842 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 PyErr_SetString(PyExc_OverflowError,
844 "mktime argument out of range");
845 return NULL;
846 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100847 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000848}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000850PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000851"mktime(tuple) -> floating point number\n\
852\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400853Convert a time tuple in local time to seconds since the Epoch.\n\
854Note that mktime(gmtime(0)) will not generally return zero for most\n\
855time zones; instead the returned value will either be equal to that\n\
856of the timezone or altzone attributes on the time module.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000857#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000858
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000859#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000860static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000861
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000862static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000863time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 m = PyImport_ImportModuleNoBlock("time");
868 if (m == NULL) {
869 return NULL;
870 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 /* Reset timezone, altzone, daylight and tzname */
875 PyInit_timezone(m);
876 Py_DECREF(m);
Victor Stinner2ff51b82013-07-17 21:42:45 +0200877 if (PyErr_Occurred())
878 return NULL;
Tim Peters1b6f7a92004-06-20 02:50:16 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 Py_INCREF(Py_None);
881 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000882}
883
884PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +0000885"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000886\n\
887Initialize, or reinitialize, the local timezone to the value stored in\n\
888os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000889standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000890(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
891fall back to UTC. If the TZ environment variable is not set, the local\n\
892timezone is set to the systems best guess of wallclock time.\n\
893Changing the TZ environment variable without calling tzset *may* change\n\
894the local timezone used by methods such as localtime, but this behaviour\n\
895should not be relied on.");
896#endif /* HAVE_WORKING_TZSET */
897
Victor Stinnerae586492014-09-02 23:18:25 +0200898static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +0200899pymonotonic(_Py_clock_info_t *info)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100900{
Victor Stinnerae586492014-09-02 23:18:25 +0200901 _PyTime_timeval tv;
902 if (_PyTime_monotonic_info(&tv, info) < 0) {
903 assert(info != NULL);
Victor Stinner071eca32012-03-15 01:17:09 +0100904 return NULL;
905 }
Victor Stinnerae586492014-09-02 23:18:25 +0200906 return PyFloat_FromDouble((double)tv.tv_sec + tv.tv_usec * 1e-6);
Victor Stinner8b302012012-02-07 23:29:46 +0100907}
908
Victor Stinner071eca32012-03-15 01:17:09 +0100909static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +0200910time_monotonic(PyObject *self, PyObject *unused)
Victor Stinner071eca32012-03-15 01:17:09 +0100911{
Victor Stinnerec895392012-04-29 02:41:27 +0200912 return pymonotonic(NULL);
Victor Stinner071eca32012-03-15 01:17:09 +0100913}
914
Victor Stinnerec895392012-04-29 02:41:27 +0200915PyDoc_STRVAR(monotonic_doc,
916"monotonic() -> float\n\
Victor Stinner8b302012012-02-07 23:29:46 +0100917\n\
Victor Stinnerec895392012-04-29 02:41:27 +0200918Monotonic clock, cannot go backward.");
Victor Stinnerec919cc2012-03-15 00:58:32 +0100919
Victor Stinnerec895392012-04-29 02:41:27 +0200920static PyObject*
921perf_counter(_Py_clock_info_t *info)
922{
Victor Stinner54884492014-08-29 16:51:33 +0200923#ifdef WIN32_PERF_COUNTER
924 return win_perf_counter(info);
925#else
Victor Stinnerae586492014-09-02 23:18:25 +0200926 return pymonotonic(info);
Victor Stinner54884492014-08-29 16:51:33 +0200927#endif
Victor Stinnerec895392012-04-29 02:41:27 +0200928}
929
930static PyObject *
931time_perf_counter(PyObject *self, PyObject *unused)
932{
933 return perf_counter(NULL);
934}
935
936PyDoc_STRVAR(perf_counter_doc,
937"perf_counter() -> float\n\
938\n\
939Performance counter for benchmarking.");
940
941static PyObject*
942py_process_time(_Py_clock_info_t *info)
943{
944#if defined(MS_WINDOWS)
945 HANDLE process;
946 FILETIME creation_time, exit_time, kernel_time, user_time;
947 ULARGE_INTEGER large;
948 double total;
949 BOOL ok;
950
951 process = GetCurrentProcess();
952 ok = GetProcessTimes(process, &creation_time, &exit_time, &kernel_time, &user_time);
953 if (!ok)
954 return PyErr_SetFromWindowsErr(0);
955
956 large.u.LowPart = kernel_time.dwLowDateTime;
957 large.u.HighPart = kernel_time.dwHighDateTime;
958 total = (double)large.QuadPart;
959 large.u.LowPart = user_time.dwLowDateTime;
960 large.u.HighPart = user_time.dwHighDateTime;
961 total += (double)large.QuadPart;
962 if (info) {
963 info->implementation = "GetProcessTimes()";
964 info->resolution = 1e-7;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400965 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200966 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200967 }
968 return PyFloat_FromDouble(total * 1e-7);
969#else
970
971#if defined(HAVE_SYS_RESOURCE_H)
972 struct rusage ru;
973#endif
974#ifdef HAVE_TIMES
975 struct tms t;
976 static long ticks_per_second = -1;
977#endif
978
979#if defined(HAVE_CLOCK_GETTIME) \
980 && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF))
981 struct timespec tp;
982#ifdef CLOCK_PROF
983 const clockid_t clk_id = CLOCK_PROF;
984 const char *function = "clock_gettime(CLOCK_PROF)";
985#else
986 const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID;
987 const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)";
988#endif
989
990 if (clock_gettime(clk_id, &tp) == 0) {
991 if (info) {
992 struct timespec res;
993 info->implementation = function;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400994 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200995 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200996 if (clock_getres(clk_id, &res) == 0)
997 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
998 else
999 info->resolution = 1e-9;
1000 }
1001 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
1002 }
1003#endif
1004
1005#if defined(HAVE_SYS_RESOURCE_H)
1006 if (getrusage(RUSAGE_SELF, &ru) == 0) {
1007 double total;
1008 total = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec * 1e-6;
1009 total += ru.ru_stime.tv_sec + ru.ru_stime.tv_usec * 1e-6;
1010 if (info) {
1011 info->implementation = "getrusage(RUSAGE_SELF)";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001012 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001013 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001014 info->resolution = 1e-6;
1015 }
1016 return PyFloat_FromDouble(total);
1017 }
1018#endif
1019
1020#ifdef HAVE_TIMES
1021 if (times(&t) != (clock_t)-1) {
1022 double total;
1023
1024 if (ticks_per_second == -1) {
1025#if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
1026 ticks_per_second = sysconf(_SC_CLK_TCK);
1027 if (ticks_per_second < 1)
1028 ticks_per_second = -1;
1029#elif defined(HZ)
1030 ticks_per_second = HZ;
1031#else
1032 ticks_per_second = 60; /* magic fallback value; may be bogus */
1033#endif
1034 }
1035
1036 if (ticks_per_second != -1) {
1037 total = (double)t.tms_utime / ticks_per_second;
1038 total += (double)t.tms_stime / ticks_per_second;
1039 if (info) {
1040 info->implementation = "times()";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001041 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001042 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001043 info->resolution = 1.0 / ticks_per_second;
1044 }
1045 return PyFloat_FromDouble(total);
1046 }
1047 }
1048#endif
1049
1050 return floatclock(info);
1051#endif
1052}
1053
1054static PyObject *
1055time_process_time(PyObject *self, PyObject *unused)
1056{
1057 return py_process_time(NULL);
1058}
1059
1060PyDoc_STRVAR(process_time_doc,
1061"process_time() -> float\n\
1062\n\
1063Process time for profiling: sum of the kernel and user-space CPU time.");
1064
1065
Victor Stinnerec895392012-04-29 02:41:27 +02001066static PyObject *
1067time_get_clock_info(PyObject *self, PyObject *args)
1068{
1069 char *name;
Victor Stinnerec895392012-04-29 02:41:27 +02001070 _Py_clock_info_t info;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001071 PyObject *obj = NULL, *dict, *ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001072
1073 if (!PyArg_ParseTuple(args, "s:get_clock_info", &name))
1074 return NULL;
1075
1076#ifdef Py_DEBUG
1077 info.implementation = NULL;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001078 info.monotonic = -1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001079 info.adjustable = -1;
Victor Stinnerec895392012-04-29 02:41:27 +02001080 info.resolution = -1.0;
1081#else
1082 info.implementation = "";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001083 info.monotonic = 0;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001084 info.adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001085 info.resolution = 1.0;
1086#endif
1087
1088 if (strcmp(name, "time") == 0)
1089 obj = floattime(&info);
1090#ifdef PYCLOCK
1091 else if (strcmp(name, "clock") == 0)
1092 obj = pyclock(&info);
1093#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001094 else if (strcmp(name, "monotonic") == 0)
1095 obj = pymonotonic(&info);
Victor Stinnerec895392012-04-29 02:41:27 +02001096 else if (strcmp(name, "perf_counter") == 0)
1097 obj = perf_counter(&info);
1098 else if (strcmp(name, "process_time") == 0)
1099 obj = py_process_time(&info);
1100 else {
1101 PyErr_SetString(PyExc_ValueError, "unknown clock");
1102 return NULL;
1103 }
1104 if (obj == NULL)
1105 return NULL;
1106 Py_DECREF(obj);
1107
Victor Stinnerbda4b882012-06-12 22:11:44 +02001108 dict = PyDict_New();
1109 if (dict == NULL)
Victor Stinnerec895392012-04-29 02:41:27 +02001110 return NULL;
1111
1112 assert(info.implementation != NULL);
1113 obj = PyUnicode_FromString(info.implementation);
1114 if (obj == NULL)
1115 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001116 if (PyDict_SetItemString(dict, "implementation", obj) == -1)
1117 goto error;
1118 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001119
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001120 assert(info.monotonic != -1);
1121 obj = PyBool_FromLong(info.monotonic);
Victor Stinnerec895392012-04-29 02:41:27 +02001122 if (obj == NULL)
1123 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001124 if (PyDict_SetItemString(dict, "monotonic", obj) == -1)
1125 goto error;
1126 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001127
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001128 assert(info.adjustable != -1);
1129 obj = PyBool_FromLong(info.adjustable);
Victor Stinnerec895392012-04-29 02:41:27 +02001130 if (obj == NULL)
1131 goto error;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001132 if (PyDict_SetItemString(dict, "adjustable", obj) == -1)
Victor Stinnerbda4b882012-06-12 22:11:44 +02001133 goto error;
1134 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001135
1136 assert(info.resolution > 0.0);
1137 assert(info.resolution <= 1.0);
1138 obj = PyFloat_FromDouble(info.resolution);
1139 if (obj == NULL)
1140 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001141 if (PyDict_SetItemString(dict, "resolution", obj) == -1)
1142 goto error;
1143 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001144
Victor Stinnerbda4b882012-06-12 22:11:44 +02001145 ns = _PyNamespace_New(dict);
1146 Py_DECREF(dict);
1147 return ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001148
1149error:
Victor Stinnerbda4b882012-06-12 22:11:44 +02001150 Py_DECREF(dict);
1151 Py_XDECREF(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001152 return NULL;
1153}
1154
1155PyDoc_STRVAR(get_clock_info_doc,
1156"get_clock_info(name: str) -> dict\n\
1157\n\
1158Get information of the specified clock.");
Victor Stinner8b302012012-02-07 23:29:46 +01001159
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001160static void
Martin v. Löwis1a214512008-06-11 05:26:20 +00001161PyInit_timezone(PyObject *m) {
1162 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 time_tzset. In the future, some parts of it can be moved back
1164 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
1165 are), and the extraneous calls to tzset(3) should be removed.
1166 I haven't done this yet, as I don't want to change this code as
1167 little as possible when introducing the time.tzset and time.tzsetwall
1168 methods. This should simply be a method of doing the following once,
1169 at the top of this function and removing the call to tzset() from
1170 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 #ifdef HAVE_TZSET
1173 tzset()
1174 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001177 */
Guido van Rossum10b164a2001-09-25 13:59:01 +00001178#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 PyObject *otz0, *otz1;
1180 tzset();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001182#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001184#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner1b579672011-12-17 05:47:23 +01001188 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
1189 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +00001191#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001192#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 {
Guido van Rossum234f9421993-06-17 12:35:49 +00001194#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 time_t t;
1196 struct tm *p;
1197 long janzone, julyzone;
1198 char janname[10], julyname[10];
1199 t = (time((time_t *)0) / YEAR) * YEAR;
1200 p = localtime(&t);
1201 janzone = -p->tm_gmtoff;
1202 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
1203 janname[9] = '\0';
1204 t += YEAR/2;
1205 p = localtime(&t);
1206 julyzone = -p->tm_gmtoff;
1207 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
1208 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if( janzone < julyzone ) {
1211 /* DST is reversed in the southern hemisphere */
1212 PyModule_AddIntConstant(m, "timezone", julyzone);
1213 PyModule_AddIntConstant(m, "altzone", janzone);
1214 PyModule_AddIntConstant(m, "daylight",
1215 janzone != julyzone);
1216 PyModule_AddObject(m, "tzname",
1217 Py_BuildValue("(zz)",
1218 julyname, janname));
1219 } else {
1220 PyModule_AddIntConstant(m, "timezone", janzone);
1221 PyModule_AddIntConstant(m, "altzone", julyzone);
1222 PyModule_AddIntConstant(m, "daylight",
1223 janzone != julyzone);
1224 PyModule_AddObject(m, "tzname",
1225 Py_BuildValue("(zz)",
1226 janname, julyname));
1227 }
1228 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +00001229#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001230#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +00001231#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 tzset();
1233 PyModule_AddIntConstant(m, "timezone", _timezone);
1234 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
1235 PyModule_AddIntConstant(m, "daylight", _daylight);
1236 PyModule_AddObject(m, "tzname",
1237 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +00001238#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +00001239#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Victor Stinnere0be4232011-10-25 13:06:09 +02001240
Victor Stinnerec895392012-04-29 02:41:27 +02001241#if defined(HAVE_CLOCK_GETTIME)
Victor Stinnere0be4232011-10-25 13:06:09 +02001242 PyModule_AddIntMacro(m, CLOCK_REALTIME);
Victor Stinnere0be4232011-10-25 13:06:09 +02001243#ifdef CLOCK_MONOTONIC
1244 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
1245#endif
1246#ifdef CLOCK_MONOTONIC_RAW
1247 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
1248#endif
Victor Stinner1470f352012-04-03 00:31:17 +02001249#ifdef CLOCK_HIGHRES
1250 PyModule_AddIntMacro(m, CLOCK_HIGHRES);
1251#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001252#ifdef CLOCK_PROCESS_CPUTIME_ID
1253 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
1254#endif
1255#ifdef CLOCK_THREAD_CPUTIME_ID
1256 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
1257#endif
1258#endif /* HAVE_CLOCK_GETTIME */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001259}
1260
1261
1262static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +01001263 {"time", time_time, METH_NOARGS, time_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001264#ifdef PYCLOCK
Victor Stinner4195b5c2012-02-08 23:03:19 +01001265 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001266#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001267#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001268 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinner30d79472012-04-03 00:45:07 +02001269 {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc},
Victor Stinner4195b5c2012-02-08 23:03:19 +01001270 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +02001271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
1273 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
1274 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
1275 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
1276 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001277#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001278 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001279#endif
1280#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001284#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001286#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001287 {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001288 {"process_time", time_process_time, METH_NOARGS, process_time_doc},
1289 {"perf_counter", time_perf_counter, METH_NOARGS, perf_counter_doc},
1290 {"get_clock_info", time_get_clock_info, METH_VARARGS, get_clock_info_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001292};
1293
1294
1295PyDoc_STRVAR(module_doc,
1296"This module provides various functions to manipulate time values.\n\
1297\n\
1298There are two standard representations of time. One is the number\n\
1299of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1300or a floating point number (to represent fractions of seconds).\n\
1301The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1302The actual value can be retrieved by calling gmtime(0).\n\
1303\n\
1304The other representation is a tuple of 9 integers giving local time.\n\
1305The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001306 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001307 month (1-12)\n\
1308 day (1-31)\n\
1309 hours (0-23)\n\
1310 minutes (0-59)\n\
1311 seconds (0-59)\n\
1312 weekday (0-6, Monday is 0)\n\
1313 Julian day (day in the year, 1-366)\n\
1314 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1315If the DST flag is 0, the time is given in the regular time zone;\n\
1316if it is 1, the time is given in the DST time zone;\n\
1317if it is -1, mktime() should guess based on the date and time.\n\
1318\n\
1319Variables:\n\
1320\n\
1321timezone -- difference in seconds between UTC and local standard time\n\
1322altzone -- difference in seconds between UTC and local DST time\n\
1323daylight -- whether local time should reflect DST\n\
1324tzname -- tuple of (standard time zone name, DST time zone name)\n\
1325\n\
1326Functions:\n\
1327\n\
1328time() -- return current time in seconds since the Epoch as a float\n\
1329clock() -- return CPU time since process start as a float\n\
1330sleep() -- delay for a number of seconds given as a float\n\
1331gmtime() -- convert seconds since Epoch to UTC tuple\n\
1332localtime() -- convert seconds since Epoch to local time tuple\n\
1333asctime() -- convert time tuple to string\n\
1334ctime() -- convert time in seconds to string\n\
1335mktime() -- convert local time tuple to seconds since Epoch\n\
1336strftime() -- convert time tuple to string according to format specification\n\
1337strptime() -- parse string to time tuple according to format specification\n\
1338tzset() -- change the local timezone");
1339
1340
Martin v. Löwis1a214512008-06-11 05:26:20 +00001341
1342static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 PyModuleDef_HEAD_INIT,
1344 "time",
1345 module_doc,
1346 -1,
1347 time_methods,
1348 NULL,
1349 NULL,
1350 NULL,
1351 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001352};
1353
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001354PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001355PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 m = PyModule_Create(&timemodule);
1359 if (m == NULL)
1360 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 /* Set, or reset, module variables like time.timezone */
1363 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 if (!initialized) {
Victor Stinner1c8f0592013-07-22 22:24:54 +02001366 if (PyStructSequence_InitType2(&StructTimeType,
1367 &struct_time_type_desc) < 0)
1368 return NULL;
Victor Stinnerec895392012-04-29 02:41:27 +02001369
Victor Stinnerec895392012-04-29 02:41:27 +02001370#ifdef MS_WINDOWS
1371 winver.dwOSVersionInfoSize = sizeof(winver);
1372 if (!GetVersionEx((OSVERSIONINFO*)&winver)) {
1373 Py_DECREF(m);
1374 PyErr_SetFromWindowsErr(0);
1375 return NULL;
1376 }
1377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 }
1379 Py_INCREF(&StructTimeType);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -04001380#ifdef HAVE_STRUCT_TM_TM_ZONE
1381 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11);
1382#else
1383 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 9);
1384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1386 initialized = 1;
1387 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001388}
1389
Victor Stinner071eca32012-03-15 01:17:09 +01001390static PyObject*
Victor Stinnerec895392012-04-29 02:41:27 +02001391floattime(_Py_clock_info_t *info)
Victor Stinner4195b5c2012-02-08 23:03:19 +01001392{
1393 _PyTime_timeval t;
Victor Stinner00111242014-08-29 16:31:59 +02001394 if (_PyTime_gettimeofday_info(&t, info) < 0) {
1395 assert(info != NULL);
1396 return NULL;
1397 }
Victor Stinner70b2e1e2012-03-26 22:08:02 +02001398 return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
Victor Stinner4195b5c2012-02-08 23:03:19 +01001399}
1400
1401
Guido van Rossumb6775db1994-08-01 11:34:53 +00001402/* Implement floatsleep() for various platforms.
1403 When interrupted (or when another error occurs), return -1 and
1404 set an exception; else return 0. */
1405
1406static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001407floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001408{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001409/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001410#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 struct timeval t;
1412 double frac;
Victor Stinner48b1ce52011-07-01 13:50:09 +02001413 int err;
1414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 frac = fmod(secs, 1.0);
1416 secs = floor(secs);
1417 t.tv_sec = (long)secs;
1418 t.tv_usec = (long)(frac*1000000.0);
1419 Py_BEGIN_ALLOW_THREADS
Victor Stinner48b1ce52011-07-01 13:50:09 +02001420 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1421 Py_END_ALLOW_THREADS
1422 if (err != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001423#ifdef EINTR
Victor Stinner48b1ce52011-07-01 13:50:09 +02001424 if (errno == EINTR) {
1425 if (PyErr_CheckSignals())
1426 return -1;
1427 }
1428 else
Guido van Rossum09cbb011999-11-08 15:32:27 +00001429#endif
Victor Stinner48b1ce52011-07-01 13:50:09 +02001430 {
Victor Stinnera734af32014-07-31 13:07:17 +02001431 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 return -1;
1433 }
1434 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001435#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 /* XXX Can't interrupt this sleep */
1437 Py_BEGIN_ALLOW_THREADS
1438 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1439 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001440#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 {
1442 double millisecs = secs * 1000.0;
1443 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 if (millisecs > (double)ULONG_MAX) {
1446 PyErr_SetString(PyExc_OverflowError,
1447 "sleep length is too large");
1448 return -1;
1449 }
1450 Py_BEGIN_ALLOW_THREADS
1451 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1452 * by Guido, only the main thread can be interrupted.
1453 */
1454 ul_millis = (unsigned long)millisecs;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001455 if (ul_millis == 0 || !_PyOS_IsMainThread())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 Sleep(ul_millis);
1457 else {
1458 DWORD rc;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001459 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 ResetEvent(hInterruptEvent);
Martin v. Löwisb26a9b12013-01-25 14:25:48 +01001461 rc = WaitForSingleObjectEx(hInterruptEvent, ul_millis, FALSE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 if (rc == WAIT_OBJECT_0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 Py_BLOCK_THREADS
1464 errno = EINTR;
Victor Stinnera734af32014-07-31 13:07:17 +02001465 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 return -1;
1467 }
1468 }
1469 Py_END_ALLOW_THREADS
1470 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001471#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 /* XXX Can't interrupt this sleep */
1473 Py_BEGIN_ALLOW_THREADS
1474 sleep((int)secs);
1475 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001476#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001479}