blob: faed0e18f2f5b9f0aecacf1473613f9163ec066b [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
Martin v. Löwis8a7c8662007-08-30 15:40:24 +00008#define TZNAME_ENCODING "utf-8"
9
Thomas Wouters477c8d52006-05-27 19:21:47 +000010#ifdef __APPLE__
11#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
12 /*
13 * floattime falls back to ftime when getttimeofday fails because the latter
14 * might fail on some platforms. This fallback is unwanted on MacOSX because
15 * that makes it impossible to use a binary build on OSX 10.4 on earlier
16 * releases of the OS. Therefore claim we don't support ftime.
17 */
18# undef HAVE_FTIME
19#endif
20#endif
21
Guido van Rossum87ce7bb1998-06-09 16:30:31 +000022#include <ctype.h>
23
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000025#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000026#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum6d946f91992-08-14 13:49:30 +000027
Guido van Rossumb6775db1994-08-01 11:34:53 +000028#ifdef QUICKWIN
29#include <io.h>
30#endif
31
Guido van Rossumb6775db1994-08-01 11:34:53 +000032#ifdef HAVE_FTIME
33#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000034#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000035extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000036#endif /* MS_WINDOWS */
37#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038
Guido van Rossum7bf22de1997-12-02 20:34:19 +000039#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000040#include <i86.h>
41#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000042#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000043#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000044#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000045#include "pythread.h"
46
47/* helper to allow us to interrupt sleep() on Windows*/
48static HANDLE hInterruptEvent = NULL;
49static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
50{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000051 SetEvent(hInterruptEvent);
52 /* allow other default handlers to be called.
53 Default Python handler will setup the
54 KeyboardInterrupt exception.
55 */
56 return FALSE;
Mark Hammond975e3922002-07-16 01:29:19 +000057}
58static long main_thread;
59
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000060#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000061/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000062#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000063#define tzname _tzname
64#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000065#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000066#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000067#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000068
Thomas Wouters477c8d52006-05-27 19:21:47 +000069#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
70/* Win32 has better clock replacement; we have our own version below. */
71#undef HAVE_CLOCK
Martin v. Löwis3bb00702007-08-30 14:37:48 +000072#undef TZNAME_ENCODING
73#define TZNAME_ENCODING "mbcs"
Thomas Wouters477c8d52006-05-27 19:21:47 +000074#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +000075
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000076#if defined(PYOS_OS2)
77#define INCL_DOS
78#define INCL_ERRORS
79#include <os2.h>
80#endif
81
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000082#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000083#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000084#endif
85
Guido van Rossum234f9421993-06-17 12:35:49 +000086/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000087static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000088static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000090/* For Y2K check */
91static PyObject *moddict;
92
Tim Peters1b6f7a92004-06-20 02:50:16 +000093/* Exposed in timefuncs.h. */
94time_t
Brett Cannon298c3802004-06-19 20:48:43 +000095_PyTime_DoubleToTimet(double x)
96{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000097 time_t result;
98 double diff;
Brett Cannon298c3802004-06-19 20:48:43 +000099
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000100 result = (time_t)x;
101 /* How much info did we lose? time_t may be an integral or
102 * floating type, and we don't know which. If it's integral,
103 * we don't know whether C truncates, rounds, returns the floor,
104 * etc. If we lost a second or more, the C rounding is
105 * unreasonable, or the input just doesn't fit in a time_t;
106 * call it an error regardless. Note that the original cast to
107 * time_t can cause a C error too, but nothing we can do to
108 * worm around that.
109 */
110 diff = x - (double)result;
111 if (diff <= -1.0 || diff >= 1.0) {
112 PyErr_SetString(PyExc_ValueError,
113 "timestamp out of range for platform time_t");
114 result = (time_t)-1;
115 }
116 return result;
Brett Cannon298c3802004-06-19 20:48:43 +0000117}
118
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000119static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000120time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000122 double secs;
123 secs = floattime();
124 if (secs == 0.0) {
125 PyErr_SetFromErrno(PyExc_IOError);
126 return NULL;
127 }
128 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000129}
130
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000131PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000132"time() -> floating point number\n\
133\n\
134Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000135Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000136
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137#ifdef HAVE_CLOCK
138
139#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000140#ifdef CLK_TCK
141#define CLOCKS_PER_SEC CLK_TCK
142#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000143#define CLOCKS_PER_SEC 1000000
144#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000145#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000148time_clock(PyObject *self, PyObject *unused)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000150 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000152#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153
Thomas Wouters477c8d52006-05-27 19:21:47 +0000154#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000155/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000156static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000157time_clock(PyObject *self, PyObject *unused)
Guido van Rossum3917c221997-04-02 05:35:28 +0000158{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000159 static LARGE_INTEGER ctrStart;
160 static double divisor = 0.0;
161 LARGE_INTEGER now;
162 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000163
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000164 if (divisor == 0.0) {
165 LARGE_INTEGER freq;
166 QueryPerformanceCounter(&ctrStart);
167 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
168 /* Unlikely to happen - this works on all intel
169 machines at least! Revert to clock() */
170 return PyFloat_FromDouble(((double)clock()) /
171 CLOCKS_PER_SEC);
172 }
173 divisor = (double)freq.QuadPart;
174 }
175 QueryPerformanceCounter(&now);
176 diff = (double)(now.QuadPart - ctrStart.QuadPart);
177 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000178}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000179
Guido van Rossum3917c221997-04-02 05:35:28 +0000180#define HAVE_CLOCK /* So it gets included in the methods */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000181#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +0000182
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000183#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000184PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000185"clock() -> floating point number\n\
186\n\
187Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000188the first call to clock(). This has as much precision as the system\n\
189records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000190#endif
191
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000192static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000193time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000195 double secs;
196 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
197 return NULL;
198 if (floatsleep(secs) != 0)
199 return NULL;
200 Py_INCREF(Py_None);
201 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202}
203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000204PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000205"sleep(seconds)\n\
206\n\
207Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000208a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000209
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000210static PyStructSequence_Field struct_time_type_fields[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000211 {"tm_year", NULL},
212 {"tm_mon", NULL},
213 {"tm_mday", NULL},
214 {"tm_hour", NULL},
215 {"tm_min", NULL},
216 {"tm_sec", NULL},
217 {"tm_wday", NULL},
218 {"tm_yday", NULL},
219 {"tm_isdst", NULL},
220 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000221};
222
223static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000224 "time.struct_time",
225 NULL,
226 struct_time_type_fields,
227 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000228};
Tim Peters9ad4b682002-02-13 05:14:18 +0000229
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000230static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000231static PyTypeObject StructTimeType;
232
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000233static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000234tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000235{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000236 PyObject *v = PyStructSequence_New(&StructTimeType);
237 if (v == NULL)
238 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000239
Christian Heimes217cfd12007-12-02 14:31:20 +0000240#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000241
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000242 SET(0, p->tm_year + 1900);
243 SET(1, p->tm_mon + 1); /* Want January == 1 */
244 SET(2, p->tm_mday);
245 SET(3, p->tm_hour);
246 SET(4, p->tm_min);
247 SET(5, p->tm_sec);
248 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
249 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
250 SET(8, p->tm_isdst);
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000251#undef SET
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000252 if (PyErr_Occurred()) {
253 Py_XDECREF(v);
254 return NULL;
255 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000256
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000257 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000258}
259
260static PyObject *
Skip Montanaro41cfce92007-08-24 21:11:00 +0000261structtime_totuple(PyObject *t)
262{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000263 PyObject *x = NULL;
264 unsigned int i;
265 PyObject *v = PyTuple_New(9);
266 if (v == NULL)
267 return NULL;
Skip Montanaro41cfce92007-08-24 21:11:00 +0000268
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000269 for (i=0; i<9; i++) {
270 x = PyStructSequence_GET_ITEM(t, i);
271 Py_INCREF(x);
272 PyTuple_SET_ITEM(v, i, x);
273 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000274
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000275 if (PyErr_Occurred()) {
276 Py_XDECREF(v);
277 return NULL;
278 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000279
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000280 return v;
Skip Montanaro41cfce92007-08-24 21:11:00 +0000281}
282
283static PyObject *
Brett Cannon298c3802004-06-19 20:48:43 +0000284time_convert(double when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000285{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000286 struct tm *p;
287 time_t whent = _PyTime_DoubleToTimet(when);
Brett Cannon298c3802004-06-19 20:48:43 +0000288
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000289 if (whent == (time_t)-1 && PyErr_Occurred())
290 return NULL;
291 errno = 0;
292 p = function(&whent);
293 if (p == NULL) {
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000294#ifdef EINVAL
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000295 if (errno == 0)
296 errno = EINVAL;
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000297#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000298 return PyErr_SetFromErrno(PyExc_ValueError);
299 }
300 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000301}
302
Fred Drakef901abd2004-08-03 17:58:55 +0000303/* Parse arg tuple that can contain an optional float-or-None value;
304 format needs to be "|O:name".
305 Returns non-zero on success (parallels PyArg_ParseTuple).
306*/
307static int
308parse_time_double_args(PyObject *args, char *format, double *pwhen)
309{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000310 PyObject *ot = NULL;
Fred Drakef901abd2004-08-03 17:58:55 +0000311
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000312 if (!PyArg_ParseTuple(args, format, &ot))
313 return 0;
314 if (ot == NULL || ot == Py_None)
315 *pwhen = floattime();
316 else {
317 double when = PyFloat_AsDouble(ot);
318 if (PyErr_Occurred())
319 return 0;
320 *pwhen = when;
321 }
322 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000323}
324
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000325static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000326time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000327{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000328 double when;
329 if (!parse_time_double_args(args, "|O:gmtime", &when))
330 return NULL;
331 return time_convert(when, gmtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000332}
333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000334PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000335"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000336 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000337\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000338Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000339GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000340
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000341static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000342time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000343{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000344 double when;
345 if (!parse_time_double_args(args, "|O:localtime", &when))
346 return NULL;
347 return time_convert(when, localtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000348}
349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000350PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000351"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000352 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000353\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000354Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000355When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000356
Guido van Rossum9e90a671993-06-24 11:10:19 +0000357static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000358gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000359{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000360 int y;
361 PyObject *t = NULL;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000362
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000363 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000364
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000365 if (PyTuple_Check(args)) {
366 t = args;
367 Py_INCREF(t);
368 }
369 else if (Py_TYPE(args) == &StructTimeType) {
370 t = structtime_totuple(args);
371 }
372 else {
373 PyErr_SetString(PyExc_TypeError,
374 "Tuple or struct_time argument required");
375 return 0;
376 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000377
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000378 if (t == NULL || !PyArg_ParseTuple(t, "iiiiiiiii",
379 &y,
380 &p->tm_mon,
381 &p->tm_mday,
382 &p->tm_hour,
383 &p->tm_min,
384 &p->tm_sec,
385 &p->tm_wday,
386 &p->tm_yday,
387 &p->tm_isdst)) {
388 Py_XDECREF(t);
389 return 0;
390 }
391 Py_DECREF(t);
Skip Montanaro41cfce92007-08-24 21:11:00 +0000392
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000393 if (y < 1900) {
394 PyObject *accept = PyDict_GetItemString(moddict,
395 "accept2dyear");
396 if (accept == NULL || !PyLong_CheckExact(accept) ||
397 !PyObject_IsTrue(accept)) {
398 PyErr_SetString(PyExc_ValueError,
399 "year >= 1900 required");
400 return 0;
401 }
402 if (69 <= y && y <= 99)
403 y += 1900;
404 else if (0 <= y && y <= 68)
405 y += 2000;
406 else {
407 PyErr_SetString(PyExc_ValueError,
408 "year out of range");
409 return 0;
410 }
411 }
412 p->tm_year = y - 1900;
413 p->tm_mon--;
414 p->tm_wday = (p->tm_wday + 1) % 7;
415 p->tm_yday--;
416 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000417}
418
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000419#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000420#ifdef HAVE_WCSFTIME
421#define time_char wchar_t
422#define format_time wcsftime
423#define time_strlen wcslen
424#else
425#define time_char char
426#define format_time strftime
427#define time_strlen strlen
428#endif
429
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000430static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000431time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000432{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000433 PyObject *tup = NULL;
434 struct tm buf;
435 const time_char *fmt;
436 PyObject *format, *tmpfmt;
437 size_t fmtlen, buflen;
438 time_char *outbuf = 0;
439 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000440
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000441 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000442
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000443 /* Will always expect a unicode string to be passed as format.
444 Given that there's no str type anymore in py3k this seems safe.
445 */
446 if (!PyArg_ParseTuple(args, "U|O:strftime", &format, &tup))
447 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000448
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000449 if (tup == NULL) {
450 time_t tt = time(NULL);
451 buf = *localtime(&tt);
452 } else if (!gettmarg(tup, &buf))
453 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000454
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000455 /* Checks added to make sure strftime() does not crash Python by
456 indexing blindly into some array for a textual representation
457 by some bad index (fixes bug #897625).
Tim Peters1b6f7a92004-06-20 02:50:16 +0000458
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000459 Also support values of zero from Python code for arguments in which
460 that is out of range by forcing that value to the lowest value that
461 is valid (fixed bug #1520914).
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000463 Valid ranges based on what is allowed in struct tm:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000465 - tm_year: [0, max(int)] (1)
466 - tm_mon: [0, 11] (2)
467 - tm_mday: [1, 31]
468 - tm_hour: [0, 23]
469 - tm_min: [0, 59]
470 - tm_sec: [0, 60]
471 - tm_wday: [0, 6] (1)
472 - tm_yday: [0, 365] (2)
473 - tm_isdst: [-max(int), max(int)]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000474
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000475 (1) gettmarg() handles bounds-checking.
476 (2) Python's acceptable range is one greater than the range in C,
477 thus need to check against automatic decrement by gettmarg().
478 */
479 if (buf.tm_mon == -1)
480 buf.tm_mon = 0;
481 else if (buf.tm_mon < 0 || buf.tm_mon > 11) {
482 PyErr_SetString(PyExc_ValueError, "month out of range");
483 return NULL;
484 }
485 if (buf.tm_mday == 0)
486 buf.tm_mday = 1;
487 else if (buf.tm_mday < 0 || buf.tm_mday > 31) {
488 PyErr_SetString(PyExc_ValueError, "day of month out of range");
489 return NULL;
490 }
491 if (buf.tm_hour < 0 || buf.tm_hour > 23) {
492 PyErr_SetString(PyExc_ValueError, "hour out of range");
493 return NULL;
494 }
495 if (buf.tm_min < 0 || buf.tm_min > 59) {
496 PyErr_SetString(PyExc_ValueError, "minute out of range");
497 return NULL;
498 }
499 if (buf.tm_sec < 0 || buf.tm_sec > 61) {
500 PyErr_SetString(PyExc_ValueError, "seconds out of range");
501 return NULL;
502 }
503 /* tm_wday does not need checking of its upper-bound since taking
504 ``% 7`` in gettmarg() automatically restricts the range. */
505 if (buf.tm_wday < 0) {
506 PyErr_SetString(PyExc_ValueError, "day of week out of range");
507 return NULL;
508 }
509 if (buf.tm_yday == -1)
510 buf.tm_yday = 0;
511 else if (buf.tm_yday < 0 || buf.tm_yday > 365) {
512 PyErr_SetString(PyExc_ValueError, "day of year out of range");
513 return NULL;
514 }
515 if (buf.tm_isdst < -1 || buf.tm_isdst > 1) {
516 PyErr_SetString(PyExc_ValueError,
517 "daylight savings flag out of range");
518 return NULL;
519 }
Brett Cannond1080a32004-03-02 04:38:10 +0000520
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000521#ifdef HAVE_WCSFTIME
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000522 tmpfmt = PyBytes_FromStringAndSize(NULL,
523 sizeof(wchar_t) * (PyUnicode_GetSize(format)+1));
524 if (!tmpfmt)
525 return NULL;
526 /* This assumes that PyUnicode_AsWideChar doesn't do any UTF-16
527 expansion. */
528 if (PyUnicode_AsWideChar((PyUnicodeObject*)format,
529 (wchar_t*)PyBytes_AS_STRING(tmpfmt),
530 PyUnicode_GetSize(format)+1) == (size_t)-1)
531 /* This shouldn't fail. */
532 Py_FatalError("PyUnicode_AsWideChar failed");
533 format = tmpfmt;
534 fmt = (wchar_t*)PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000535#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000536 /* Convert the unicode string to an ascii one */
537 format = PyUnicode_AsEncodedString(format, TZNAME_ENCODING, NULL);
538 if (format == NULL)
539 return NULL;
540 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000541#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000542
Hirokazu Yamamoto6b0e51a2009-06-03 05:19:18 +0000543#if defined(MS_WINDOWS) && defined(HAVE_WCSFTIME)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000544 /* check that the format string contains only valid directives */
545 for(outbuf = wcschr(fmt, L'%');
546 outbuf != NULL;
547 outbuf = wcschr(outbuf+2, L'%'))
548 {
549 if (outbuf[1]=='#')
550 ++outbuf; /* not documented by python, */
551 if (outbuf[1]=='\0' ||
Senthil Kumaran8f377a32011-04-06 12:54:06 +0800552 !wcschr(L"aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000553 {
554 PyErr_SetString(PyExc_ValueError, "Invalid format string");
555 return 0;
556 }
557 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000558#endif
559
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000560 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000561
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000562 /* I hate these functions that presume you know how big the output
563 * will be ahead of time...
564 */
565 for (i = 1024; ; i += i) {
566 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
567 if (outbuf == NULL) {
568 Py_DECREF(format);
569 return PyErr_NoMemory();
570 }
571 buflen = format_time(outbuf, i, fmt, &buf);
572 if (buflen > 0 || i >= 256 * fmtlen) {
573 /* If the buffer is 256 times as long as the format,
574 it's probably not failing for lack of room!
575 More likely, the format yields an empty result,
576 e.g. an empty format, or %Z when the timezone
577 is unknown. */
578 PyObject *ret;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000579#ifdef HAVE_WCSFTIME
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000580 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000581#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000582 ret = PyUnicode_Decode(outbuf, buflen,
583 TZNAME_ENCODING, NULL);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000584#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000585 PyMem_Free(outbuf);
586 Py_DECREF(format);
587 return ret;
588 }
589 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000590#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000591 /* VisualStudio .NET 2005 does this properly */
592 if (buflen == 0 && errno == EINVAL) {
593 PyErr_SetString(PyExc_ValueError, "Invalid format string");
594 Py_DECREF(format);
595 return 0;
596 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000597#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000598 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000599}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000600
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000601#undef time_char
602#undef format_time
603
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{
Christian Heimes072c0f12008-01-03 23:01:04 +0000615 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
Raymond Hettinger502168a2003-04-10 16:03:22 +0000616 PyObject *strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000617
Tim Peters513a1cd2003-01-19 04:54:58 +0000618 if (!strptime_module)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000619 return NULL;
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000620 strptime_result = PyObject_CallMethod(strptime_module, "_strptime_time", "O", args);
Raymond Hettinger502168a2003-04-10 16:03:22 +0000621 Py_DECREF(strptime_module);
622 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000623}
624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000625PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000626"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000627\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000628Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000629See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000630
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000631
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000632static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000633time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000634{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000635 PyObject *tup = NULL;
636 struct tm buf;
637 char *p;
638 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
639 return NULL;
640 if (tup == NULL) {
641 time_t tt = time(NULL);
642 buf = *localtime(&tt);
643 } else if (!gettmarg(tup, &buf))
644 return NULL;
645 p = asctime(&buf);
Alexander Belopolskyd4bf48b2011-01-02 23:09:41 +0000646 if (p == NULL) {
647 PyErr_SetString(PyExc_ValueError, "invalid time");
648 return NULL;
649 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000650 if (p[24] == '\n')
651 p[24] = '\0';
652 return PyUnicode_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000653}
654
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000655PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000656"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000657\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000658Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
659When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000660is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000661
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000662static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000663time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000664{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000665 PyObject *ot = NULL;
666 time_t tt;
667 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000668
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000669 if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))
670 return NULL;
671 if (ot == NULL || ot == Py_None)
672 tt = time(NULL);
673 else {
674 double dt = PyFloat_AsDouble(ot);
675 if (PyErr_Occurred())
676 return NULL;
677 tt = _PyTime_DoubleToTimet(dt);
678 if (tt == (time_t)-1 && PyErr_Occurred())
679 return NULL;
680 }
681 p = ctime(&tt);
682 if (p == NULL) {
683 PyErr_SetString(PyExc_ValueError, "unconvertible time");
684 return NULL;
685 }
686 if (p[24] == '\n')
687 p[24] = '\0';
688 return PyUnicode_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000689}
690
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000691PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000692"ctime(seconds) -> string\n\
693\n\
694Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000695This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000696not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000697
Guido van Rossum60cd8131998-03-06 17:16:21 +0000698#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000699static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000700time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000701{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000702 struct tm buf;
703 time_t tt;
704 if (!gettmarg(tup, &buf))
705 return NULL;
Alexander Belopolsky4fb96f42011-02-15 15:40:59 +0000706 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000707 tt = mktime(&buf);
Alexander Belopolsky4fb96f42011-02-15 15:40:59 +0000708 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200709 * cannot remain set to -1 if mktime succeeded. */
Alexander Belopolsky4fb96f42011-02-15 15:40:59 +0000710 if (tt == (time_t)(-1) && buf.tm_wday == -1) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000711 PyErr_SetString(PyExc_OverflowError,
712 "mktime argument out of range");
713 return NULL;
714 }
715 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000716}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000717
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000718PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000719"mktime(tuple) -> floating point number\n\
720\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000721Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000722#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000723
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000724#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000725static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000727static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000728time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000729{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000730 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000731
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000732 m = PyImport_ImportModuleNoBlock("time");
733 if (m == NULL) {
734 return NULL;
735 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000736
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000737 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000738
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000739 /* Reset timezone, altzone, daylight and tzname */
740 PyInit_timezone(m);
741 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000742
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000743 Py_INCREF(Py_None);
744 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000745}
746
747PyDoc_STRVAR(tzset_doc,
R. David Murray43b2f452011-02-11 03:13:19 +0000748"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000749\n\
750Initialize, or reinitialize, the local timezone to the value stored in\n\
751os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000752standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000753(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
754fall back to UTC. If the TZ environment variable is not set, the local\n\
755timezone is set to the systems best guess of wallclock time.\n\
756Changing the TZ environment variable without calling tzset *may* change\n\
757the local timezone used by methods such as localtime, but this behaviour\n\
758should not be relied on.");
759#endif /* HAVE_WORKING_TZSET */
760
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000761static void
Martin v. Löwis1a214512008-06-11 05:26:20 +0000762PyInit_timezone(PyObject *m) {
763 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000764 time_tzset. In the future, some parts of it can be moved back
765 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
766 are), and the extraneous calls to tzset(3) should be removed.
767 I haven't done this yet, as I don't want to change this code as
768 little as possible when introducing the time.tzset and time.tzsetwall
769 methods. This should simply be a method of doing the following once,
770 at the top of this function and removing the call to tzset() from
771 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000772
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000773 #ifdef HAVE_TZSET
774 tzset()
775 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000776
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000777 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000778 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000779#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000780 PyObject *otz0, *otz1;
781 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000782#ifdef PYOS_OS2
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000783 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000784#else /* !PYOS_OS2 */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000785 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000786#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787#ifdef HAVE_ALTZONE
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000788 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000789#else
Guido van Rossum26452411998-09-28 22:07:11 +0000790#ifdef PYOS_OS2
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000791 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000792#else /* !PYOS_OS2 */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000793 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000794#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000795#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000796 PyModule_AddIntConstant(m, "daylight", daylight);
797 otz0 = PyUnicode_Decode(tzname[0], strlen(tzname[0]), TZNAME_ENCODING, NULL);
798 otz1 = PyUnicode_Decode(tzname[1], strlen(tzname[1]), TZNAME_ENCODING, NULL);
799 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000800#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000801#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000802 {
Guido van Rossum234f9421993-06-17 12:35:49 +0000803#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000804 time_t t;
805 struct tm *p;
806 long janzone, julyzone;
807 char janname[10], julyname[10];
808 t = (time((time_t *)0) / YEAR) * YEAR;
809 p = localtime(&t);
810 janzone = -p->tm_gmtoff;
811 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
812 janname[9] = '\0';
813 t += YEAR/2;
814 p = localtime(&t);
815 julyzone = -p->tm_gmtoff;
816 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
817 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000818
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000819 if( janzone < julyzone ) {
820 /* DST is reversed in the southern hemisphere */
821 PyModule_AddIntConstant(m, "timezone", julyzone);
822 PyModule_AddIntConstant(m, "altzone", janzone);
823 PyModule_AddIntConstant(m, "daylight",
824 janzone != julyzone);
825 PyModule_AddObject(m, "tzname",
826 Py_BuildValue("(zz)",
827 julyname, janname));
828 } else {
829 PyModule_AddIntConstant(m, "timezone", janzone);
830 PyModule_AddIntConstant(m, "altzone", julyzone);
831 PyModule_AddIntConstant(m, "daylight",
832 janzone != julyzone);
833 PyModule_AddObject(m, "tzname",
834 Py_BuildValue("(zz)",
835 janname, julyname));
836 }
837 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000838#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000839#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000840#ifdef __CYGWIN__
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000841 tzset();
842 PyModule_AddIntConstant(m, "timezone", _timezone);
843 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
844 PyModule_AddIntConstant(m, "daylight", _daylight);
845 PyModule_AddObject(m, "tzname",
846 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000847#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000848#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000849}
850
851
852static PyMethodDef time_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000853 {"time", time_time, METH_NOARGS, time_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000854#ifdef HAVE_CLOCK
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000855 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000856#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000857 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
858 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
859 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
860 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
861 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000862#ifdef HAVE_MKTIME
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000863 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000864#endif
865#ifdef HAVE_STRFTIME
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000866 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000867#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000868 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000869#ifdef HAVE_WORKING_TZSET
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000870 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000871#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000872 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000873};
874
875
876PyDoc_STRVAR(module_doc,
877"This module provides various functions to manipulate time values.\n\
878\n\
879There are two standard representations of time. One is the number\n\
880of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
881or a floating point number (to represent fractions of seconds).\n\
882The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
883The actual value can be retrieved by calling gmtime(0).\n\
884\n\
885The other representation is a tuple of 9 integers giving local time.\n\
886The tuple items are:\n\
887 year (four digits, e.g. 1998)\n\
888 month (1-12)\n\
889 day (1-31)\n\
890 hours (0-23)\n\
891 minutes (0-59)\n\
892 seconds (0-59)\n\
893 weekday (0-6, Monday is 0)\n\
894 Julian day (day in the year, 1-366)\n\
895 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
896If the DST flag is 0, the time is given in the regular time zone;\n\
897if it is 1, the time is given in the DST time zone;\n\
898if it is -1, mktime() should guess based on the date and time.\n\
899\n\
900Variables:\n\
901\n\
902timezone -- difference in seconds between UTC and local standard time\n\
903altzone -- difference in seconds between UTC and local DST time\n\
904daylight -- whether local time should reflect DST\n\
905tzname -- tuple of (standard time zone name, DST time zone name)\n\
906\n\
907Functions:\n\
908\n\
909time() -- return current time in seconds since the Epoch as a float\n\
910clock() -- return CPU time since process start as a float\n\
911sleep() -- delay for a number of seconds given as a float\n\
912gmtime() -- convert seconds since Epoch to UTC tuple\n\
913localtime() -- convert seconds since Epoch to local time tuple\n\
914asctime() -- convert time tuple to string\n\
915ctime() -- convert time in seconds to string\n\
916mktime() -- convert local time tuple to seconds since Epoch\n\
917strftime() -- convert time tuple to string according to format specification\n\
918strptime() -- parse string to time tuple according to format specification\n\
919tzset() -- change the local timezone");
920
921
Martin v. Löwis1a214512008-06-11 05:26:20 +0000922
923static struct PyModuleDef timemodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000924 PyModuleDef_HEAD_INIT,
925 "time",
926 module_doc,
927 -1,
928 time_methods,
929 NULL,
930 NULL,
931 NULL,
932 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000933};
934
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000935PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000936PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000937{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000938 PyObject *m;
939 char *p;
940 m = PyModule_Create(&timemodule);
941 if (m == NULL)
942 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000943
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000944 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
945 p = Py_GETENV("PYTHONY2K");
946 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
947 /* Squirrel away the module's dictionary for the y2k check */
948 moddict = PyModule_GetDict(m);
949 Py_INCREF(moddict);
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000950
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000951 /* Set, or reset, module variables like time.timezone */
952 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000953
Mark Hammond975e3922002-07-16 01:29:19 +0000954#ifdef MS_WINDOWS
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000955 /* Helper to allow interrupts for Windows.
956 If Ctrl+C event delivered while not sleeping
957 it will be ignored.
958 */
959 main_thread = PyThread_get_thread_ident();
960 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
961 SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
Mark Hammond975e3922002-07-16 01:29:19 +0000962#endif /* MS_WINDOWS */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000963 if (!initialized) {
964 PyStructSequence_InitType(&StructTimeType,
965 &struct_time_type_desc);
966 }
967 Py_INCREF(&StructTimeType);
968 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
969 initialized = 1;
970 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000971}
972
973
Guido van Rossumb6775db1994-08-01 11:34:53 +0000974/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000975
Guido van Rossumb6775db1994-08-01 11:34:53 +0000976static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000977floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000978{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000979 /* There are three ways to get the time:
980 (1) gettimeofday() -- resolution in microseconds
981 (2) ftime() -- resolution in milliseconds
982 (3) time() -- resolution in seconds
983 In all cases the return value is a float in seconds.
984 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
985 fail, so we fall back on ftime() or time().
986 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000987#ifdef HAVE_GETTIMEOFDAY
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000988 {
989 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000990#ifdef GETTIMEOFDAY_NO_TZ
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000991 if (gettimeofday(&t) == 0)
992 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000993#else /* !GETTIMEOFDAY_NO_TZ */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000994 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
995 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000996#endif /* !GETTIMEOFDAY_NO_TZ */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000997 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000998
Guido van Rossumb6775db1994-08-01 11:34:53 +0000999#endif /* !HAVE_GETTIMEOFDAY */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001000 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +00001001#if defined(HAVE_FTIME)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001002 struct timeb t;
1003 ftime(&t);
1004 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005#else /* !HAVE_FTIME */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001006 time_t secs;
1007 time(&secs);
1008 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001009#endif /* !HAVE_FTIME */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001010 }
Guido van Rossum426035c1991-02-19 12:27:35 +00001011}
1012
Guido van Rossumb6775db1994-08-01 11:34:53 +00001013
1014/* Implement floatsleep() for various platforms.
1015 When interrupted (or when another error occurs), return -1 and
1016 set an exception; else return 0. */
1017
1018static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001019floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001020{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001021/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001022#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001023 struct timeval t;
1024 double frac;
1025 frac = fmod(secs, 1.0);
1026 secs = floor(secs);
1027 t.tv_sec = (long)secs;
1028 t.tv_usec = (long)(frac*1000000.0);
1029 Py_BEGIN_ALLOW_THREADS
1030 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001031#ifdef EINTR
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001032 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001033#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001034 if (1) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001035#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001036 Py_BLOCK_THREADS
1037 PyErr_SetFromErrno(PyExc_IOError);
1038 return -1;
1039 }
1040 }
1041 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001042#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001043 /* XXX Can't interrupt this sleep */
1044 Py_BEGIN_ALLOW_THREADS
1045 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1046 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001047#elif defined(MS_WINDOWS)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001048 {
1049 double millisecs = secs * 1000.0;
1050 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001051
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001052 if (millisecs > (double)ULONG_MAX) {
1053 PyErr_SetString(PyExc_OverflowError,
1054 "sleep length is too large");
1055 return -1;
1056 }
1057 Py_BEGIN_ALLOW_THREADS
1058 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1059 * by Guido, only the main thread can be interrupted.
1060 */
1061 ul_millis = (unsigned long)millisecs;
1062 if (ul_millis == 0 ||
1063 main_thread != PyThread_get_thread_ident())
1064 Sleep(ul_millis);
1065 else {
1066 DWORD rc;
1067 ResetEvent(hInterruptEvent);
1068 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
1069 if (rc == WAIT_OBJECT_0) {
1070 /* Yield to make sure real Python signal
1071 * handler called.
1072 */
1073 Sleep(1);
1074 Py_BLOCK_THREADS
1075 errno = EINTR;
1076 PyErr_SetFromErrno(PyExc_IOError);
1077 return -1;
1078 }
1079 }
1080 Py_END_ALLOW_THREADS
1081 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001082#elif defined(PYOS_OS2)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001083 /* This Sleep *IS* Interruptable by Exceptions */
1084 Py_BEGIN_ALLOW_THREADS
1085 if (DosSleep(secs * 1000) != NO_ERROR) {
1086 Py_BLOCK_THREADS
1087 PyErr_SetFromErrno(PyExc_IOError);
1088 return -1;
1089 }
1090 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001091#elif defined(PLAN9)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001092 {
1093 double millisecs = secs * 1000.0;
1094 if (millisecs > (double)LONG_MAX) {
1095 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
1096 return -1;
1097 }
1098 /* This sleep *CAN BE* interrupted. */
1099 Py_BEGIN_ALLOW_THREADS
1100 if(sleep((long)millisecs) < 0){
1101 Py_BLOCK_THREADS
1102 PyErr_SetFromErrno(PyExc_IOError);
1103 return -1;
1104 }
1105 Py_END_ALLOW_THREADS
1106 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001107#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001108 /* XXX Can't interrupt this sleep */
1109 Py_BEGIN_ALLOW_THREADS
1110 sleep((int)secs);
1111 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001112#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001113
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001114 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001115}