blob: 879e68630e62492375be7b843549c956f138da19 [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"
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +00006#include "_time.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
Guido van Rossum87ce7bb1998-06-09 16:30:31 +000010#include <ctype.h>
11
Thomas Wouters0e3f5912006-08-11 14:57:12 +000012#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000013#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000014#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum6d946f91992-08-14 13:49:30 +000015
Guido van Rossumb6775db1994-08-01 11:34:53 +000016#ifdef QUICKWIN
17#include <io.h>
18#endif
19
Guido van Rossum7bf22de1997-12-02 20:34:19 +000020#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000021#include <i86.h>
22#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000023#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000024#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000025#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000026#include "pythread.h"
27
28/* helper to allow us to interrupt sleep() on Windows*/
29static HANDLE hInterruptEvent = NULL;
30static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
31{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 SetEvent(hInterruptEvent);
33 /* allow other default handlers to be called.
34 Default Python handler will setup the
35 KeyboardInterrupt exception.
36 */
37 return FALSE;
Mark Hammond975e3922002-07-16 01:29:19 +000038}
39static long main_thread;
40
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000041#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000042/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000043#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000044#define tzname _tzname
45#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000046#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000047#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000048#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000049
Thomas Wouters477c8d52006-05-27 19:21:47 +000050#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
51/* Win32 has better clock replacement; we have our own version below. */
52#undef HAVE_CLOCK
Martin v. Löwis3bb00702007-08-30 14:37:48 +000053#undef TZNAME_ENCODING
54#define TZNAME_ENCODING "mbcs"
Thomas Wouters477c8d52006-05-27 19:21:47 +000055#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +000056
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000057#if defined(PYOS_OS2)
58#define INCL_DOS
59#define INCL_ERRORS
60#include <os2.h>
61#endif
62
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000063#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000064#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000065#endif
66
Guido van Rossum234f9421993-06-17 12:35:49 +000067/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000068static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000069static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000071/* For Y2K check */
72static PyObject *moddict;
73
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000074static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000075time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 double secs;
78 secs = floattime();
79 if (secs == 0.0) {
80 PyErr_SetFromErrno(PyExc_IOError);
81 return NULL;
82 }
83 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +000084}
85
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000086PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +000087"time() -> floating point number\n\
88\n\
89Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000090Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000091
Guido van Rossumb6775db1994-08-01 11:34:53 +000092#ifdef HAVE_CLOCK
93
94#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +000095#ifdef CLK_TCK
96#define CLOCKS_PER_SEC CLK_TCK
97#else
Guido van Rossumb6775db1994-08-01 11:34:53 +000098#define CLOCKS_PER_SEC 1000000
99#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000100#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000101
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000102static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000103time_clock(PyObject *self, PyObject *unused)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000107#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000110/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000111static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000112time_clock(PyObject *self, PyObject *unused)
Guido van Rossum3917c221997-04-02 05:35:28 +0000113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 static LARGE_INTEGER ctrStart;
115 static double divisor = 0.0;
116 LARGE_INTEGER now;
117 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 if (divisor == 0.0) {
120 LARGE_INTEGER freq;
121 QueryPerformanceCounter(&ctrStart);
122 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
123 /* Unlikely to happen - this works on all intel
124 machines at least! Revert to clock() */
125 return PyFloat_FromDouble(((double)clock()) /
126 CLOCKS_PER_SEC);
127 }
128 divisor = (double)freq.QuadPart;
129 }
130 QueryPerformanceCounter(&now);
131 diff = (double)(now.QuadPart - ctrStart.QuadPart);
132 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000133}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000134
Guido van Rossum3917c221997-04-02 05:35:28 +0000135#define HAVE_CLOCK /* So it gets included in the methods */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000136#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +0000137
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000138#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000140"clock() -> floating point number\n\
141\n\
142Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143the first call to clock(). This has as much precision as the system\n\
144records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000145#endif
146
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000148time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 double secs;
151 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
152 return NULL;
153 if (floatsleep(secs) != 0)
154 return NULL;
155 Py_INCREF(Py_None);
156 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157}
158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000159PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000160"sleep(seconds)\n\
161\n\
162Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000163a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000164
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000165static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000166 {"tm_year", "year, for example, 1993"},
167 {"tm_mon", "month of year, range [1, 12]"},
168 {"tm_mday", "day of month, range [1, 31]"},
169 {"tm_hour", "hours, range [0, 23]"},
170 {"tm_min", "minutes, range [0, 59]"},
171 {"tm_sec", "seconds, range [0, 61])"},
172 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
173 {"tm_yday", "day of year, range [1, 366]"},
174 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000176};
177
178static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000180 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
181 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
182 " sequence of 9 integers.\n\n"
183 " Note that several fields' values are not the same as those defined by\n"
184 " the C language standard for struct tm. For example, the value of the\n"
185 " field tm_year is the actual year, not year - 1900. See individual\n"
186 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 struct_time_type_fields,
188 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000189};
Tim Peters9ad4b682002-02-13 05:14:18 +0000190
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000191static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000192static PyTypeObject StructTimeType;
193
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000194static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000195tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 PyObject *v = PyStructSequence_New(&StructTimeType);
198 if (v == NULL)
199 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000200
Christian Heimes217cfd12007-12-02 14:31:20 +0000201#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 SET(0, p->tm_year + 1900);
204 SET(1, p->tm_mon + 1); /* Want January == 1 */
205 SET(2, p->tm_mday);
206 SET(3, p->tm_hour);
207 SET(4, p->tm_min);
208 SET(5, p->tm_sec);
209 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
210 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
211 SET(8, p->tm_isdst);
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000212#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 if (PyErr_Occurred()) {
214 Py_XDECREF(v);
215 return NULL;
216 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000219}
220
221static PyObject *
Skip Montanaro41cfce92007-08-24 21:11:00 +0000222structtime_totuple(PyObject *t)
223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 PyObject *x = NULL;
225 unsigned int i;
226 PyObject *v = PyTuple_New(9);
227 if (v == NULL)
228 return NULL;
Skip Montanaro41cfce92007-08-24 21:11:00 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 for (i=0; i<9; i++) {
231 x = PyStructSequence_GET_ITEM(t, i);
232 Py_INCREF(x);
233 PyTuple_SET_ITEM(v, i, x);
234 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 if (PyErr_Occurred()) {
237 Py_XDECREF(v);
238 return NULL;
239 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 return v;
Skip Montanaro41cfce92007-08-24 21:11:00 +0000242}
243
244static PyObject *
Brett Cannon298c3802004-06-19 20:48:43 +0000245time_convert(double when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 struct tm *p;
248 time_t whent = _PyTime_DoubleToTimet(when);
Brett Cannon298c3802004-06-19 20:48:43 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 if (whent == (time_t)-1 && PyErr_Occurred())
251 return NULL;
252 errno = 0;
253 p = function(&whent);
254 if (p == NULL) {
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000255#ifdef EINVAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 if (errno == 0)
257 errno = EINVAL;
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return PyErr_SetFromErrno(PyExc_ValueError);
260 }
261 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000262}
263
Fred Drakef901abd2004-08-03 17:58:55 +0000264/* Parse arg tuple that can contain an optional float-or-None value;
265 format needs to be "|O:name".
266 Returns non-zero on success (parallels PyArg_ParseTuple).
267*/
268static int
269parse_time_double_args(PyObject *args, char *format, double *pwhen)
270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyObject *ot = NULL;
Fred Drakef901abd2004-08-03 17:58:55 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 if (!PyArg_ParseTuple(args, format, &ot))
274 return 0;
275 if (ot == NULL || ot == Py_None)
276 *pwhen = floattime();
277 else {
278 double when = PyFloat_AsDouble(ot);
279 if (PyErr_Occurred())
280 return 0;
281 *pwhen = when;
282 }
283 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000284}
285
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000286static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000287time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 double when;
290 if (!parse_time_double_args(args, "|O:gmtime", &when))
291 return NULL;
292 return time_convert(when, gmtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000293}
294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000295PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000296"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000297 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000298\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000299Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000300GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000301
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000302static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000303time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 double when;
306 if (!parse_time_double_args(args, "|O:localtime", &when))
307 return NULL;
308 return time_convert(when, localtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000309}
310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000311PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000312"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000314\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000315Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000316When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000317
Guido van Rossum9e90a671993-06-24 11:10:19 +0000318static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000319gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 int y;
322 PyObject *t = NULL;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (PyTuple_Check(args)) {
327 t = args;
328 Py_INCREF(t);
329 }
330 else if (Py_TYPE(args) == &StructTimeType) {
331 t = structtime_totuple(args);
332 }
333 else {
334 PyErr_SetString(PyExc_TypeError,
335 "Tuple or struct_time argument required");
336 return 0;
337 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 if (t == NULL || !PyArg_ParseTuple(t, "iiiiiiiii",
340 &y,
341 &p->tm_mon,
342 &p->tm_mday,
343 &p->tm_hour,
344 &p->tm_min,
345 &p->tm_sec,
346 &p->tm_wday,
347 &p->tm_yday,
348 &p->tm_isdst)) {
349 Py_XDECREF(t);
350 return 0;
351 }
352 Py_DECREF(t);
Skip Montanaro41cfce92007-08-24 21:11:00 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (y < 1900) {
355 PyObject *accept = PyDict_GetItemString(moddict,
356 "accept2dyear");
357 if (accept == NULL || !PyLong_CheckExact(accept) ||
358 !PyObject_IsTrue(accept)) {
359 PyErr_SetString(PyExc_ValueError,
360 "year >= 1900 required");
361 return 0;
362 }
363 if (69 <= y && y <= 99)
364 y += 1900;
365 else if (0 <= y && y <= 68)
366 y += 2000;
367 else {
368 PyErr_SetString(PyExc_ValueError,
369 "year out of range");
370 return 0;
371 }
372 }
373 p->tm_year = y - 1900;
374 p->tm_mon--;
375 p->tm_wday = (p->tm_wday + 1) % 7;
376 p->tm_yday--;
377 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000378}
379
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000380#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000381#ifdef HAVE_WCSFTIME
382#define time_char wchar_t
383#define format_time wcsftime
384#define time_strlen wcslen
385#else
386#define time_char char
387#define format_time strftime
388#define time_strlen strlen
389#endif
390
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000391static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000392time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 PyObject *tup = NULL;
395 struct tm buf;
396 const time_char *fmt;
397 PyObject *format, *tmpfmt;
398 size_t fmtlen, buflen;
399 time_char *outbuf = 0;
400 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 /* Will always expect a unicode string to be passed as format.
405 Given that there's no str type anymore in py3k this seems safe.
406 */
407 if (!PyArg_ParseTuple(args, "U|O:strftime", &format, &tup))
408 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 if (tup == NULL) {
411 time_t tt = time(NULL);
412 buf = *localtime(&tt);
413 } else if (!gettmarg(tup, &buf))
414 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 /* Checks added to make sure strftime() does not crash Python by
417 indexing blindly into some array for a textual representation
418 by some bad index (fixes bug #897625).
Tim Peters1b6f7a92004-06-20 02:50:16 +0000419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 Also support values of zero from Python code for arguments in which
421 that is out of range by forcing that value to the lowest value that
422 is valid (fixed bug #1520914).
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 Valid ranges based on what is allowed in struct tm:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 - tm_year: [0, max(int)] (1)
427 - tm_mon: [0, 11] (2)
428 - tm_mday: [1, 31]
429 - tm_hour: [0, 23]
430 - tm_min: [0, 59]
431 - tm_sec: [0, 60]
432 - tm_wday: [0, 6] (1)
433 - tm_yday: [0, 365] (2)
434 - tm_isdst: [-max(int), max(int)]
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 (1) gettmarg() handles bounds-checking.
437 (2) Python's acceptable range is one greater than the range in C,
438 thus need to check against automatic decrement by gettmarg().
439 */
440 if (buf.tm_mon == -1)
441 buf.tm_mon = 0;
442 else if (buf.tm_mon < 0 || buf.tm_mon > 11) {
443 PyErr_SetString(PyExc_ValueError, "month out of range");
444 return NULL;
445 }
446 if (buf.tm_mday == 0)
447 buf.tm_mday = 1;
448 else if (buf.tm_mday < 0 || buf.tm_mday > 31) {
449 PyErr_SetString(PyExc_ValueError, "day of month out of range");
450 return NULL;
451 }
452 if (buf.tm_hour < 0 || buf.tm_hour > 23) {
453 PyErr_SetString(PyExc_ValueError, "hour out of range");
454 return NULL;
455 }
456 if (buf.tm_min < 0 || buf.tm_min > 59) {
457 PyErr_SetString(PyExc_ValueError, "minute out of range");
458 return NULL;
459 }
460 if (buf.tm_sec < 0 || buf.tm_sec > 61) {
461 PyErr_SetString(PyExc_ValueError, "seconds out of range");
462 return NULL;
463 }
464 /* tm_wday does not need checking of its upper-bound since taking
465 ``% 7`` in gettmarg() automatically restricts the range. */
466 if (buf.tm_wday < 0) {
467 PyErr_SetString(PyExc_ValueError, "day of week out of range");
468 return NULL;
469 }
470 if (buf.tm_yday == -1)
471 buf.tm_yday = 0;
472 else if (buf.tm_yday < 0 || buf.tm_yday > 365) {
473 PyErr_SetString(PyExc_ValueError, "day of year out of range");
474 return NULL;
475 }
476 /* Normalize tm_isdst just in case someone foolishly implements %Z
477 based on the assumption that tm_isdst falls within the range of
478 [-1, 1] */
479 if (buf.tm_isdst < -1)
480 buf.tm_isdst = -1;
481 else if (buf.tm_isdst > 1)
482 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000483
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000484#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 tmpfmt = PyBytes_FromStringAndSize(NULL,
486 sizeof(wchar_t) * (PyUnicode_GetSize(format)+1));
487 if (!tmpfmt)
488 return NULL;
489 /* This assumes that PyUnicode_AsWideChar doesn't do any UTF-16
490 expansion. */
491 if (PyUnicode_AsWideChar((PyUnicodeObject*)format,
492 (wchar_t*)PyBytes_AS_STRING(tmpfmt),
493 PyUnicode_GetSize(format)+1) == (size_t)-1)
494 /* This shouldn't fail. */
495 Py_FatalError("PyUnicode_AsWideChar failed");
496 format = tmpfmt;
497 fmt = (wchar_t*)PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000498#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 /* Convert the unicode string to an ascii one */
500 format = PyUnicode_AsEncodedString(format, TZNAME_ENCODING, NULL);
501 if (format == NULL)
502 return NULL;
503 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000504#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000505
Hirokazu Yamamoto6b0e51a2009-06-03 05:19:18 +0000506#if defined(MS_WINDOWS) && defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 /* check that the format string contains only valid directives */
508 for(outbuf = wcschr(fmt, L'%');
509 outbuf != NULL;
510 outbuf = wcschr(outbuf+2, L'%'))
511 {
512 if (outbuf[1]=='#')
513 ++outbuf; /* not documented by python, */
514 if (outbuf[1]=='\0' ||
515 !wcschr(L"aAbBcdfHIjmMpSUwWxXyYzZ%", outbuf[1]))
516 {
517 PyErr_SetString(PyExc_ValueError, "Invalid format string");
518 return 0;
519 }
520 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000521#endif
522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* I hate these functions that presume you know how big the output
526 * will be ahead of time...
527 */
528 for (i = 1024; ; i += i) {
529 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
530 if (outbuf == NULL) {
531 Py_DECREF(format);
532 return PyErr_NoMemory();
533 }
534 buflen = format_time(outbuf, i, fmt, &buf);
535 if (buflen > 0 || i >= 256 * fmtlen) {
536 /* If the buffer is 256 times as long as the format,
537 it's probably not failing for lack of room!
538 More likely, the format yields an empty result,
539 e.g. an empty format, or %Z when the timezone
540 is unknown. */
541 PyObject *ret;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000542#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000544#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 ret = PyUnicode_Decode(outbuf, buflen,
546 TZNAME_ENCODING, NULL);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 PyMem_Free(outbuf);
549 Py_DECREF(format);
550 return ret;
551 }
552 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000553#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* VisualStudio .NET 2005 does this properly */
555 if (buflen == 0 && errno == EINVAL) {
556 PyErr_SetString(PyExc_ValueError, "Invalid format string");
557 Py_DECREF(format);
558 return 0;
559 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000562}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000563
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000564#undef time_char
565#undef format_time
566
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000567PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000568"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000569\n\
570Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000571See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000572is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000573#endif /* HAVE_STRFTIME */
574
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000575static PyObject *
576time_strptime(PyObject *self, PyObject *args)
577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
579 PyObject *strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (!strptime_module)
582 return NULL;
583 strptime_result = PyObject_CallMethod(strptime_module,
584 "_strptime_time", "O", args);
585 Py_DECREF(strptime_module);
586 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000587}
588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000589PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000590"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000591\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000592Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000593See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000594
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000595
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000596static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000597time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *tup = NULL;
600 struct tm buf;
601 char *p;
602 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
603 return NULL;
604 if (tup == NULL) {
605 time_t tt = time(NULL);
606 buf = *localtime(&tt);
607 } else if (!gettmarg(tup, &buf))
608 return NULL;
609 p = asctime(&buf);
610 if (p[24] == '\n')
611 p[24] = '\0';
612 return PyUnicode_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000613}
614
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000615PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000616"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000617\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000618Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
619When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000620is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000621
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000622static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000623time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 PyObject *ot = NULL;
626 time_t tt;
627 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))
630 return NULL;
631 if (ot == NULL || ot == Py_None)
632 tt = time(NULL);
633 else {
634 double dt = PyFloat_AsDouble(ot);
635 if (PyErr_Occurred())
636 return NULL;
637 tt = _PyTime_DoubleToTimet(dt);
638 if (tt == (time_t)-1 && PyErr_Occurred())
639 return NULL;
640 }
641 p = ctime(&tt);
642 if (p == NULL) {
643 PyErr_SetString(PyExc_ValueError, "unconvertible time");
644 return NULL;
645 }
646 if (p[24] == '\n')
647 p[24] = '\0';
648 return PyUnicode_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000649}
650
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000651PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000652"ctime(seconds) -> string\n\
653\n\
654Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000655This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000656not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000657
Guido van Rossum60cd8131998-03-06 17:16:21 +0000658#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000659static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000660time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 struct tm buf;
663 time_t tt;
664 if (!gettmarg(tup, &buf))
665 return NULL;
666 tt = mktime(&buf);
667 if (tt == (time_t)(-1)) {
668 PyErr_SetString(PyExc_OverflowError,
669 "mktime argument out of range");
670 return NULL;
671 }
672 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000673}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000674
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000675PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000676"mktime(tuple) -> floating point number\n\
677\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000678Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000679#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000680
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000681#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000682static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000684static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000685time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 m = PyImport_ImportModuleNoBlock("time");
690 if (m == NULL) {
691 return NULL;
692 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 /* Reset timezone, altzone, daylight and tzname */
697 PyInit_timezone(m);
698 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 Py_INCREF(Py_None);
701 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000702}
703
704PyDoc_STRVAR(tzset_doc,
705"tzset(zone)\n\
706\n\
707Initialize, or reinitialize, the local timezone to the value stored in\n\
708os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000709standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000710(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
711fall back to UTC. If the TZ environment variable is not set, the local\n\
712timezone is set to the systems best guess of wallclock time.\n\
713Changing the TZ environment variable without calling tzset *may* change\n\
714the local timezone used by methods such as localtime, but this behaviour\n\
715should not be relied on.");
716#endif /* HAVE_WORKING_TZSET */
717
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000718static void
Martin v. Löwis1a214512008-06-11 05:26:20 +0000719PyInit_timezone(PyObject *m) {
720 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 time_tzset. In the future, some parts of it can be moved back
722 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
723 are), and the extraneous calls to tzset(3) should be removed.
724 I haven't done this yet, as I don't want to change this code as
725 little as possible when introducing the time.tzset and time.tzsetwall
726 methods. This should simply be a method of doing the following once,
727 at the top of this function and removing the call to tzset() from
728 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 #ifdef HAVE_TZSET
731 tzset()
732 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000735 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000736#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 PyObject *otz0, *otz1;
738 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000739#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000741#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000743#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000744#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000746#else
Guido van Rossum26452411998-09-28 22:07:11 +0000747#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000749#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000751#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 PyModule_AddIntConstant(m, "daylight", daylight);
754 otz0 = PyUnicode_Decode(tzname[0], strlen(tzname[0]), TZNAME_ENCODING, NULL);
755 otz1 = PyUnicode_Decode(tzname[1], strlen(tzname[1]), TZNAME_ENCODING, NULL);
756 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000757#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000758#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 {
Guido van Rossum234f9421993-06-17 12:35:49 +0000760#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 time_t t;
762 struct tm *p;
763 long janzone, julyzone;
764 char janname[10], julyname[10];
765 t = (time((time_t *)0) / YEAR) * YEAR;
766 p = localtime(&t);
767 janzone = -p->tm_gmtoff;
768 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
769 janname[9] = '\0';
770 t += YEAR/2;
771 p = localtime(&t);
772 julyzone = -p->tm_gmtoff;
773 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
774 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if( janzone < julyzone ) {
777 /* DST is reversed in the southern hemisphere */
778 PyModule_AddIntConstant(m, "timezone", julyzone);
779 PyModule_AddIntConstant(m, "altzone", janzone);
780 PyModule_AddIntConstant(m, "daylight",
781 janzone != julyzone);
782 PyModule_AddObject(m, "tzname",
783 Py_BuildValue("(zz)",
784 julyname, janname));
785 } else {
786 PyModule_AddIntConstant(m, "timezone", janzone);
787 PyModule_AddIntConstant(m, "altzone", julyzone);
788 PyModule_AddIntConstant(m, "daylight",
789 janzone != julyzone);
790 PyModule_AddObject(m, "tzname",
791 Py_BuildValue("(zz)",
792 janname, julyname));
793 }
794 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000795#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000796#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000797#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 tzset();
799 PyModule_AddIntConstant(m, "timezone", _timezone);
800 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
801 PyModule_AddIntConstant(m, "daylight", _daylight);
802 PyModule_AddObject(m, "tzname",
803 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000804#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000805#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000806}
807
808
809static PyMethodDef time_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 {"time", time_time, METH_NOARGS, time_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000811#ifdef HAVE_CLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
815 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
816 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
817 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
818 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000819#ifdef HAVE_MKTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000821#endif
822#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000826#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000830};
831
832
833PyDoc_STRVAR(module_doc,
834"This module provides various functions to manipulate time values.\n\
835\n\
836There are two standard representations of time. One is the number\n\
837of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
838or a floating point number (to represent fractions of seconds).\n\
839The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
840The actual value can be retrieved by calling gmtime(0).\n\
841\n\
842The other representation is a tuple of 9 integers giving local time.\n\
843The tuple items are:\n\
844 year (four digits, e.g. 1998)\n\
845 month (1-12)\n\
846 day (1-31)\n\
847 hours (0-23)\n\
848 minutes (0-59)\n\
849 seconds (0-59)\n\
850 weekday (0-6, Monday is 0)\n\
851 Julian day (day in the year, 1-366)\n\
852 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
853If the DST flag is 0, the time is given in the regular time zone;\n\
854if it is 1, the time is given in the DST time zone;\n\
855if it is -1, mktime() should guess based on the date and time.\n\
856\n\
857Variables:\n\
858\n\
859timezone -- difference in seconds between UTC and local standard time\n\
860altzone -- difference in seconds between UTC and local DST time\n\
861daylight -- whether local time should reflect DST\n\
862tzname -- tuple of (standard time zone name, DST time zone name)\n\
863\n\
864Functions:\n\
865\n\
866time() -- return current time in seconds since the Epoch as a float\n\
867clock() -- return CPU time since process start as a float\n\
868sleep() -- delay for a number of seconds given as a float\n\
869gmtime() -- convert seconds since Epoch to UTC tuple\n\
870localtime() -- convert seconds since Epoch to local time tuple\n\
871asctime() -- convert time tuple to string\n\
872ctime() -- convert time in seconds to string\n\
873mktime() -- convert local time tuple to seconds since Epoch\n\
874strftime() -- convert time tuple to string according to format specification\n\
875strptime() -- parse string to time tuple according to format specification\n\
876tzset() -- change the local timezone");
877
878
Martin v. Löwis1a214512008-06-11 05:26:20 +0000879
880static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 PyModuleDef_HEAD_INIT,
882 "time",
883 module_doc,
884 -1,
885 time_methods,
886 NULL,
887 NULL,
888 NULL,
889 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000890};
891
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000892PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000893PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 PyObject *m;
896 char *p;
897 m = PyModule_Create(&timemodule);
898 if (m == NULL)
899 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
902 p = Py_GETENV("PYTHONY2K");
903 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
904 /* Squirrel away the module's dictionary for the y2k check */
905 moddict = PyModule_GetDict(m);
906 Py_INCREF(moddict);
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 /* Set, or reset, module variables like time.timezone */
909 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000910
Mark Hammond975e3922002-07-16 01:29:19 +0000911#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 /* Helper to allow interrupts for Windows.
913 If Ctrl+C event delivered while not sleeping
914 it will be ignored.
915 */
916 main_thread = PyThread_get_thread_ident();
917 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
918 SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
Mark Hammond975e3922002-07-16 01:29:19 +0000919#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 if (!initialized) {
921 PyStructSequence_InitType(&StructTimeType,
922 &struct_time_type_desc);
923 }
924 Py_INCREF(&StructTimeType);
925 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
926 initialized = 1;
927 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000928}
929
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000931floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000932{
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +0000933 _PyTime_timeval t;
934 _PyTime_gettimeofday(&t);
935 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum426035c1991-02-19 12:27:35 +0000936}
937
Guido van Rossumb6775db1994-08-01 11:34:53 +0000938
939/* Implement floatsleep() for various platforms.
940 When interrupted (or when another error occurs), return -1 and
941 set an exception; else return 0. */
942
943static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000944floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000945{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000946/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000947#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 struct timeval t;
949 double frac;
950 frac = fmod(secs, 1.0);
951 secs = floor(secs);
952 t.tv_sec = (long)secs;
953 t.tv_usec = (long)(frac*1000000.0);
954 Py_BEGIN_ALLOW_THREADS
955 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000956#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000958#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 if (1) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 Py_BLOCK_THREADS
962 PyErr_SetFromErrno(PyExc_IOError);
963 return -1;
964 }
965 }
966 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000967#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 /* XXX Can't interrupt this sleep */
969 Py_BEGIN_ALLOW_THREADS
970 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
971 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000972#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 {
974 double millisecs = secs * 1000.0;
975 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +0000976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 if (millisecs > (double)ULONG_MAX) {
978 PyErr_SetString(PyExc_OverflowError,
979 "sleep length is too large");
980 return -1;
981 }
982 Py_BEGIN_ALLOW_THREADS
983 /* Allow sleep(0) to maintain win32 semantics, and as decreed
984 * by Guido, only the main thread can be interrupted.
985 */
986 ul_millis = (unsigned long)millisecs;
987 if (ul_millis == 0 ||
988 main_thread != PyThread_get_thread_ident())
989 Sleep(ul_millis);
990 else {
991 DWORD rc;
992 ResetEvent(hInterruptEvent);
993 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
994 if (rc == WAIT_OBJECT_0) {
995 /* Yield to make sure real Python signal
996 * handler called.
997 */
998 Sleep(1);
999 Py_BLOCK_THREADS
1000 errno = EINTR;
1001 PyErr_SetFromErrno(PyExc_IOError);
1002 return -1;
1003 }
1004 }
1005 Py_END_ALLOW_THREADS
1006 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001007#elif defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 /* This Sleep *IS* Interruptable by Exceptions */
1009 Py_BEGIN_ALLOW_THREADS
1010 if (DosSleep(secs * 1000) != NO_ERROR) {
1011 Py_BLOCK_THREADS
1012 PyErr_SetFromErrno(PyExc_IOError);
1013 return -1;
1014 }
1015 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001016#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 /* XXX Can't interrupt this sleep */
1018 Py_BEGIN_ALLOW_THREADS
1019 sleep((int)secs);
1020 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001021#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001024}