blob: c7acf3a9b548e649ad00fb93b5bbe4e4b6660698 [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
Thomas Wouters477c8d52006-05-27 19:21:47 +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
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000023#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +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{
49 SetEvent(hInterruptEvent);
50 /* allow other default handlers to be called.
51 Default Python handler will setup the
52 KeyboardInterrupt exception.
53 */
54 return FALSE;
55}
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
Thomas Wouters477c8d52006-05-27 19:21:47 +000068#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
69/* Win32 has better clock replacement; we have our own version below. */
70#undef HAVE_CLOCK
71#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 Rossum234f9421993-06-17 12:35:49 +000083/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000084static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000085static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000087/* For Y2K check */
88static PyObject *moddict;
89
Tim Peters1b6f7a92004-06-20 02:50:16 +000090/* Exposed in timefuncs.h. */
91time_t
Brett Cannon298c3802004-06-19 20:48:43 +000092_PyTime_DoubleToTimet(double x)
93{
94 time_t result;
95 double diff;
96
97 result = (time_t)x;
98 /* How much info did we lose? time_t may be an integral or
99 * floating type, and we don't know which. If it's integral,
100 * we don't know whether C truncates, rounds, returns the floor,
101 * etc. If we lost a second or more, the C rounding is
102 * unreasonable, or the input just doesn't fit in a time_t;
103 * call it an error regardless. Note that the original cast to
104 * time_t can cause a C error too, but nothing we can do to
105 * worm around that.
106 */
107 diff = x - (double)result;
108 if (diff <= -1.0 || diff >= 1.0) {
109 PyErr_SetString(PyExc_ValueError,
110 "timestamp out of range for platform time_t");
111 result = (time_t)-1;
112 }
113 return result;
114}
115
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000116static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000117time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000119 double secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000120 secs = floattime();
121 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000122 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000123 return NULL;
124 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000125 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126}
127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000128PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000129"time() -> floating point number\n\
130\n\
131Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000132Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000133
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#ifdef HAVE_CLOCK
135
136#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000137#ifdef CLK_TCK
138#define CLOCKS_PER_SEC CLK_TCK
139#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140#define CLOCKS_PER_SEC 1000000
141#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000142#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000143
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000144static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000145time_clock(PyObject *self, PyObject *unused)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150
Thomas Wouters477c8d52006-05-27 19:21:47 +0000151#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000152/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000153static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000154time_clock(PyObject *self, PyObject *unused)
Guido van Rossum3917c221997-04-02 05:35:28 +0000155{
Tim Peters9ad4b682002-02-13 05:14:18 +0000156 static LARGE_INTEGER ctrStart;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000157 static double divisor = 0.0;
Tim Peters9ad4b682002-02-13 05:14:18 +0000158 LARGE_INTEGER now;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000159 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000160
Mark Hammond7ba5e812002-02-12 04:02:33 +0000161 if (divisor == 0.0) {
Tim Peters9ad4b682002-02-13 05:14:18 +0000162 LARGE_INTEGER freq;
163 QueryPerformanceCounter(&ctrStart);
164 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
Mark Hammond7ba5e812002-02-12 04:02:33 +0000165 /* Unlikely to happen - this works on all intel
166 machines at least! Revert to clock() */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000167 return PyFloat_FromDouble(((double)clock()) /
168 CLOCKS_PER_SEC);
Guido van Rossum3917c221997-04-02 05:35:28 +0000169 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000170 divisor = (double)freq.QuadPart;
Guido van Rossum3917c221997-04-02 05:35:28 +0000171 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000172 QueryPerformanceCounter(&now);
173 diff = (double)(now.QuadPart - ctrStart.QuadPart);
Mark Hammond7ba5e812002-02-12 04:02:33 +0000174 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000175}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000176
Guido van Rossum3917c221997-04-02 05:35:28 +0000177#define HAVE_CLOCK /* So it gets included in the methods */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000178#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +0000179
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000180#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000181PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000182"clock() -> floating point number\n\
183\n\
184Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000185the first call to clock(). This has as much precision as the system\n\
186records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000187#endif
188
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000189static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000190time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000192 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000193 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000195 if (floatsleep(secs) != 0)
196 return NULL;
197 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000198 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199}
200
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000201PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000202"sleep(seconds)\n\
203\n\
204Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000205a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000206
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000207static PyStructSequence_Field struct_time_type_fields[] = {
208 {"tm_year", NULL},
209 {"tm_mon", NULL},
210 {"tm_mday", NULL},
211 {"tm_hour", NULL},
212 {"tm_min", NULL},
213 {"tm_sec", NULL},
214 {"tm_wday", NULL},
215 {"tm_yday", NULL},
216 {"tm_isdst", NULL},
217 {0}
218};
219
220static PyStructSequence_Desc struct_time_type_desc = {
Guido van Rossum14648392001-12-08 18:02:58 +0000221 "time.struct_time",
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000222 NULL,
223 struct_time_type_fields,
224 9,
225};
Tim Peters9ad4b682002-02-13 05:14:18 +0000226
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000227static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000228static PyTypeObject StructTimeType;
229
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000230static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000231tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000232{
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000233 PyObject *v = PyStructSequence_New(&StructTimeType);
234 if (v == NULL)
235 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000236
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000237#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
238
239 SET(0, p->tm_year + 1900);
240 SET(1, p->tm_mon + 1); /* Want January == 1 */
241 SET(2, p->tm_mday);
242 SET(3, p->tm_hour);
243 SET(4, p->tm_min);
244 SET(5, p->tm_sec);
245 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
246 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
247 SET(8, p->tm_isdst);
248#undef SET
249 if (PyErr_Occurred()) {
250 Py_XDECREF(v);
251 return NULL;
252 }
253
254 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000255}
256
257static PyObject *
Skip Montanaro41cfce92007-08-24 21:11:00 +0000258structtime_totuple(PyObject *t)
259{
260 PyObject *x = NULL;
261 unsigned int i;
262 PyObject *v = PyTuple_New(9);
263 if (v == NULL)
264 return NULL;
265
266 for (i=0; i<9; i++) {
267 x = PyStructSequence_GET_ITEM(t, i);
268 Py_INCREF(x);
269 PyTuple_SET_ITEM(v, i, x);
270 }
271
272 if (PyErr_Occurred()) {
273 Py_XDECREF(v);
274 return NULL;
275 }
276
277 return v;
278}
279
280static PyObject *
Brett Cannon298c3802004-06-19 20:48:43 +0000281time_convert(double when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000282{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000283 struct tm *p;
Brett Cannon298c3802004-06-19 20:48:43 +0000284 time_t whent = _PyTime_DoubleToTimet(when);
285
286 if (whent == (time_t)-1 && PyErr_Occurred())
287 return NULL;
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000288 errno = 0;
Brett Cannon298c3802004-06-19 20:48:43 +0000289 p = function(&whent);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000290 if (p == NULL) {
291#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000292 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000293 errno = EINVAL;
294#endif
Tim Peters8b19a932003-01-17 20:08:54 +0000295 return PyErr_SetFromErrno(PyExc_ValueError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000296 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000297 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000298}
299
Fred Drakef901abd2004-08-03 17:58:55 +0000300/* Parse arg tuple that can contain an optional float-or-None value;
301 format needs to be "|O:name".
302 Returns non-zero on success (parallels PyArg_ParseTuple).
303*/
304static int
305parse_time_double_args(PyObject *args, char *format, double *pwhen)
306{
307 PyObject *ot = NULL;
308
309 if (!PyArg_ParseTuple(args, format, &ot))
310 return 0;
311 if (ot == NULL || ot == Py_None)
312 *pwhen = floattime();
313 else {
314 double when = PyFloat_AsDouble(ot);
315 if (PyErr_Occurred())
316 return 0;
317 *pwhen = when;
318 }
319 return 1;
320}
321
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000322static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000323time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000324{
325 double when;
Fred Drakef901abd2004-08-03 17:58:55 +0000326 if (!parse_time_double_args(args, "|O:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000327 return NULL;
Brett Cannon298c3802004-06-19 20:48:43 +0000328 return time_convert(when, gmtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000329}
330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000331PyDoc_STRVAR(gmtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000332"gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\n\
333 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000334\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000335Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000336GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000337
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000338static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000339time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000340{
341 double when;
Fred Drakef901abd2004-08-03 17:58:55 +0000342 if (!parse_time_double_args(args, "|O:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000343 return NULL;
Brett Cannon298c3802004-06-19 20:48:43 +0000344 return time_convert(when, localtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000345}
346
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000347PyDoc_STRVAR(localtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000348"localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000349\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000350Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000351When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000352
Guido van Rossum9e90a671993-06-24 11:10:19 +0000353static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000354gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000355{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000356 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000357 memset((void *) p, '\0', sizeof(struct tm));
Skip Montanaro41cfce92007-08-24 21:11:00 +0000358 PyObject *t = NULL;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000359
Skip Montanaro41cfce92007-08-24 21:11:00 +0000360 if (PyTuple_Check(args)) {
361 t = args;
362 Py_INCREF(t);
363 }
364 else if (Py_Type(args) == &StructTimeType) {
365 t = structtime_totuple(args);
366 }
367 else {
368 PyErr_SetString(PyExc_TypeError,
369 "Tuple or struct_time argument required");
Guido van Rossum9e90a671993-06-24 11:10:19 +0000370 return 0;
Skip Montanaro41cfce92007-08-24 21:11:00 +0000371 }
372
373 if (t == NULL || !PyArg_ParseTuple(t, "iiiiiiiii",
374 &y,
375 &p->tm_mon,
376 &p->tm_mday,
377 &p->tm_hour,
378 &p->tm_min,
379 &p->tm_sec,
380 &p->tm_wday,
381 &p->tm_yday,
382 &p->tm_isdst)) {
383 Py_XDECREF(t);
384 return 0;
385 }
386 Py_DECREF(t);
387
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000388 if (y < 1900) {
389 PyObject *accept = PyDict_GetItemString(moddict,
390 "accept2dyear");
Guido van Rossumddefaf32007-01-14 03:31:43 +0000391 if (accept == NULL || !PyInt_CheckExact(accept) ||
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000392 PyInt_AsLong(accept) == 0) {
393 PyErr_SetString(PyExc_ValueError,
394 "year >= 1900 required");
395 return 0;
396 }
397 if (69 <= y && y <= 99)
398 y += 1900;
399 else if (0 <= y && y <= 68)
400 y += 2000;
401 else {
402 PyErr_SetString(PyExc_ValueError,
Skip Montanaro1a10aac2001-08-22 12:39:16 +0000403 "year out of range");
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000404 return 0;
405 }
406 }
407 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000408 p->tm_mon--;
409 p->tm_wday = (p->tm_wday + 1) % 7;
410 p->tm_yday--;
411 return 1;
412}
413
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000414#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000415static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000416time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000417{
Thomas Woutersfe385252001-01-19 23:16:56 +0000418 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000419 struct tm buf;
420 const char *fmt;
Guido van Rossumeda12ec2007-08-24 03:51:52 +0000421 PyObject *format;
Guido van Rossumfa481162000-06-28 21:33:59 +0000422 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000423 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000424 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000425
Thomas Wouters334fb892000-07-25 12:56:38 +0000426 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000427
Guido van Rossumeda12ec2007-08-24 03:51:52 +0000428 /* Will always expect a unicode string to be passed as format.
429 Given that there's no str type anymore in py3k this seems safe.
430 */
431 if (!PyArg_ParseTuple(args, "U|O:strftime", &format, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000432 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000433
434 if (tup == NULL) {
435 time_t tt = time(NULL);
436 buf = *localtime(&tt);
437 } else if (!gettmarg(tup, &buf))
438 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000439
Brett Cannond1080a32004-03-02 04:38:10 +0000440 /* Checks added to make sure strftime() does not crash Python by
441 indexing blindly into some array for a textual representation
442 by some bad index (fixes bug #897625).
Tim Peters1b6f7a92004-06-20 02:50:16 +0000443
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000444 Also support values of zero from Python code for arguments in which
445 that is out of range by forcing that value to the lowest value that
446 is valid (fixed bug #1520914).
447
448 Valid ranges based on what is allowed in struct tm:
449
450 - tm_year: [0, max(int)] (1)
451 - tm_mon: [0, 11] (2)
452 - tm_mday: [1, 31]
453 - tm_hour: [0, 23]
454 - tm_min: [0, 59]
455 - tm_sec: [0, 60]
456 - tm_wday: [0, 6] (1)
457 - tm_yday: [0, 365] (2)
458 - tm_isdst: [-max(int), max(int)]
459
460 (1) gettmarg() handles bounds-checking.
461 (2) Python's acceptable range is one greater than the range in C,
462 thus need to check against automatic decrement by gettmarg().
Brett Cannond1080a32004-03-02 04:38:10 +0000463 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464 if (buf.tm_mon == -1)
465 buf.tm_mon = 0;
466 else if (buf.tm_mon < 0 || buf.tm_mon > 11) {
Brett Cannond1080a32004-03-02 04:38:10 +0000467 PyErr_SetString(PyExc_ValueError, "month out of range");
468 return NULL;
469 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470 if (buf.tm_mday == 0)
471 buf.tm_mday = 1;
472 else if (buf.tm_mday < 0 || buf.tm_mday > 31) {
Brett Cannond1080a32004-03-02 04:38:10 +0000473 PyErr_SetString(PyExc_ValueError, "day of month out of range");
474 return NULL;
475 }
476 if (buf.tm_hour < 0 || buf.tm_hour > 23) {
477 PyErr_SetString(PyExc_ValueError, "hour out of range");
478 return NULL;
479 }
480 if (buf.tm_min < 0 || buf.tm_min > 59) {
481 PyErr_SetString(PyExc_ValueError, "minute out of range");
482 return NULL;
483 }
484 if (buf.tm_sec < 0 || buf.tm_sec > 61) {
485 PyErr_SetString(PyExc_ValueError, "seconds out of range");
486 return NULL;
487 }
488 /* tm_wday does not need checking of its upper-bound since taking
489 ``% 7`` in gettmarg() automatically restricts the range. */
490 if (buf.tm_wday < 0) {
491 PyErr_SetString(PyExc_ValueError, "day of week out of range");
492 return NULL;
493 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000494 if (buf.tm_yday == -1)
495 buf.tm_yday = 0;
496 else if (buf.tm_yday < 0 || buf.tm_yday > 365) {
Brett Cannond1080a32004-03-02 04:38:10 +0000497 PyErr_SetString(PyExc_ValueError, "day of year out of range");
498 return NULL;
499 }
500 if (buf.tm_isdst < -1 || buf.tm_isdst > 1) {
501 PyErr_SetString(PyExc_ValueError,
502 "daylight savings flag out of range");
503 return NULL;
504 }
505
Guido van Rossumeda12ec2007-08-24 03:51:52 +0000506 /* Convert the unicode string to an ascii one */
507 fmt = PyUnicode_AsString(format);
508
Guido van Rossumc222ec21999-02-23 00:00:10 +0000509 fmtlen = strlen(fmt);
510
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000511 /* I hate these functions that presume you know how big the output
512 * will be ahead of time...
513 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000514 for (i = 1024; ; i += i) {
Walter Dörwaldcf47af42007-05-31 19:23:17 +0000515 outbuf = (char *)PyMem_Malloc(i);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000516 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000517 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000518 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000519 buflen = strftime(outbuf, i, fmt, &buf);
520 if (buflen > 0 || i >= 256 * fmtlen) {
521 /* If the buffer is 256 times as long as the format,
522 it's probably not failing for lack of room!
523 More likely, the format yields an empty result,
524 e.g. an empty format, or %Z when the timezone
525 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000526 PyObject *ret;
Walter Dörwaldcf47af42007-05-31 19:23:17 +0000527 ret = PyUnicode_FromStringAndSize(outbuf, buflen);
528 PyMem_Free(outbuf);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000529 return ret;
530 }
Walter Dörwaldcf47af42007-05-31 19:23:17 +0000531 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000532#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
533 /* VisualStudio .NET 2005 does this properly */
534 if (buflen == 0 && errno == EINVAL) {
535 PyErr_SetString(PyExc_ValueError, "Invalid format string");
536 return 0;
537 }
538#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000539 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000540}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000541
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000542PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000543"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000544\n\
545Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000546See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000547is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000548#endif /* HAVE_STRFTIME */
549
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000550static PyObject *
551time_strptime(PyObject *self, PyObject *args)
552{
553 PyObject *strptime_module = PyImport_ImportModule("_strptime");
Raymond Hettinger502168a2003-04-10 16:03:22 +0000554 PyObject *strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000555
Tim Peters513a1cd2003-01-19 04:54:58 +0000556 if (!strptime_module)
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000557 return NULL;
Raymond Hettinger502168a2003-04-10 16:03:22 +0000558 strptime_result = PyObject_CallMethod(strptime_module, "strptime", "O", args);
559 Py_DECREF(strptime_module);
560 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000561}
562
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000563PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000564"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000565\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000566Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000567See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000568
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000569
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000570static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000571time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000572{
Thomas Woutersfe385252001-01-19 23:16:56 +0000573 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000574 struct tm buf;
575 char *p;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000576 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000577 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000578 if (tup == NULL) {
579 time_t tt = time(NULL);
580 buf = *localtime(&tt);
581 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000582 return NULL;
583 p = asctime(&buf);
584 if (p[24] == '\n')
585 p[24] = '\0';
Guido van Rossumeda12ec2007-08-24 03:51:52 +0000586 return PyUnicode_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000587}
588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000589PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000590"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000591\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000592Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
593When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000594is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000595
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000596static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000597time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000598{
Fred Drakef901abd2004-08-03 17:58:55 +0000599 PyObject *ot = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000600 time_t tt;
601 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000602
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000603 if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))
Fred Drakef901abd2004-08-03 17:58:55 +0000604 return NULL;
605 if (ot == NULL || ot == Py_None)
Thomas Woutersfe385252001-01-19 23:16:56 +0000606 tt = time(NULL);
607 else {
Fred Drakef901abd2004-08-03 17:58:55 +0000608 double dt = PyFloat_AsDouble(ot);
609 if (PyErr_Occurred())
Thomas Woutersfe385252001-01-19 23:16:56 +0000610 return NULL;
Brett Cannon298c3802004-06-19 20:48:43 +0000611 tt = _PyTime_DoubleToTimet(dt);
612 if (tt == (time_t)-1 && PyErr_Occurred())
613 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000614 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000615 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000616 if (p == NULL) {
617 PyErr_SetString(PyExc_ValueError, "unconvertible time");
618 return NULL;
619 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000620 if (p[24] == '\n')
621 p[24] = '\0';
Guido van Rossumeda12ec2007-08-24 03:51:52 +0000622 return PyUnicode_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000623}
624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000625PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000626"ctime(seconds) -> string\n\
627\n\
628Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000629This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000630not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000631
Guido van Rossum60cd8131998-03-06 17:16:21 +0000632#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000633static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000634time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000635{
636 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000637 time_t tt;
638 tt = time(&tt);
639 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000640 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000641 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000642 tt = mktime(&buf);
643 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000644 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum10b164a2001-09-25 13:59:01 +0000645 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000646 return NULL;
647 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000648 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000649}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000650
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000651PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000652"mktime(tuple) -> floating point number\n\
653\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000654Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000655#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000656
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000657#ifdef HAVE_WORKING_TZSET
658void inittimezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000660static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000661time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662{
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000663 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000664
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000665 m = PyImport_ImportModule("time");
666 if (m == NULL) {
667 return NULL;
668 }
669
670 tzset();
671
672 /* Reset timezone, altzone, daylight and tzname */
673 inittimezone(m);
674 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000675
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000676 Py_INCREF(Py_None);
677 return Py_None;
678}
679
680PyDoc_STRVAR(tzset_doc,
681"tzset(zone)\n\
682\n\
683Initialize, or reinitialize, the local timezone to the value stored in\n\
684os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000685standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000686(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
687fall back to UTC. If the TZ environment variable is not set, the local\n\
688timezone is set to the systems best guess of wallclock time.\n\
689Changing the TZ environment variable without calling tzset *may* change\n\
690the local timezone used by methods such as localtime, but this behaviour\n\
691should not be relied on.");
692#endif /* HAVE_WORKING_TZSET */
693
694void inittimezone(PyObject *m) {
695 /* This code moved from inittime wholesale to allow calling it from
696 time_tzset. In the future, some parts of it can be moved back
697 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
698 are), and the extranious calls to tzset(3) should be removed.
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000699 I haven't done this yet, as I don't want to change this code as
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000700 little as possible when introducing the time.tzset and time.tzsetwall
701 methods. This should simply be a method of doing the following once,
702 at the top of this function and removing the call to tzset() from
703 time_tzset():
704
705 #ifdef HAVE_TZSET
706 tzset()
707 #endif
708
709 And I'm lazy and hate C so nyer.
710 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000711#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000712 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000713#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000714 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000715#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000716 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000717#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000718#ifdef HAVE_ALTZONE
Fred Drake9bb74322002-04-01 14:49:59 +0000719 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720#else
Guido van Rossum26452411998-09-28 22:07:11 +0000721#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000722 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000723#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000724 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000725#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000726#endif
Fred Drake9bb74322002-04-01 14:49:59 +0000727 PyModule_AddIntConstant(m, "daylight", daylight);
728 PyModule_AddObject(m, "tzname",
729 Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000730#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000731#ifdef HAVE_STRUCT_TM_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000732 {
733#define YEAR ((time_t)((365 * 24 + 6) * 3600))
734 time_t t;
735 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000736 long janzone, julyzone;
737 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000738 t = (time((time_t *)0) / YEAR) * YEAR;
739 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000740 janzone = -p->tm_gmtoff;
741 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
742 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000743 t += YEAR/2;
744 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000745 julyzone = -p->tm_gmtoff;
746 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
747 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000748
Guido van Rossum57731601999-03-29 19:12:04 +0000749 if( janzone < julyzone ) {
750 /* DST is reversed in the southern hemisphere */
Fred Drake9bb74322002-04-01 14:49:59 +0000751 PyModule_AddIntConstant(m, "timezone", julyzone);
752 PyModule_AddIntConstant(m, "altzone", janzone);
753 PyModule_AddIntConstant(m, "daylight",
754 janzone != julyzone);
755 PyModule_AddObject(m, "tzname",
756 Py_BuildValue("(zz)",
757 julyname, janname));
Guido van Rossum57731601999-03-29 19:12:04 +0000758 } else {
Fred Drake9bb74322002-04-01 14:49:59 +0000759 PyModule_AddIntConstant(m, "timezone", janzone);
760 PyModule_AddIntConstant(m, "altzone", julyzone);
761 PyModule_AddIntConstant(m, "daylight",
762 janzone != julyzone);
763 PyModule_AddObject(m, "tzname",
764 Py_BuildValue("(zz)",
765 janname, julyname));
Guido van Rossum57731601999-03-29 19:12:04 +0000766 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000767 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000768#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000769#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000770#ifdef __CYGWIN__
771 tzset();
Fred Drake9bb74322002-04-01 14:49:59 +0000772 PyModule_AddIntConstant(m, "timezone", _timezone);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000773 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Fred Drake9bb74322002-04-01 14:49:59 +0000774 PyModule_AddIntConstant(m, "daylight", _daylight);
775 PyModule_AddObject(m, "tzname",
776 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000777#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000778#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000779}
780
781
782static PyMethodDef time_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000783 {"time", time_time, METH_NOARGS, time_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000784#ifdef HAVE_CLOCK
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000785 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000786#endif
787 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
788 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
789 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
790 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
791 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
792#ifdef HAVE_MKTIME
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000793 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000794#endif
795#ifdef HAVE_STRFTIME
796 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
797#endif
798 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
799#ifdef HAVE_WORKING_TZSET
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000800 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000801#endif
802 {NULL, NULL} /* sentinel */
803};
804
805
806PyDoc_STRVAR(module_doc,
807"This module provides various functions to manipulate time values.\n\
808\n\
809There are two standard representations of time. One is the number\n\
810of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
811or a floating point number (to represent fractions of seconds).\n\
812The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
813The actual value can be retrieved by calling gmtime(0).\n\
814\n\
815The other representation is a tuple of 9 integers giving local time.\n\
816The tuple items are:\n\
817 year (four digits, e.g. 1998)\n\
818 month (1-12)\n\
819 day (1-31)\n\
820 hours (0-23)\n\
821 minutes (0-59)\n\
822 seconds (0-59)\n\
823 weekday (0-6, Monday is 0)\n\
824 Julian day (day in the year, 1-366)\n\
825 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
826If the DST flag is 0, the time is given in the regular time zone;\n\
827if it is 1, the time is given in the DST time zone;\n\
828if it is -1, mktime() should guess based on the date and time.\n\
829\n\
830Variables:\n\
831\n\
832timezone -- difference in seconds between UTC and local standard time\n\
833altzone -- difference in seconds between UTC and local DST time\n\
834daylight -- whether local time should reflect DST\n\
835tzname -- tuple of (standard time zone name, DST time zone name)\n\
836\n\
837Functions:\n\
838\n\
839time() -- return current time in seconds since the Epoch as a float\n\
840clock() -- return CPU time since process start as a float\n\
841sleep() -- delay for a number of seconds given as a float\n\
842gmtime() -- convert seconds since Epoch to UTC tuple\n\
843localtime() -- convert seconds since Epoch to local time tuple\n\
844asctime() -- convert time tuple to string\n\
845ctime() -- convert time in seconds to string\n\
846mktime() -- convert local time tuple to seconds since Epoch\n\
847strftime() -- convert time tuple to string according to format specification\n\
848strptime() -- parse string to time tuple according to format specification\n\
849tzset() -- change the local timezone");
850
851
852PyMODINIT_FUNC
853inittime(void)
854{
855 PyObject *m;
856 char *p;
857 m = Py_InitModule3("time", time_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000858 if (m == NULL)
859 return;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000860
861 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
862 p = Py_GETENV("PYTHONY2K");
863 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
864 /* Squirrel away the module's dictionary for the y2k check */
865 moddict = PyModule_GetDict(m);
866 Py_INCREF(moddict);
867
868 /* Set, or reset, module variables like time.timezone */
869 inittimezone(m);
870
Mark Hammond975e3922002-07-16 01:29:19 +0000871#ifdef MS_WINDOWS
872 /* Helper to allow interrupts for Windows.
873 If Ctrl+C event delivered while not sleeping
874 it will be ignored.
875 */
876 main_thread = PyThread_get_thread_ident();
877 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
878 SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
879#endif /* MS_WINDOWS */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000880 if (!initialized) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000881 PyStructSequence_InitType(&StructTimeType,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000882 &struct_time_type_desc);
883 }
Fred Drake9bb74322002-04-01 14:49:59 +0000884 Py_INCREF(&StructTimeType);
885 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000886 initialized = 1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000887}
888
889
Guido van Rossumb6775db1994-08-01 11:34:53 +0000890/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000891
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000893floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000894{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000895 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000896 (1) gettimeofday() -- resolution in microseconds
897 (2) ftime() -- resolution in milliseconds
898 (3) time() -- resolution in seconds
899 In all cases the return value is a float in seconds.
900 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
901 fail, so we fall back on ftime() or time().
902 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000904 {
905 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000906#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000907 if (gettimeofday(&t) == 0)
908 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000909#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000910 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
911 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000912#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000913 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000914
Guido van Rossumb6775db1994-08-01 11:34:53 +0000915#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000916 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000917#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000918 struct timeb t;
919 ftime(&t);
920 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000922 time_t secs;
923 time(&secs);
924 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000925#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000926 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000927}
928
Guido van Rossumb6775db1994-08-01 11:34:53 +0000929
930/* Implement floatsleep() for various platforms.
931 When interrupted (or when another error occurs), return -1 and
932 set an exception; else return 0. */
933
934static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000935floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000936{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000937/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000938#if defined(HAVE_SELECT) && !defined(__EMX__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000939 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000940 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000941 frac = fmod(secs, 1.0);
942 secs = floor(secs);
943 t.tv_sec = (long)secs;
944 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000945 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000946 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000947#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000948 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000949#else
950 if (1) {
951#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000952 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000953 PyErr_SetFromErrno(PyExc_IOError);
954 return -1;
955 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000956 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000957 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000958#elif defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000959 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000960 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000961 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000962 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000963#elif defined(MS_WINDOWS)
Fred Drake0e123952000-06-29 21:31:02 +0000964 {
965 double millisecs = secs * 1000.0;
Tim Peters513a1cd2003-01-19 04:54:58 +0000966 unsigned long ul_millis;
967
Fred Drake0e123952000-06-29 21:31:02 +0000968 if (millisecs > (double)ULONG_MAX) {
Tim Peters513a1cd2003-01-19 04:54:58 +0000969 PyErr_SetString(PyExc_OverflowError,
970 "sleep length is too large");
Fred Drake0e123952000-06-29 21:31:02 +0000971 return -1;
972 }
Fred Drake0e123952000-06-29 21:31:02 +0000973 Py_BEGIN_ALLOW_THREADS
Tim Peters513a1cd2003-01-19 04:54:58 +0000974 /* Allow sleep(0) to maintain win32 semantics, and as decreed
975 * by Guido, only the main thread can be interrupted.
976 */
977 ul_millis = (unsigned long)millisecs;
978 if (ul_millis == 0 ||
979 main_thread != PyThread_get_thread_ident())
980 Sleep(ul_millis);
Mark Hammond975e3922002-07-16 01:29:19 +0000981 else {
982 DWORD rc;
983 ResetEvent(hInterruptEvent);
Tim Peters513a1cd2003-01-19 04:54:58 +0000984 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
985 if (rc == WAIT_OBJECT_0) {
986 /* Yield to make sure real Python signal
987 * handler called.
988 */
Mark Hammond975e3922002-07-16 01:29:19 +0000989 Sleep(1);
990 Py_BLOCK_THREADS
Mark Hammond975e3922002-07-16 01:29:19 +0000991 errno = EINTR;
992 PyErr_SetFromErrno(PyExc_IOError);
993 return -1;
994 }
995 }
Fred Drake0e123952000-06-29 21:31:02 +0000996 Py_END_ALLOW_THREADS
997 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000998#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000999 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +00001000 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001001 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +00001002 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001003 PyErr_SetFromErrno(PyExc_IOError);
1004 return -1;
1005 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +00001006 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001007#elif defined(PLAN9)
1008 {
1009 double millisecs = secs * 1000.0;
1010 if (millisecs > (double)LONG_MAX) {
1011 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
1012 return -1;
1013 }
1014 /* This sleep *CAN BE* interrupted. */
1015 Py_BEGIN_ALLOW_THREADS
1016 if(sleep((long)millisecs) < 0){
1017 Py_BLOCK_THREADS
1018 PyErr_SetFromErrno(PyExc_IOError);
1019 return -1;
1020 }
1021 Py_END_ALLOW_THREADS
1022 }
1023#else
Guido van Rossumb6775db1994-08-01 11:34:53 +00001024 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +00001025 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +00001027 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001028#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001029
Guido van Rossumb6775db1994-08-01 11:34:53 +00001030 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001031}
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001032
1033