blob: 61b8d612a4ae0a67c41e0028676d0b767491a588 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Time module */
3
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00004#include "Python.h"
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005#include "structseq.h"
Tim Peters1b6f7a92004-06-20 02:50:16 +00006#include "timefuncs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00007
Ronald Oussorend06b6f22006-04-23 11:59:25 +00008#ifdef __APPLE__
9#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
10 /*
11 * floattime falls back to ftime when getttimeofday fails because the latter
12 * might fail on some platforms. This fallback is unwanted on MacOSX because
13 * that makes it impossible to use a binary build on OSX 10.4 on earlier
14 * releases of the OS. Therefore claim we don't support ftime.
15 */
16# undef HAVE_FTIME
17#endif
18#endif
19
Guido van Rossum87ce7bb1998-06-09 16:30:31 +000020#include <ctype.h>
21
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000022#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000023#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000024#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum6d946f91992-08-14 13:49:30 +000025
Guido van Rossumb6775db1994-08-01 11:34:53 +000026#ifdef QUICKWIN
27#include <io.h>
28#endif
29
Guido van Rossumb6775db1994-08-01 11:34:53 +000030#ifdef HAVE_FTIME
31#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000032#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000033extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000034#endif /* MS_WINDOWS */
35#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036
Guido van Rossum7bf22de1997-12-02 20:34:19 +000037#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000038#include <i86.h>
39#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000040#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000041#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000042#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000043#include "pythread.h"
44
45/* helper to allow us to interrupt sleep() on Windows*/
46static HANDLE hInterruptEvent = NULL;
47static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
48{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000049 SetEvent(hInterruptEvent);
50 /* allow other default handlers to be called.
51 Default Python handler will setup the
52 KeyboardInterrupt exception.
53 */
54 return FALSE;
Mark Hammond975e3922002-07-16 01:29:19 +000055}
56static long main_thread;
57
58
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000059#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000060/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000061#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000062#define tzname _tzname
63#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000064#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000065#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000066#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000067
Tim Peters7a822da2006-05-25 21:50:17 +000068#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Tim Petersc285e622006-05-25 22:25:25 +000069/* Win32 has better clock replacement; we have our own version below. */
70#undef HAVE_CLOCK
Tim Peters7a822da2006-05-25 21:50:17 +000071#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +000072
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000073#if defined(PYOS_OS2)
74#define INCL_DOS
75#define INCL_ERRORS
76#include <os2.h>
77#endif
78
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000079#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000080#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000081#endif
82
Guido van Rossumbcc20741998-08-04 22:53:56 +000083#ifdef __BEOS__
Fred Drake56221a72000-08-15 18:52:33 +000084#include <time.h>
Guido van Rossumbcc20741998-08-04 22:53:56 +000085/* For bigtime_t, snooze(). - [cjh] */
86#include <support/SupportDefs.h>
87#include <kernel/OS.h>
88#endif
89
Martin v. Löwisa94568a2003-05-10 07:36:56 +000090#ifdef RISCOS
91extern int riscos_sleep(double);
92#endif
93
Guido van Rossum234f9421993-06-17 12:35:49 +000094/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000095static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000096static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000098/* For Y2K check */
Gregory P. Smith0d68ab32012-11-27 10:19:29 -080099static PyObject *moddict = NULL;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000100
Tim Peters1b6f7a92004-06-20 02:50:16 +0000101/* Exposed in timefuncs.h. */
102time_t
Brett Cannon298c3802004-06-19 20:48:43 +0000103_PyTime_DoubleToTimet(double x)
104{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000105 time_t result;
106 double diff;
Brett Cannon298c3802004-06-19 20:48:43 +0000107
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000108 result = (time_t)x;
109 /* How much info did we lose? time_t may be an integral or
110 * floating type, and we don't know which. If it's integral,
111 * we don't know whether C truncates, rounds, returns the floor,
112 * etc. If we lost a second or more, the C rounding is
113 * unreasonable, or the input just doesn't fit in a time_t;
114 * call it an error regardless. Note that the original cast to
115 * time_t can cause a C error too, but nothing we can do to
116 * worm around that.
117 */
118 diff = x - (double)result;
119 if (diff <= -1.0 || diff >= 1.0) {
120 PyErr_SetString(PyExc_ValueError,
121 "timestamp out of range for platform time_t");
122 result = (time_t)-1;
123 }
124 return result;
Brett Cannon298c3802004-06-19 20:48:43 +0000125}
126
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000127static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000128time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000130 double secs;
131 secs = floattime();
132 if (secs == 0.0) {
133 PyErr_SetFromErrno(PyExc_IOError);
134 return NULL;
135 }
136 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137}
138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000140"time() -> floating point number\n\
141\n\
142Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000144
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#ifdef HAVE_CLOCK
146
147#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000148#ifdef CLK_TCK
149#define CLOCKS_PER_SEC CLK_TCK
150#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151#define CLOCKS_PER_SEC 1000000
152#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000153#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000154
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000155static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000156time_clock(PyObject *self, PyObject *unused)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000157{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000158 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000160#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161
Tim Petersc285e622006-05-25 22:25:25 +0000162#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000163/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000164static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000165time_clock(PyObject *self, PyObject *unused)
Guido van Rossum3917c221997-04-02 05:35:28 +0000166{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000167 static LARGE_INTEGER ctrStart;
168 static double divisor = 0.0;
169 LARGE_INTEGER now;
170 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000171
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 if (divisor == 0.0) {
173 LARGE_INTEGER freq;
174 QueryPerformanceCounter(&ctrStart);
175 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
176 /* Unlikely to happen - this works on all intel
177 machines at least! Revert to clock() */
178 return PyFloat_FromDouble(((double)clock()) /
179 CLOCKS_PER_SEC);
180 }
181 divisor = (double)freq.QuadPart;
182 }
183 QueryPerformanceCounter(&now);
184 diff = (double)(now.QuadPart - ctrStart.QuadPart);
185 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000186}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000187
Guido van Rossum3917c221997-04-02 05:35:28 +0000188#define HAVE_CLOCK /* So it gets included in the methods */
Tim Petersc285e622006-05-25 22:25:25 +0000189#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +0000190
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000191#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000192PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000193"clock() -> floating point number\n\
194\n\
195Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000196the first call to clock(). This has as much precision as the system\n\
197records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000198#endif
199
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000200static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000201time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000203 double secs;
204 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
205 return NULL;
206 if (floatsleep(secs) != 0)
207 return NULL;
208 Py_INCREF(Py_None);
209 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210}
211
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000212PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000213"sleep(seconds)\n\
214\n\
215Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000216a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000217
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000218static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky3b818bf2010-06-05 14:54:26 +0000219 {"tm_year", "year, for example, 1993"},
220 {"tm_mon", "month of year, range [1, 12]"},
221 {"tm_mday", "day of month, range [1, 31]"},
222 {"tm_hour", "hours, range [0, 23]"},
223 {"tm_min", "minutes, range [0, 59]"},
224 {"tm_sec", "seconds, range [0, 61])"},
225 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
226 {"tm_yday", "day of year, range [1, 366]"},
227 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000228 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000229};
230
231static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000232 "time.struct_time",
Alexander Belopolsky3b818bf2010-06-05 14:54:26 +0000233 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
234 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
235 " sequence of 9 integers.\n\n"
236 " Note that several fields' values are not the same as those defined by\n"
237 " the C language standard for struct tm. For example, the value of the\n"
238 " field tm_year is the actual year, not year - 1900. See individual\n"
239 " fields' descriptions for details.",
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000240 struct_time_type_fields,
241 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000242};
Tim Peters9ad4b682002-02-13 05:14:18 +0000243
Martin v. Löwis19ab6c92006-04-16 18:55:50 +0000244static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000245static PyTypeObject StructTimeType;
246
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000247static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000248tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000249{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000250 PyObject *v = PyStructSequence_New(&StructTimeType);
251 if (v == NULL)
252 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000253
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000254#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
255
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000256 SET(0, p->tm_year + 1900);
257 SET(1, p->tm_mon + 1); /* Want January == 1 */
258 SET(2, p->tm_mday);
259 SET(3, p->tm_hour);
260 SET(4, p->tm_min);
261 SET(5, p->tm_sec);
262 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
263 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
264 SET(8, p->tm_isdst);
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000265#undef SET
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000266 if (PyErr_Occurred()) {
267 Py_XDECREF(v);
268 return NULL;
269 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000270
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000271 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000272}
273
274static PyObject *
Brett Cannon298c3802004-06-19 20:48:43 +0000275time_convert(double when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000276{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000277 struct tm *p;
278 time_t whent = _PyTime_DoubleToTimet(when);
Brett Cannon298c3802004-06-19 20:48:43 +0000279
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000280 if (whent == (time_t)-1 && PyErr_Occurred())
281 return NULL;
282 errno = 0;
283 p = function(&whent);
284 if (p == NULL) {
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000285#ifdef EINVAL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000286 if (errno == 0)
287 errno = EINVAL;
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000288#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000289 return PyErr_SetFromErrno(PyExc_ValueError);
290 }
291 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000292}
293
Fred Drakef901abd2004-08-03 17:58:55 +0000294/* Parse arg tuple that can contain an optional float-or-None value;
295 format needs to be "|O:name".
296 Returns non-zero on success (parallels PyArg_ParseTuple).
297*/
298static int
299parse_time_double_args(PyObject *args, char *format, double *pwhen)
300{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000301 PyObject *ot = NULL;
Fred Drakef901abd2004-08-03 17:58:55 +0000302
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 if (!PyArg_ParseTuple(args, format, &ot))
304 return 0;
305 if (ot == NULL || ot == Py_None)
306 *pwhen = floattime();
307 else {
308 double when = PyFloat_AsDouble(ot);
309 if (PyErr_Occurred())
310 return 0;
311 *pwhen = when;
312 }
313 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000314}
315
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000316static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000317time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000318{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000319 double when;
320 if (!parse_time_double_args(args, "|O:gmtime", &when))
321 return NULL;
322 return time_convert(when, gmtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000323}
324
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000325PyDoc_STRVAR(gmtime_doc,
Brett Cannon8d993aa2007-12-24 19:58:25 +0000326"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000327 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000328\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000329Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000330GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000331
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000332static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000333time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000334{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000335 double when;
336 if (!parse_time_double_args(args, "|O:localtime", &when))
337 return NULL;
338 return time_convert(when, localtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000339}
340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000341PyDoc_STRVAR(localtime_doc,
Brett Cannon8d993aa2007-12-24 19:58:25 +0000342"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000343 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000344\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000345Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000346When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000347
Guido van Rossum9e90a671993-06-24 11:10:19 +0000348static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000349gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000350{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000351 int y;
352 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000353
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000354 if (!PyArg_Parse(args, "(iiiiiiiii)",
355 &y,
356 &p->tm_mon,
357 &p->tm_mday,
358 &p->tm_hour,
359 &p->tm_min,
360 &p->tm_sec,
361 &p->tm_wday,
362 &p->tm_yday,
363 &p->tm_isdst))
364 return 0;
365 if (y < 1900) {
366 PyObject *accept = PyDict_GetItemString(moddict,
367 "accept2dyear");
368 if (accept == NULL || !PyInt_Check(accept) ||
369 PyInt_AsLong(accept) == 0) {
370 PyErr_SetString(PyExc_ValueError,
371 "year >= 1900 required");
372 return 0;
373 }
374 if (69 <= y && y <= 99)
375 y += 1900;
376 else if (0 <= y && y <= 68)
377 y += 2000;
378 else {
379 PyErr_SetString(PyExc_ValueError,
380 "year out of range");
381 return 0;
382 }
383 }
384 p->tm_year = y - 1900;
385 p->tm_mon--;
386 p->tm_wday = (p->tm_wday + 1) % 7;
387 p->tm_yday--;
388 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000389}
390
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200391/* Check values of the struct tm fields before it is passed to strftime() and
392 * asctime(). Return 1 if all values are valid, otherwise set an exception
393 * and returns 0.
394 */
395static int
396checktm(struct tm* buf)
397{
398 /* Checks added to make sure strftime() and asctime() does not crash Python by
399 indexing blindly into some array for a textual representation
400 by some bad index (fixes bug #897625 and #6608).
401
402 Also support values of zero from Python code for arguments in which
403 that is out of range by forcing that value to the lowest value that
404 is valid (fixed bug #1520914).
405
406 Valid ranges based on what is allowed in struct tm:
407
408 - tm_year: [0, max(int)] (1)
409 - tm_mon: [0, 11] (2)
410 - tm_mday: [1, 31]
411 - tm_hour: [0, 23]
412 - tm_min: [0, 59]
413 - tm_sec: [0, 60]
414 - tm_wday: [0, 6] (1)
415 - tm_yday: [0, 365] (2)
416 - tm_isdst: [-max(int), max(int)]
417
418 (1) gettmarg() handles bounds-checking.
419 (2) Python's acceptable range is one greater than the range in C,
420 thus need to check against automatic decrement by gettmarg().
421 */
422 if (buf->tm_mon == -1)
423 buf->tm_mon = 0;
424 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
425 PyErr_SetString(PyExc_ValueError, "month out of range");
426 return 0;
427 }
428 if (buf->tm_mday == 0)
429 buf->tm_mday = 1;
430 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
431 PyErr_SetString(PyExc_ValueError, "day of month out of range");
432 return 0;
433 }
434 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
435 PyErr_SetString(PyExc_ValueError, "hour out of range");
436 return 0;
437 }
438 if (buf->tm_min < 0 || buf->tm_min > 59) {
439 PyErr_SetString(PyExc_ValueError, "minute out of range");
440 return 0;
441 }
442 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
443 PyErr_SetString(PyExc_ValueError, "seconds out of range");
444 return 0;
445 }
446 /* tm_wday does not need checking of its upper-bound since taking
447 ``% 7`` in gettmarg() automatically restricts the range. */
448 if (buf->tm_wday < 0) {
449 PyErr_SetString(PyExc_ValueError, "day of week out of range");
450 return 0;
451 }
452 if (buf->tm_yday == -1)
453 buf->tm_yday = 0;
454 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
455 PyErr_SetString(PyExc_ValueError, "day of year out of range");
456 return 0;
457 }
458 return 1;
459}
460
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000461#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000462static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000463time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000464{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 PyObject *tup = NULL;
466 struct tm buf;
467 const char *fmt;
468 size_t fmtlen, buflen;
469 char *outbuf = 0;
470 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000471
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000472 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000473
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000474 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
475 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000476
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000477 if (tup == NULL) {
478 time_t tt = time(NULL);
479 buf = *localtime(&tt);
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200480 } else if (!gettmarg(tup, &buf)
481 || !checktm(&buf)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000482 return NULL;
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200483 }
Guido van Rossum10b164a2001-09-25 13:59:01 +0000484
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000485 /* Checks added to make sure strftime() does not crash Python by
486 indexing blindly into some array for a textual representation
487 by some bad index (fixes bug #897625).
Tim Peters1b6f7a92004-06-20 02:50:16 +0000488
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000489 Also support values of zero from Python code for arguments in which
490 that is out of range by forcing that value to the lowest value that
491 is valid (fixed bug #1520914).
Brett Cannoncaebe222006-07-18 04:41:36 +0000492
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000493 Valid ranges based on what is allowed in struct tm:
Brett Cannoncaebe222006-07-18 04:41:36 +0000494
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000495 - tm_year: [0, max(int)] (1)
496 - tm_mon: [0, 11] (2)
497 - tm_mday: [1, 31]
498 - tm_hour: [0, 23]
499 - tm_min: [0, 59]
500 - tm_sec: [0, 60]
501 - tm_wday: [0, 6] (1)
502 - tm_yday: [0, 365] (2)
503 - tm_isdst: [-max(int), max(int)]
Brett Cannoncaebe222006-07-18 04:41:36 +0000504
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000505 (1) gettmarg() handles bounds-checking.
506 (2) Python's acceptable range is one greater than the range in C,
507 thus need to check against automatic decrement by gettmarg().
508 */
509 if (buf.tm_mon == -1)
510 buf.tm_mon = 0;
511 else if (buf.tm_mon < 0 || buf.tm_mon > 11) {
512 PyErr_SetString(PyExc_ValueError, "month out of range");
513 return NULL;
514 }
515 if (buf.tm_mday == 0)
516 buf.tm_mday = 1;
517 else if (buf.tm_mday < 0 || buf.tm_mday > 31) {
518 PyErr_SetString(PyExc_ValueError, "day of month out of range");
519 return NULL;
520 }
521 if (buf.tm_hour < 0 || buf.tm_hour > 23) {
522 PyErr_SetString(PyExc_ValueError, "hour out of range");
523 return NULL;
524 }
525 if (buf.tm_min < 0 || buf.tm_min > 59) {
526 PyErr_SetString(PyExc_ValueError, "minute out of range");
527 return NULL;
528 }
529 if (buf.tm_sec < 0 || buf.tm_sec > 61) {
530 PyErr_SetString(PyExc_ValueError, "seconds out of range");
531 return NULL;
532 }
533 /* tm_wday does not need checking of its upper-bound since taking
534 ``% 7`` in gettmarg() automatically restricts the range. */
535 if (buf.tm_wday < 0) {
536 PyErr_SetString(PyExc_ValueError, "day of week out of range");
537 return NULL;
538 }
539 if (buf.tm_yday == -1)
540 buf.tm_yday = 0;
541 else if (buf.tm_yday < 0 || buf.tm_yday > 365) {
542 PyErr_SetString(PyExc_ValueError, "day of year out of range");
543 return NULL;
544 }
545 /* Normalize tm_isdst just in case someone foolishly implements %Z
546 based on the assumption that tm_isdst falls within the range of
547 [-1, 1] */
548 if (buf.tm_isdst < -1)
549 buf.tm_isdst = -1;
550 else if (buf.tm_isdst > 1)
551 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000552
Kristján Valur Jónssonfd4c8722009-02-04 10:05:25 +0000553#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000554 /* check that the format string contains only valid directives */
555 for(outbuf = strchr(fmt, '%');
556 outbuf != NULL;
557 outbuf = strchr(outbuf+2, '%'))
558 {
559 if (outbuf[1]=='#')
560 ++outbuf; /* not documented by python, */
561 if (outbuf[1]=='\0' ||
Senthil Kumaran792eb5d2011-04-06 14:27:47 +0800562 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 {
564 PyErr_SetString(PyExc_ValueError, "Invalid format string");
565 return 0;
566 }
567 }
Kristján Valur Jónssonfd4c8722009-02-04 10:05:25 +0000568#endif
569
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000570 fmtlen = strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000571
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000572 /* I hate these functions that presume you know how big the output
573 * will be ahead of time...
574 */
575 for (i = 1024; ; i += i) {
576 outbuf = (char *)malloc(i);
577 if (outbuf == NULL) {
578 return PyErr_NoMemory();
579 }
580 buflen = strftime(outbuf, i, fmt, &buf);
581 if (buflen > 0 || i >= 256 * fmtlen) {
582 /* If the buffer is 256 times as long as the format,
583 it's probably not failing for lack of room!
584 More likely, the format yields an empty result,
585 e.g. an empty format, or %Z when the timezone
586 is unknown. */
587 PyObject *ret;
588 ret = PyString_FromStringAndSize(outbuf, buflen);
589 free(outbuf);
590 return ret;
591 }
592 free(outbuf);
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +0000593#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000594 /* VisualStudio .NET 2005 does this properly */
595 if (buflen == 0 && errno == EINVAL) {
596 PyErr_SetString(PyExc_ValueError, "Invalid format string");
597 return 0;
598 }
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +0000599#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600
601 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000602}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000603
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000604PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000605"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000606\n\
607Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000608See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000609is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000610#endif /* HAVE_STRFTIME */
611
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000612static PyObject *
613time_strptime(PyObject *self, PyObject *args)
614{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000615 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
616 PyObject *strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 if (!strptime_module)
619 return NULL;
620 strptime_result = PyObject_CallMethod(strptime_module,
621 "_strptime_time", "O", args);
622 Py_DECREF(strptime_module);
623 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000624}
625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000626PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000627"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000628\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000629Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000630See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000631
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000632
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000633static PyObject *
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200634_asctime(struct tm *timeptr)
635{
636 /* Inspired by Open Group reference implementation available at
637 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
638 static const char wday_name[7][4] = {
639 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
640 };
641 static const char mon_name[12][4] = {
642 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
643 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
644 };
645 PyObject *unicode, *str;
646 /* PyString_FromString() cannot be used because it doesn't support %3d */
647 unicode = PyUnicode_FromFormat(
648 "%s %s%3d %.2d:%.2d:%.2d %d",
649 wday_name[timeptr->tm_wday],
650 mon_name[timeptr->tm_mon],
651 timeptr->tm_mday, timeptr->tm_hour,
652 timeptr->tm_min, timeptr->tm_sec,
653 1900 + timeptr->tm_year);
654 if (unicode == NULL) {
655 return NULL;
656 }
657
658 str = PyUnicode_AsASCIIString(unicode);
659 Py_DECREF(unicode);
660 return str;
661}
662
663static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000664time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000665{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000666 PyObject *tup = NULL;
667 struct tm buf;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
669 return NULL;
670 if (tup == NULL) {
671 time_t tt = time(NULL);
672 buf = *localtime(&tt);
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200673 } else if (!gettmarg(tup, &buf)
674 || !checktm(&buf)) {
Alexander Belopolsky8009e8e2011-01-02 23:23:54 +0000675 return NULL;
676 }
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200677 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000678}
679
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000680PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000681"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000682\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000683Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
684When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000685is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000686
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000687static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000688time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000689{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000690 PyObject *ot = NULL;
691 time_t tt;
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200692 struct tm *buf;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000693
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000694 if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))
695 return NULL;
696 if (ot == NULL || ot == Py_None)
697 tt = time(NULL);
698 else {
699 double dt = PyFloat_AsDouble(ot);
700 if (PyErr_Occurred())
701 return NULL;
702 tt = _PyTime_DoubleToTimet(dt);
703 if (tt == (time_t)-1 && PyErr_Occurred())
704 return NULL;
705 }
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200706 buf = localtime(&tt);
707 if (buf == NULL) {
708#ifdef EINVAL
709 if (errno == 0) {
710 errno = EINVAL;
711 }
712#endif
713 return PyErr_SetFromErrno(PyExc_ValueError);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000714 }
Victor Stinnereeadf5f2017-09-06 01:35:39 +0200715 return _asctime(buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000716}
717
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000718PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000719"ctime(seconds) -> string\n\
720\n\
721Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000722This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000723not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000724
Guido van Rossum60cd8131998-03-06 17:16:21 +0000725#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000726static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000727time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000728{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000729 struct tm buf;
730 time_t tt;
731 if (!gettmarg(tup, &buf))
732 return NULL;
Alexander Belopolsky6233b362011-02-15 15:51:17 +0000733 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000734 tt = mktime(&buf);
Alexander Belopolsky6233b362011-02-15 15:51:17 +0000735 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melottic2077b02011-03-16 12:34:31 +0200736 * cannot remain set to -1 if mktime succeeded. */
Alexander Belopolsky6233b362011-02-15 15:51:17 +0000737 if (tt == (time_t)(-1) && buf.tm_wday == -1) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000738 PyErr_SetString(PyExc_OverflowError,
739 "mktime argument out of range");
740 return NULL;
741 }
742 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000743}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000745PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000746"mktime(tuple) -> floating point number\n\
747\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000748Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000749#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000750
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000751#ifdef HAVE_WORKING_TZSET
Skip Montanaro9e0fa7a2008-04-05 19:47:47 +0000752static void inittimezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000753
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000754static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000755time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000756{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000757 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000758
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000759 m = PyImport_ImportModuleNoBlock("time");
760 if (m == NULL) {
761 return NULL;
762 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000763
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000764 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000765
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000766 /* Reset timezone, altzone, daylight and tzname */
767 inittimezone(m);
768 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000769
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000770 Py_INCREF(Py_None);
771 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000772}
773
774PyDoc_STRVAR(tzset_doc,
R. David Murray561b96f2011-02-11 17:25:54 +0000775"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000776\n\
777Initialize, or reinitialize, the local timezone to the value stored in\n\
778os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000779standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000780(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
781fall back to UTC. If the TZ environment variable is not set, the local\n\
782timezone is set to the systems best guess of wallclock time.\n\
783Changing the TZ environment variable without calling tzset *may* change\n\
784the local timezone used by methods such as localtime, but this behaviour\n\
785should not be relied on.");
786#endif /* HAVE_WORKING_TZSET */
787
Skip Montanaro9e0fa7a2008-04-05 19:47:47 +0000788static void
789inittimezone(PyObject *m) {
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000790 /* This code moved from inittime wholesale to allow calling it from
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000791 time_tzset. In the future, some parts of it can be moved back
792 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
793 are), and the extraneous calls to tzset(3) should be removed.
794 I haven't done this yet, as I don't want to change this code as
795 little as possible when introducing the time.tzset and time.tzsetwall
796 methods. This should simply be a method of doing the following once,
797 at the top of this function and removing the call to tzset() from
798 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000799
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000800 #ifdef HAVE_TZSET
801 tzset()
802 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000803
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000804 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000805 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000806#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000807 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000808#ifdef PYOS_OS2
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000809 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000810#else /* !PYOS_OS2 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000812#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000813#ifdef HAVE_ALTZONE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000814 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000815#else
Guido van Rossum26452411998-09-28 22:07:11 +0000816#ifdef PYOS_OS2
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000817 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000818#else /* !PYOS_OS2 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000819 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000820#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000821#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000822 PyModule_AddIntConstant(m, "daylight", daylight);
823 PyModule_AddObject(m, "tzname",
824 Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000825#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000826#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000827 {
Guido van Rossum234f9421993-06-17 12:35:49 +0000828#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000829 time_t t;
830 struct tm *p;
831 long janzone, julyzone;
832 char janname[10], julyname[10];
833 t = (time((time_t *)0) / YEAR) * YEAR;
834 p = localtime(&t);
835 janzone = -p->tm_gmtoff;
836 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
837 janname[9] = '\0';
838 t += YEAR/2;
839 p = localtime(&t);
840 julyzone = -p->tm_gmtoff;
841 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
842 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000843
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000844 if( janzone < julyzone ) {
845 /* DST is reversed in the southern hemisphere */
846 PyModule_AddIntConstant(m, "timezone", julyzone);
847 PyModule_AddIntConstant(m, "altzone", janzone);
848 PyModule_AddIntConstant(m, "daylight",
849 janzone != julyzone);
850 PyModule_AddObject(m, "tzname",
851 Py_BuildValue("(zz)",
852 julyname, janname));
853 } else {
854 PyModule_AddIntConstant(m, "timezone", janzone);
855 PyModule_AddIntConstant(m, "altzone", julyzone);
856 PyModule_AddIntConstant(m, "daylight",
857 janzone != julyzone);
858 PyModule_AddObject(m, "tzname",
859 Py_BuildValue("(zz)",
860 janname, julyname));
861 }
862 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000863#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000864#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000865#ifdef __CYGWIN__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000866 tzset();
867 PyModule_AddIntConstant(m, "timezone", _timezone);
868 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
869 PyModule_AddIntConstant(m, "daylight", _daylight);
870 PyModule_AddObject(m, "tzname",
871 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000872#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000873#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000874}
875
876
877static PyMethodDef time_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000878 {"time", time_time, METH_NOARGS, time_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000879#ifdef HAVE_CLOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000880 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000881#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000882 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
883 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
884 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
885 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
886 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000887#ifdef HAVE_MKTIME
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000888 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000889#endif
890#ifdef HAVE_STRFTIME
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000891 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000892#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000893 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000894#ifdef HAVE_WORKING_TZSET
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000895 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000897 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000898};
899
900
901PyDoc_STRVAR(module_doc,
902"This module provides various functions to manipulate time values.\n\
903\n\
904There are two standard representations of time. One is the number\n\
905of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
906or a floating point number (to represent fractions of seconds).\n\
907The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
908The actual value can be retrieved by calling gmtime(0).\n\
909\n\
910The other representation is a tuple of 9 integers giving local time.\n\
911The tuple items are:\n\
912 year (four digits, e.g. 1998)\n\
913 month (1-12)\n\
914 day (1-31)\n\
915 hours (0-23)\n\
916 minutes (0-59)\n\
917 seconds (0-59)\n\
918 weekday (0-6, Monday is 0)\n\
919 Julian day (day in the year, 1-366)\n\
920 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
921If the DST flag is 0, the time is given in the regular time zone;\n\
922if it is 1, the time is given in the DST time zone;\n\
923if it is -1, mktime() should guess based on the date and time.\n\
924\n\
925Variables:\n\
926\n\
927timezone -- difference in seconds between UTC and local standard time\n\
928altzone -- difference in seconds between UTC and local DST time\n\
929daylight -- whether local time should reflect DST\n\
930tzname -- tuple of (standard time zone name, DST time zone name)\n\
931\n\
932Functions:\n\
933\n\
934time() -- return current time in seconds since the Epoch as a float\n\
935clock() -- return CPU time since process start as a float\n\
936sleep() -- delay for a number of seconds given as a float\n\
937gmtime() -- convert seconds since Epoch to UTC tuple\n\
938localtime() -- convert seconds since Epoch to local time tuple\n\
939asctime() -- convert time tuple to string\n\
940ctime() -- convert time in seconds to string\n\
941mktime() -- convert local time tuple to seconds since Epoch\n\
942strftime() -- convert time tuple to string according to format specification\n\
943strptime() -- parse string to time tuple according to format specification\n\
944tzset() -- change the local timezone");
945
946
947PyMODINIT_FUNC
948inittime(void)
949{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000950 PyObject *m;
951 char *p;
952 m = Py_InitModule3("time", time_methods, module_doc);
953 if (m == NULL)
954 return;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000955
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000956 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
957 p = Py_GETENV("PYTHONY2K");
958 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
Gregory P. Smith0d68ab32012-11-27 10:19:29 -0800959 /* If an embedded interpreter is shutdown and reinitialized the old
960 moddict was not decrefed on shutdown and the next import of this
961 module leads to a leak. Conditionally decref here to prevent that.
962 */
963 Py_XDECREF(moddict);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000964 /* Squirrel away the module's dictionary for the y2k check */
965 moddict = PyModule_GetDict(m);
966 Py_INCREF(moddict);
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000967
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000968 /* Set, or reset, module variables like time.timezone */
969 inittimezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000970
Mark Hammond975e3922002-07-16 01:29:19 +0000971#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000972 /* Helper to allow interrupts for Windows.
973 If Ctrl+C event delivered while not sleeping
974 it will be ignored.
975 */
976 main_thread = PyThread_get_thread_ident();
977 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
978 SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
Mark Hammond975e3922002-07-16 01:29:19 +0000979#endif /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 if (!initialized) {
981 PyStructSequence_InitType(&StructTimeType,
982 &struct_time_type_desc);
983 }
984 Py_INCREF(&StructTimeType);
985 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
986 initialized = 1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000987}
988
989
Guido van Rossumb6775db1994-08-01 11:34:53 +0000990/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000991
Guido van Rossumb6775db1994-08-01 11:34:53 +0000992static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000993floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000994{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000995 /* There are three ways to get the time:
996 (1) gettimeofday() -- resolution in microseconds
997 (2) ftime() -- resolution in milliseconds
998 (3) time() -- resolution in seconds
999 In all cases the return value is a float in seconds.
1000 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
1001 fail, so we fall back on ftime() or time().
1002 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003#ifdef HAVE_GETTIMEOFDAY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001004 {
1005 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001006#ifdef GETTIMEOFDAY_NO_TZ
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001007 if (gettimeofday(&t) == 0)
1008 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001009#else /* !GETTIMEOFDAY_NO_TZ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001010 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
1011 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001012#endif /* !GETTIMEOFDAY_NO_TZ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001013 }
Ronald Oussorend06b6f22006-04-23 11:59:25 +00001014
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015#endif /* !HAVE_GETTIMEOFDAY */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001016 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +00001017#if defined(HAVE_FTIME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001018 struct timeb t;
1019 ftime(&t);
1020 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021#else /* !HAVE_FTIME */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001022 time_t secs;
1023 time(&secs);
1024 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001025#endif /* !HAVE_FTIME */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001026 }
Guido van Rossum426035c1991-02-19 12:27:35 +00001027}
1028
Guido van Rossumb6775db1994-08-01 11:34:53 +00001029
1030/* Implement floatsleep() for various platforms.
1031 When interrupted (or when another error occurs), return -1 and
1032 set an exception; else return 0. */
1033
1034static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001035floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001036{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001037/* XXX Should test for MS_WINDOWS first! */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +00001038#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001039 struct timeval t;
1040 double frac;
1041 frac = fmod(secs, 1.0);
1042 secs = floor(secs);
1043 t.tv_sec = (long)secs;
1044 t.tv_usec = (long)(frac*1000000.0);
1045 Py_BEGIN_ALLOW_THREADS
1046 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001047#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001048 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001049#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001050 if (1) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001051#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001052 Py_BLOCK_THREADS
1053 PyErr_SetFromErrno(PyExc_IOError);
1054 return -1;
1055 }
1056 }
1057 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001058#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 /* XXX Can't interrupt this sleep */
1060 Py_BEGIN_ALLOW_THREADS
1061 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1062 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001063#elif defined(MS_WINDOWS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001064 {
1065 double millisecs = secs * 1000.0;
1066 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001067
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001068 if (millisecs > (double)ULONG_MAX) {
1069 PyErr_SetString(PyExc_OverflowError,
1070 "sleep length is too large");
1071 return -1;
1072 }
1073 Py_BEGIN_ALLOW_THREADS
1074 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1075 * by Guido, only the main thread can be interrupted.
1076 */
1077 ul_millis = (unsigned long)millisecs;
1078 if (ul_millis == 0 ||
1079 main_thread != PyThread_get_thread_ident())
1080 Sleep(ul_millis);
1081 else {
1082 DWORD rc;
1083 ResetEvent(hInterruptEvent);
1084 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
1085 if (rc == WAIT_OBJECT_0) {
1086 /* Yield to make sure real Python signal
1087 * handler called.
1088 */
1089 Sleep(1);
1090 Py_BLOCK_THREADS
1091 errno = EINTR;
1092 PyErr_SetFromErrno(PyExc_IOError);
1093 return -1;
1094 }
1095 }
1096 Py_END_ALLOW_THREADS
1097 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001098#elif defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001099 /* This Sleep *IS* Interruptable by Exceptions */
1100 Py_BEGIN_ALLOW_THREADS
1101 if (DosSleep(secs * 1000) != NO_ERROR) {
1102 Py_BLOCK_THREADS
1103 PyErr_SetFromErrno(PyExc_IOError);
1104 return -1;
1105 }
1106 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001107#elif defined(__BEOS__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001108 /* This sleep *CAN BE* interrupted. */
1109 {
1110 if( secs <= 0.0 ) {
1111 return;
1112 }
Guido van Rossum10b164a2001-09-25 13:59:01 +00001113
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001114 Py_BEGIN_ALLOW_THREADS
1115 /* BeOS snooze() is in microseconds... */
1116 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {
1117 Py_BLOCK_THREADS
1118 PyErr_SetFromErrno( PyExc_IOError );
1119 return -1;
1120 }
1121 Py_END_ALLOW_THREADS
1122 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001123#elif defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 if (secs <= 0.0)
1125 return 0;
1126 Py_BEGIN_ALLOW_THREADS
1127 /* This sleep *CAN BE* interrupted. */
1128 if ( riscos_sleep(secs) )
1129 return -1;
1130 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001131#elif defined(PLAN9)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001132 {
1133 double millisecs = secs * 1000.0;
1134 if (millisecs > (double)LONG_MAX) {
1135 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
1136 return -1;
1137 }
1138 /* This sleep *CAN BE* interrupted. */
1139 Py_BEGIN_ALLOW_THREADS
1140 if(sleep((long)millisecs) < 0){
1141 Py_BLOCK_THREADS
1142 PyErr_SetFromErrno(PyExc_IOError);
1143 return -1;
1144 }
1145 Py_END_ALLOW_THREADS
1146 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001147#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001148 /* XXX Can't interrupt this sleep */
1149 Py_BEGIN_ALLOW_THREADS
1150 sleep((int)secs);
1151 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001152#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001153
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001154 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001155}
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001156
1157/* export floattime to socketmodule.c */
1158PyAPI_FUNC(double)
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -07001159_PyTime_FloatTime(void)
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001160{
1161 return floattime();
1162}