blob: 45002a1b182549c34679b20ada198e94f7749e13 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Time module */
3
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00004#include "Python.h"
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005#include "structseq.h"
Tim Peters1b6f7a92004-06-20 02:50:16 +00006#include "timefuncs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00007
Thomas Wouters477c8d52006-05-27 19:21:47 +00008#ifdef __APPLE__
9#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
10 /*
11 * floattime falls back to ftime when getttimeofday fails because the latter
12 * might fail on some platforms. This fallback is unwanted on MacOSX because
13 * that makes it impossible to use a binary build on OSX 10.4 on earlier
14 * releases of the OS. Therefore claim we don't support ftime.
15 */
16# undef HAVE_FTIME
17#endif
18#endif
19
Guido van Rossum87ce7bb1998-06-09 16:30:31 +000020#include <ctype.h>
21
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000023#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum6d946f91992-08-14 13:49:30 +000025
Guido van Rossumb6775db1994-08-01 11:34:53 +000026#ifdef QUICKWIN
27#include <io.h>
28#endif
29
Guido van Rossumb6775db1994-08-01 11:34:53 +000030#ifdef HAVE_FTIME
31#include <sys/timeb.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000032#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +000033extern int ftime(struct timeb *);
Guido van Rossum52174571996-12-09 18:38:52 +000034#endif /* MS_WINDOWS */
35#endif /* HAVE_FTIME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036
Guido van Rossum7bf22de1997-12-02 20:34:19 +000037#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000038#include <i86.h>
39#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000040#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000041#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000042#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000043#include "pythread.h"
44
45/* helper to allow us to interrupt sleep() on Windows*/
46static HANDLE hInterruptEvent = NULL;
47static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
48{
49 SetEvent(hInterruptEvent);
50 /* allow other default handlers to be called.
51 Default Python handler will setup the
52 KeyboardInterrupt exception.
53 */
54 return FALSE;
55}
56static long main_thread;
57
58
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000059#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000060/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000061#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000062#define tzname _tzname
63#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000064#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000065#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000066#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000067
Thomas Wouters477c8d52006-05-27 19:21:47 +000068#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
69/* Win32 has better clock replacement; we have our own version below. */
70#undef HAVE_CLOCK
71#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +000072
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000073#if defined(PYOS_OS2)
74#define INCL_DOS
75#define INCL_ERRORS
76#include <os2.h>
77#endif
78
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000079#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000080#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000081#endif
82
Guido van Rossum234f9421993-06-17 12:35:49 +000083/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000084static int floatsleep(double);
Thomas Woutersed77bac2000-07-24 15:26:39 +000085static double floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086
Guido van Rossumcfbaecc1998-08-25 14:51:12 +000087/* For Y2K check */
88static PyObject *moddict;
89
Tim Peters1b6f7a92004-06-20 02:50:16 +000090/* Exposed in timefuncs.h. */
91time_t
Brett Cannon298c3802004-06-19 20:48:43 +000092_PyTime_DoubleToTimet(double x)
93{
94 time_t result;
95 double diff;
96
97 result = (time_t)x;
98 /* How much info did we lose? time_t may be an integral or
99 * floating type, and we don't know which. If it's integral,
100 * we don't know whether C truncates, rounds, returns the floor,
101 * etc. If we lost a second or more, the C rounding is
102 * unreasonable, or the input just doesn't fit in a time_t;
103 * call it an error regardless. Note that the original cast to
104 * time_t can cause a C error too, but nothing we can do to
105 * worm around that.
106 */
107 diff = x - (double)result;
108 if (diff <= -1.0 || diff >= 1.0) {
109 PyErr_SetString(PyExc_ValueError,
110 "timestamp out of range for platform time_t");
111 result = (time_t)-1;
112 }
113 return result;
114}
115
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000116static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000117time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000119 double secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000120 secs = floattime();
121 if (secs == 0.0) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000122 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000123 return NULL;
124 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000125 return PyFloat_FromDouble(secs);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126}
127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000128PyDoc_STRVAR(time_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000129"time() -> floating point number\n\
130\n\
131Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000132Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000133
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#ifdef HAVE_CLOCK
135
136#ifndef CLOCKS_PER_SEC
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000137#ifdef CLK_TCK
138#define CLOCKS_PER_SEC CLK_TCK
139#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140#define CLOCKS_PER_SEC 1000000
141#endif
Guido van Rossum1b66a4f1996-02-25 04:50:33 +0000142#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000143
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000144static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000145time_clock(PyObject *self, PyObject *unused)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146{
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000147 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149#endif /* HAVE_CLOCK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150
Thomas Wouters477c8d52006-05-27 19:21:47 +0000151#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Mark Hammond7ba5e812002-02-12 04:02:33 +0000152/* Due to Mark Hammond and Tim Peters */
Guido van Rossum3917c221997-04-02 05:35:28 +0000153static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000154time_clock(PyObject *self, PyObject *unused)
Guido van Rossum3917c221997-04-02 05:35:28 +0000155{
Tim Peters9ad4b682002-02-13 05:14:18 +0000156 static LARGE_INTEGER ctrStart;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000157 static double divisor = 0.0;
Tim Peters9ad4b682002-02-13 05:14:18 +0000158 LARGE_INTEGER now;
Mark Hammond7ba5e812002-02-12 04:02:33 +0000159 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000160
Mark Hammond7ba5e812002-02-12 04:02:33 +0000161 if (divisor == 0.0) {
Tim Peters9ad4b682002-02-13 05:14:18 +0000162 LARGE_INTEGER freq;
163 QueryPerformanceCounter(&ctrStart);
164 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
Mark Hammond7ba5e812002-02-12 04:02:33 +0000165 /* Unlikely to happen - this works on all intel
166 machines at least! Revert to clock() */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000167 return PyFloat_FromDouble(((double)clock()) /
168 CLOCKS_PER_SEC);
Guido van Rossum3917c221997-04-02 05:35:28 +0000169 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000170 divisor = (double)freq.QuadPart;
Guido van Rossum3917c221997-04-02 05:35:28 +0000171 }
Tim Peters9ad4b682002-02-13 05:14:18 +0000172 QueryPerformanceCounter(&now);
173 diff = (double)(now.QuadPart - ctrStart.QuadPart);
Mark Hammond7ba5e812002-02-12 04:02:33 +0000174 return PyFloat_FromDouble(diff / divisor);
Guido van Rossum3917c221997-04-02 05:35:28 +0000175}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000176
Guido van Rossum3917c221997-04-02 05:35:28 +0000177#define HAVE_CLOCK /* So it gets included in the methods */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000178#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
Guido van Rossum3917c221997-04-02 05:35:28 +0000179
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000180#ifdef HAVE_CLOCK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000181PyDoc_STRVAR(clock_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000182"clock() -> floating point number\n\
183\n\
184Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000185the first call to clock(). This has as much precision as the system\n\
186records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000187#endif
188
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000189static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000190time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
Guido van Rossum775f4da1993-01-09 17:18:52 +0000192 double secs;
Thomas Woutersfe385252001-01-19 23:16:56 +0000193 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 return NULL;
Guido van Rossum8607ae21997-11-03 22:04:46 +0000195 if (floatsleep(secs) != 0)
196 return NULL;
197 Py_INCREF(Py_None);
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000198 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199}
200
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000201PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000202"sleep(seconds)\n\
203\n\
204Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000205a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000206
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000207static PyStructSequence_Field struct_time_type_fields[] = {
208 {"tm_year", NULL},
209 {"tm_mon", NULL},
210 {"tm_mday", NULL},
211 {"tm_hour", NULL},
212 {"tm_min", NULL},
213 {"tm_sec", NULL},
214 {"tm_wday", NULL},
215 {"tm_yday", NULL},
216 {"tm_isdst", NULL},
217 {0}
218};
219
220static PyStructSequence_Desc struct_time_type_desc = {
Guido van Rossum14648392001-12-08 18:02:58 +0000221 "time.struct_time",
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000222 NULL,
223 struct_time_type_fields,
224 9,
225};
Tim Peters9ad4b682002-02-13 05:14:18 +0000226
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000227static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000228static PyTypeObject StructTimeType;
229
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000230static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000231tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000232{
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000233 PyObject *v = PyStructSequence_New(&StructTimeType);
234 if (v == NULL)
235 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000236
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000237#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
238
239 SET(0, p->tm_year + 1900);
240 SET(1, p->tm_mon + 1); /* Want January == 1 */
241 SET(2, p->tm_mday);
242 SET(3, p->tm_hour);
243 SET(4, p->tm_min);
244 SET(5, p->tm_sec);
245 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
246 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
247 SET(8, p->tm_isdst);
248#undef SET
249 if (PyErr_Occurred()) {
250 Py_XDECREF(v);
251 return NULL;
252 }
253
254 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000255}
256
257static PyObject *
Brett Cannon298c3802004-06-19 20:48:43 +0000258time_convert(double when, struct tm * (*function)(const time_t *))
Guido van Rossum234f9421993-06-17 12:35:49 +0000259{
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000260 struct tm *p;
Brett Cannon298c3802004-06-19 20:48:43 +0000261 time_t whent = _PyTime_DoubleToTimet(when);
262
263 if (whent == (time_t)-1 && PyErr_Occurred())
264 return NULL;
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000265 errno = 0;
Brett Cannon298c3802004-06-19 20:48:43 +0000266 p = function(&whent);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000267 if (p == NULL) {
268#ifdef EINVAL
Guido van Rossum0b1ff661996-11-02 17:31:22 +0000269 if (errno == 0)
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000270 errno = EINVAL;
271#endif
Tim Peters8b19a932003-01-17 20:08:54 +0000272 return PyErr_SetFromErrno(PyExc_ValueError);
Guido van Rossum6e8583d1996-10-08 14:19:52 +0000273 }
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000274 return tmtotuple(p);
Guido van Rossum234f9421993-06-17 12:35:49 +0000275}
276
Fred Drakef901abd2004-08-03 17:58:55 +0000277/* Parse arg tuple that can contain an optional float-or-None value;
278 format needs to be "|O:name".
279 Returns non-zero on success (parallels PyArg_ParseTuple).
280*/
281static int
282parse_time_double_args(PyObject *args, char *format, double *pwhen)
283{
284 PyObject *ot = NULL;
285
286 if (!PyArg_ParseTuple(args, format, &ot))
287 return 0;
288 if (ot == NULL || ot == Py_None)
289 *pwhen = floattime();
290 else {
291 double when = PyFloat_AsDouble(ot);
292 if (PyErr_Occurred())
293 return 0;
294 *pwhen = when;
295 }
296 return 1;
297}
298
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000299static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000300time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000301{
302 double when;
Fred Drakef901abd2004-08-03 17:58:55 +0000303 if (!parse_time_double_args(args, "|O:gmtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000304 return NULL;
Brett Cannon298c3802004-06-19 20:48:43 +0000305 return time_convert(when, gmtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000306}
307
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000308PyDoc_STRVAR(gmtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000309"gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\n\
310 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000311\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000312Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000313GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000314
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000315static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000316time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000317{
318 double when;
Fred Drakef901abd2004-08-03 17:58:55 +0000319 if (!parse_time_double_args(args, "|O:localtime", &when))
Guido van Rossum234f9421993-06-17 12:35:49 +0000320 return NULL;
Brett Cannon298c3802004-06-19 20:48:43 +0000321 return time_convert(when, localtime);
Guido van Rossum234f9421993-06-17 12:35:49 +0000322}
323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000324PyDoc_STRVAR(localtime_doc,
Fred Drake193a3f62002-03-12 21:38:49 +0000325"localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000326\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000327Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000328When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000329
Guido van Rossum9e90a671993-06-24 11:10:19 +0000330static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000331gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000332{
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000333 int y;
Thomas Wouters334fb892000-07-25 12:56:38 +0000334 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000335
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000336 if (!PyArg_Parse(args, "(iiiiiiiii)",
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000337 &y,
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000338 &p->tm_mon,
339 &p->tm_mday,
340 &p->tm_hour,
341 &p->tm_min,
342 &p->tm_sec,
343 &p->tm_wday,
344 &p->tm_yday,
345 &p->tm_isdst))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000346 return 0;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000347 if (y < 1900) {
348 PyObject *accept = PyDict_GetItemString(moddict,
349 "accept2dyear");
Guido van Rossumddefaf32007-01-14 03:31:43 +0000350 if (accept == NULL || !PyInt_CheckExact(accept) ||
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000351 PyInt_AsLong(accept) == 0) {
352 PyErr_SetString(PyExc_ValueError,
353 "year >= 1900 required");
354 return 0;
355 }
356 if (69 <= y && y <= 99)
357 y += 1900;
358 else if (0 <= y && y <= 68)
359 y += 2000;
360 else {
361 PyErr_SetString(PyExc_ValueError,
Skip Montanaro1a10aac2001-08-22 12:39:16 +0000362 "year out of range");
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000363 return 0;
364 }
365 }
366 p->tm_year = y - 1900;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000367 p->tm_mon--;
368 p->tm_wday = (p->tm_wday + 1) % 7;
369 p->tm_yday--;
370 return 1;
371}
372
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000373#ifdef HAVE_STRFTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000374static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000375time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000376{
Thomas Woutersfe385252001-01-19 23:16:56 +0000377 PyObject *tup = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000378 struct tm buf;
379 const char *fmt;
Guido van Rossumfa481162000-06-28 21:33:59 +0000380 size_t fmtlen, buflen;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000381 char *outbuf = 0;
Guido van Rossumfa481162000-06-28 21:33:59 +0000382 size_t i;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000383
Thomas Wouters334fb892000-07-25 12:56:38 +0000384 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000385
Thomas Woutersfe385252001-01-19 23:16:56 +0000386 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000387 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000388
389 if (tup == NULL) {
390 time_t tt = time(NULL);
391 buf = *localtime(&tt);
392 } else if (!gettmarg(tup, &buf))
393 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000394
Brett Cannond1080a32004-03-02 04:38:10 +0000395 /* Checks added to make sure strftime() does not crash Python by
396 indexing blindly into some array for a textual representation
397 by some bad index (fixes bug #897625).
Tim Peters1b6f7a92004-06-20 02:50:16 +0000398
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000399 Also support values of zero from Python code for arguments in which
400 that is out of range by forcing that value to the lowest value that
401 is valid (fixed bug #1520914).
402
403 Valid ranges based on what is allowed in struct tm:
404
405 - tm_year: [0, max(int)] (1)
406 - tm_mon: [0, 11] (2)
407 - tm_mday: [1, 31]
408 - tm_hour: [0, 23]
409 - tm_min: [0, 59]
410 - tm_sec: [0, 60]
411 - tm_wday: [0, 6] (1)
412 - tm_yday: [0, 365] (2)
413 - tm_isdst: [-max(int), max(int)]
414
415 (1) gettmarg() handles bounds-checking.
416 (2) Python's acceptable range is one greater than the range in C,
417 thus need to check against automatic decrement by gettmarg().
Brett Cannond1080a32004-03-02 04:38:10 +0000418 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000419 if (buf.tm_mon == -1)
420 buf.tm_mon = 0;
421 else if (buf.tm_mon < 0 || buf.tm_mon > 11) {
Brett Cannond1080a32004-03-02 04:38:10 +0000422 PyErr_SetString(PyExc_ValueError, "month out of range");
423 return NULL;
424 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425 if (buf.tm_mday == 0)
426 buf.tm_mday = 1;
427 else if (buf.tm_mday < 0 || buf.tm_mday > 31) {
Brett Cannond1080a32004-03-02 04:38:10 +0000428 PyErr_SetString(PyExc_ValueError, "day of month out of range");
429 return NULL;
430 }
431 if (buf.tm_hour < 0 || buf.tm_hour > 23) {
432 PyErr_SetString(PyExc_ValueError, "hour out of range");
433 return NULL;
434 }
435 if (buf.tm_min < 0 || buf.tm_min > 59) {
436 PyErr_SetString(PyExc_ValueError, "minute out of range");
437 return NULL;
438 }
439 if (buf.tm_sec < 0 || buf.tm_sec > 61) {
440 PyErr_SetString(PyExc_ValueError, "seconds out of range");
441 return NULL;
442 }
443 /* tm_wday does not need checking of its upper-bound since taking
444 ``% 7`` in gettmarg() automatically restricts the range. */
445 if (buf.tm_wday < 0) {
446 PyErr_SetString(PyExc_ValueError, "day of week out of range");
447 return NULL;
448 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000449 if (buf.tm_yday == -1)
450 buf.tm_yday = 0;
451 else if (buf.tm_yday < 0 || buf.tm_yday > 365) {
Brett Cannond1080a32004-03-02 04:38:10 +0000452 PyErr_SetString(PyExc_ValueError, "day of year out of range");
453 return NULL;
454 }
455 if (buf.tm_isdst < -1 || buf.tm_isdst > 1) {
456 PyErr_SetString(PyExc_ValueError,
457 "daylight savings flag out of range");
458 return NULL;
459 }
460
Guido van Rossumc222ec21999-02-23 00:00:10 +0000461 fmtlen = strlen(fmt);
462
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000463 /* I hate these functions that presume you know how big the output
464 * will be ahead of time...
465 */
Guido van Rossumc222ec21999-02-23 00:00:10 +0000466 for (i = 1024; ; i += i) {
Walter Dörwaldcf47af42007-05-31 19:23:17 +0000467 outbuf = (char *)PyMem_Malloc(i);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000468 if (outbuf == NULL) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000469 return PyErr_NoMemory();
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000470 }
Guido van Rossumc222ec21999-02-23 00:00:10 +0000471 buflen = strftime(outbuf, i, fmt, &buf);
472 if (buflen > 0 || i >= 256 * fmtlen) {
473 /* If the buffer is 256 times as long as the format,
474 it's probably not failing for lack of room!
475 More likely, the format yields an empty result,
476 e.g. an empty format, or %Z when the timezone
477 is unknown. */
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000478 PyObject *ret;
Walter Dörwaldcf47af42007-05-31 19:23:17 +0000479 ret = PyUnicode_FromStringAndSize(outbuf, buflen);
480 PyMem_Free(outbuf);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000481 return ret;
482 }
Walter Dörwaldcf47af42007-05-31 19:23:17 +0000483 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000484#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
485 /* VisualStudio .NET 2005 does this properly */
486 if (buflen == 0 && errno == EINVAL) {
487 PyErr_SetString(PyExc_ValueError, "Invalid format string");
488 return 0;
489 }
490#endif
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000491 }
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000492}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000494PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000495"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000496\n\
497Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000498See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000499is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000500#endif /* HAVE_STRFTIME */
501
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000502static PyObject *
503time_strptime(PyObject *self, PyObject *args)
504{
505 PyObject *strptime_module = PyImport_ImportModule("_strptime");
Raymond Hettinger502168a2003-04-10 16:03:22 +0000506 PyObject *strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000507
Tim Peters513a1cd2003-01-19 04:54:58 +0000508 if (!strptime_module)
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000509 return NULL;
Raymond Hettinger502168a2003-04-10 16:03:22 +0000510 strptime_result = PyObject_CallMethod(strptime_module, "strptime", "O", args);
511 Py_DECREF(strptime_module);
512 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000513}
514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000515PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000516"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000517\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000518Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000519See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000520
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000521
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000522static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000523time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000524{
Thomas Woutersfe385252001-01-19 23:16:56 +0000525 PyObject *tup = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000526 struct tm buf;
527 char *p;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000528 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000529 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000530 if (tup == NULL) {
531 time_t tt = time(NULL);
532 buf = *localtime(&tt);
533 } else if (!gettmarg(tup, &buf))
Guido van Rossum9e90a671993-06-24 11:10:19 +0000534 return NULL;
535 p = asctime(&buf);
536 if (p[24] == '\n')
537 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000538 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000539}
540
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000541PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000542"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000543\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000544Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
545When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000546is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000547
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000548static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000549time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000550{
Fred Drakef901abd2004-08-03 17:58:55 +0000551 PyObject *ot = NULL;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000552 time_t tt;
553 char *p;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000554
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000555 if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))
Fred Drakef901abd2004-08-03 17:58:55 +0000556 return NULL;
557 if (ot == NULL || ot == Py_None)
Thomas Woutersfe385252001-01-19 23:16:56 +0000558 tt = time(NULL);
559 else {
Fred Drakef901abd2004-08-03 17:58:55 +0000560 double dt = PyFloat_AsDouble(ot);
561 if (PyErr_Occurred())
Thomas Woutersfe385252001-01-19 23:16:56 +0000562 return NULL;
Brett Cannon298c3802004-06-19 20:48:43 +0000563 tt = _PyTime_DoubleToTimet(dt);
564 if (tt == (time_t)-1 && PyErr_Occurred())
565 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000566 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000567 p = ctime(&tt);
Guido van Rossum78535701998-03-03 22:19:10 +0000568 if (p == NULL) {
569 PyErr_SetString(PyExc_ValueError, "unconvertible time");
570 return NULL;
571 }
Guido van Rossum9e90a671993-06-24 11:10:19 +0000572 if (p[24] == '\n')
573 p[24] = '\0';
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000574 return PyString_FromString(p);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000575}
576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000577PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000578"ctime(seconds) -> string\n\
579\n\
580Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000581This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000582not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000583
Guido van Rossum60cd8131998-03-06 17:16:21 +0000584#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000585static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000586time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000587{
588 struct tm buf;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000589 time_t tt;
590 tt = time(&tt);
591 buf = *localtime(&tt);
Guido van Rossumb2b42dd2000-01-12 16:38:20 +0000592 if (!gettmarg(tup, &buf))
Guido van Rossum234f9421993-06-17 12:35:49 +0000593 return NULL;
Guido van Rossumbceeac81996-05-23 22:53:47 +0000594 tt = mktime(&buf);
595 if (tt == (time_t)(-1)) {
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000596 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum10b164a2001-09-25 13:59:01 +0000597 "mktime argument out of range");
Guido van Rossumbceeac81996-05-23 22:53:47 +0000598 return NULL;
599 }
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000600 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000601}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000602
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000603PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000604"mktime(tuple) -> floating point number\n\
605\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000606Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000607#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000608
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000609#ifdef HAVE_WORKING_TZSET
610void inittimezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000612static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000613time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614{
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000615 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000616
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000617 m = PyImport_ImportModule("time");
618 if (m == NULL) {
619 return NULL;
620 }
621
622 tzset();
623
624 /* Reset timezone, altzone, daylight and tzname */
625 inittimezone(m);
626 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000627
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000628 Py_INCREF(Py_None);
629 return Py_None;
630}
631
632PyDoc_STRVAR(tzset_doc,
633"tzset(zone)\n\
634\n\
635Initialize, or reinitialize, the local timezone to the value stored in\n\
636os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000637standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000638(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
639fall back to UTC. If the TZ environment variable is not set, the local\n\
640timezone is set to the systems best guess of wallclock time.\n\
641Changing the TZ environment variable without calling tzset *may* change\n\
642the local timezone used by methods such as localtime, but this behaviour\n\
643should not be relied on.");
644#endif /* HAVE_WORKING_TZSET */
645
646void inittimezone(PyObject *m) {
647 /* This code moved from inittime wholesale to allow calling it from
648 time_tzset. In the future, some parts of it can be moved back
649 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
650 are), and the extranious calls to tzset(3) should be removed.
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000651 I haven't done this yet, as I don't want to change this code as
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000652 little as possible when introducing the time.tzset and time.tzsetwall
653 methods. This should simply be a method of doing the following once,
654 at the top of this function and removing the call to tzset() from
655 time_tzset():
656
657 #ifdef HAVE_TZSET
658 tzset()
659 #endif
660
661 And I'm lazy and hate C so nyer.
662 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000663#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Guido van Rossum234f9421993-06-17 12:35:49 +0000664 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000665#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000666 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000667#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000668 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000669#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000670#ifdef HAVE_ALTZONE
Fred Drake9bb74322002-04-01 14:49:59 +0000671 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000672#else
Guido van Rossum26452411998-09-28 22:07:11 +0000673#ifdef PYOS_OS2
Fred Drake9bb74322002-04-01 14:49:59 +0000674 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000675#else /* !PYOS_OS2 */
Fred Drake9bb74322002-04-01 14:49:59 +0000676 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000677#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000678#endif
Fred Drake9bb74322002-04-01 14:49:59 +0000679 PyModule_AddIntConstant(m, "daylight", daylight);
680 PyModule_AddObject(m, "tzname",
681 Py_BuildValue("(zz)", tzname[0], tzname[1]));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000682#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000683#ifdef HAVE_STRUCT_TM_TM_ZONE
Guido van Rossum234f9421993-06-17 12:35:49 +0000684 {
685#define YEAR ((time_t)((365 * 24 + 6) * 3600))
686 time_t t;
687 struct tm *p;
Guido van Rossum57731601999-03-29 19:12:04 +0000688 long janzone, julyzone;
689 char janname[10], julyname[10];
Guido van Rossum234f9421993-06-17 12:35:49 +0000690 t = (time((time_t *)0) / YEAR) * YEAR;
691 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000692 janzone = -p->tm_gmtoff;
693 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
694 janname[9] = '\0';
Guido van Rossum234f9421993-06-17 12:35:49 +0000695 t += YEAR/2;
696 p = localtime(&t);
Guido van Rossum57731601999-03-29 19:12:04 +0000697 julyzone = -p->tm_gmtoff;
698 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
699 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000700
Guido van Rossum57731601999-03-29 19:12:04 +0000701 if( janzone < julyzone ) {
702 /* DST is reversed in the southern hemisphere */
Fred Drake9bb74322002-04-01 14:49:59 +0000703 PyModule_AddIntConstant(m, "timezone", julyzone);
704 PyModule_AddIntConstant(m, "altzone", janzone);
705 PyModule_AddIntConstant(m, "daylight",
706 janzone != julyzone);
707 PyModule_AddObject(m, "tzname",
708 Py_BuildValue("(zz)",
709 julyname, janname));
Guido van Rossum57731601999-03-29 19:12:04 +0000710 } else {
Fred Drake9bb74322002-04-01 14:49:59 +0000711 PyModule_AddIntConstant(m, "timezone", janzone);
712 PyModule_AddIntConstant(m, "altzone", julyzone);
713 PyModule_AddIntConstant(m, "daylight",
714 janzone != julyzone);
715 PyModule_AddObject(m, "tzname",
716 Py_BuildValue("(zz)",
717 janname, julyname));
Guido van Rossum57731601999-03-29 19:12:04 +0000718 }
Guido van Rossum234f9421993-06-17 12:35:49 +0000719 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000720#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000721#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000722#ifdef __CYGWIN__
723 tzset();
Fred Drake9bb74322002-04-01 14:49:59 +0000724 PyModule_AddIntConstant(m, "timezone", _timezone);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000725 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Fred Drake9bb74322002-04-01 14:49:59 +0000726 PyModule_AddIntConstant(m, "daylight", _daylight);
727 PyModule_AddObject(m, "tzname",
728 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000729#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000730#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000731}
732
733
734static PyMethodDef time_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000735 {"time", time_time, METH_NOARGS, time_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000736#ifdef HAVE_CLOCK
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000737 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000738#endif
739 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
740 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
741 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
742 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
743 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
744#ifdef HAVE_MKTIME
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000745 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000746#endif
747#ifdef HAVE_STRFTIME
748 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
749#endif
750 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
751#ifdef HAVE_WORKING_TZSET
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000752 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000753#endif
754 {NULL, NULL} /* sentinel */
755};
756
757
758PyDoc_STRVAR(module_doc,
759"This module provides various functions to manipulate time values.\n\
760\n\
761There are two standard representations of time. One is the number\n\
762of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
763or a floating point number (to represent fractions of seconds).\n\
764The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
765The actual value can be retrieved by calling gmtime(0).\n\
766\n\
767The other representation is a tuple of 9 integers giving local time.\n\
768The tuple items are:\n\
769 year (four digits, e.g. 1998)\n\
770 month (1-12)\n\
771 day (1-31)\n\
772 hours (0-23)\n\
773 minutes (0-59)\n\
774 seconds (0-59)\n\
775 weekday (0-6, Monday is 0)\n\
776 Julian day (day in the year, 1-366)\n\
777 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
778If the DST flag is 0, the time is given in the regular time zone;\n\
779if it is 1, the time is given in the DST time zone;\n\
780if it is -1, mktime() should guess based on the date and time.\n\
781\n\
782Variables:\n\
783\n\
784timezone -- difference in seconds between UTC and local standard time\n\
785altzone -- difference in seconds between UTC and local DST time\n\
786daylight -- whether local time should reflect DST\n\
787tzname -- tuple of (standard time zone name, DST time zone name)\n\
788\n\
789Functions:\n\
790\n\
791time() -- return current time in seconds since the Epoch as a float\n\
792clock() -- return CPU time since process start as a float\n\
793sleep() -- delay for a number of seconds given as a float\n\
794gmtime() -- convert seconds since Epoch to UTC tuple\n\
795localtime() -- convert seconds since Epoch to local time tuple\n\
796asctime() -- convert time tuple to string\n\
797ctime() -- convert time in seconds to string\n\
798mktime() -- convert local time tuple to seconds since Epoch\n\
799strftime() -- convert time tuple to string according to format specification\n\
800strptime() -- parse string to time tuple according to format specification\n\
801tzset() -- change the local timezone");
802
803
804PyMODINIT_FUNC
805inittime(void)
806{
807 PyObject *m;
808 char *p;
809 m = Py_InitModule3("time", time_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000810 if (m == NULL)
811 return;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000812
813 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
814 p = Py_GETENV("PYTHONY2K");
815 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
816 /* Squirrel away the module's dictionary for the y2k check */
817 moddict = PyModule_GetDict(m);
818 Py_INCREF(moddict);
819
820 /* Set, or reset, module variables like time.timezone */
821 inittimezone(m);
822
Mark Hammond975e3922002-07-16 01:29:19 +0000823#ifdef MS_WINDOWS
824 /* Helper to allow interrupts for Windows.
825 If Ctrl+C event delivered while not sleeping
826 it will be ignored.
827 */
828 main_thread = PyThread_get_thread_ident();
829 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
830 SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
831#endif /* MS_WINDOWS */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000832 if (!initialized) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000833 PyStructSequence_InitType(&StructTimeType,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000834 &struct_time_type_desc);
835 }
Fred Drake9bb74322002-04-01 14:49:59 +0000836 Py_INCREF(&StructTimeType);
837 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000838 initialized = 1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839}
840
841
Guido van Rossumb6775db1994-08-01 11:34:53 +0000842/* Implement floattime() for various platforms */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000843
Guido van Rossumb6775db1994-08-01 11:34:53 +0000844static double
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000845floattime(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000846{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000847 /* There are three ways to get the time:
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000848 (1) gettimeofday() -- resolution in microseconds
849 (2) ftime() -- resolution in milliseconds
850 (3) time() -- resolution in seconds
851 In all cases the return value is a float in seconds.
852 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
853 fail, so we fall back on ftime() or time().
854 Note: clock resolution does not imply clock accuracy! */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000855#ifdef HAVE_GETTIMEOFDAY
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000856 {
857 struct timeval t;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000858#ifdef GETTIMEOFDAY_NO_TZ
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000859 if (gettimeofday(&t) == 0)
860 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000861#else /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000862 if (gettimeofday(&t, (struct timezone *)NULL) == 0)
863 return (double)t.tv_sec + t.tv_usec*0.000001;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000864#endif /* !GETTIMEOFDAY_NO_TZ */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000865 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000866
Guido van Rossumb6775db1994-08-01 11:34:53 +0000867#endif /* !HAVE_GETTIMEOFDAY */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000868 {
Guido van Rossumd3eb5771999-03-09 16:07:23 +0000869#if defined(HAVE_FTIME)
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000870 struct timeb t;
871 ftime(&t);
872 return (double)t.time + (double)t.millitm * (double)0.001;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000873#else /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000874 time_t secs;
875 time(&secs);
876 return (double)secs;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000877#endif /* !HAVE_FTIME */
Barry Warsaw4a6cf411997-01-13 22:44:55 +0000878 }
Guido van Rossum426035c1991-02-19 12:27:35 +0000879}
880
Guido van Rossumb6775db1994-08-01 11:34:53 +0000881
882/* Implement floatsleep() for various platforms.
883 When interrupted (or when another error occurs), return -1 and
884 set an exception; else return 0. */
885
886static int
Guido van Rossuma320fd31995-03-09 12:14:15 +0000887floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +0000888{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000889/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000890#if defined(HAVE_SELECT) && !defined(__EMX__)
Guido van Rossum426035c1991-02-19 12:27:35 +0000891 struct timeval t;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000892 double frac;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000893 frac = fmod(secs, 1.0);
894 secs = floor(secs);
895 t.tv_sec = (long)secs;
896 t.tv_usec = (long)(frac*1000000.0);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000897 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000898 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000899#ifdef EINTR
Guido van Rossuma5456d51999-08-19 14:40:27 +0000900 if (errno != EINTR) {
Guido van Rossum09cbb011999-11-08 15:32:27 +0000901#else
902 if (1) {
903#endif
Andrew M. Kuchlingc24ca4b2000-03-24 20:35:20 +0000904 Py_BLOCK_THREADS
Guido van Rossuma5456d51999-08-19 14:40:27 +0000905 PyErr_SetFromErrno(PyExc_IOError);
906 return -1;
907 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000908 }
Guido van Rossum8607ae21997-11-03 22:04:46 +0000909 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000910#elif defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +0000911 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000912 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbceeac81996-05-23 22:53:47 +0000913 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000914 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000915#elif defined(MS_WINDOWS)
Fred Drake0e123952000-06-29 21:31:02 +0000916 {
917 double millisecs = secs * 1000.0;
Tim Peters513a1cd2003-01-19 04:54:58 +0000918 unsigned long ul_millis;
919
Fred Drake0e123952000-06-29 21:31:02 +0000920 if (millisecs > (double)ULONG_MAX) {
Tim Peters513a1cd2003-01-19 04:54:58 +0000921 PyErr_SetString(PyExc_OverflowError,
922 "sleep length is too large");
Fred Drake0e123952000-06-29 21:31:02 +0000923 return -1;
924 }
Fred Drake0e123952000-06-29 21:31:02 +0000925 Py_BEGIN_ALLOW_THREADS
Tim Peters513a1cd2003-01-19 04:54:58 +0000926 /* Allow sleep(0) to maintain win32 semantics, and as decreed
927 * by Guido, only the main thread can be interrupted.
928 */
929 ul_millis = (unsigned long)millisecs;
930 if (ul_millis == 0 ||
931 main_thread != PyThread_get_thread_ident())
932 Sleep(ul_millis);
Mark Hammond975e3922002-07-16 01:29:19 +0000933 else {
934 DWORD rc;
935 ResetEvent(hInterruptEvent);
Tim Peters513a1cd2003-01-19 04:54:58 +0000936 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
937 if (rc == WAIT_OBJECT_0) {
938 /* Yield to make sure real Python signal
939 * handler called.
940 */
Mark Hammond975e3922002-07-16 01:29:19 +0000941 Sleep(1);
942 Py_BLOCK_THREADS
Mark Hammond975e3922002-07-16 01:29:19 +0000943 errno = EINTR;
944 PyErr_SetFromErrno(PyExc_IOError);
945 return -1;
946 }
947 }
Fred Drake0e123952000-06-29 21:31:02 +0000948 Py_END_ALLOW_THREADS
949 }
Martin v. Löwis02af9642002-01-16 11:04:06 +0000950#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000951 /* This Sleep *IS* Interruptable by Exceptions */
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000952 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000953 if (DosSleep(secs * 1000) != NO_ERROR) {
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000954 Py_BLOCK_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000955 PyErr_SetFromErrno(PyExc_IOError);
956 return -1;
957 }
Guido van Rossum1d0d7e41997-12-29 20:03:10 +0000958 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000959#elif defined(PLAN9)
960 {
961 double millisecs = secs * 1000.0;
962 if (millisecs > (double)LONG_MAX) {
963 PyErr_SetString(PyExc_OverflowError, "sleep length is too large");
964 return -1;
965 }
966 /* This sleep *CAN BE* interrupted. */
967 Py_BEGIN_ALLOW_THREADS
968 if(sleep((long)millisecs) < 0){
969 Py_BLOCK_THREADS
970 PyErr_SetFromErrno(PyExc_IOError);
971 return -1;
972 }
973 Py_END_ALLOW_THREADS
974 }
975#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000976 /* XXX Can't interrupt this sleep */
Guido van Rossum8607ae21997-11-03 22:04:46 +0000977 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000978 sleep((int)secs);
Guido van Rossum8607ae21997-11-03 22:04:46 +0000979 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +0000980#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000981
Guido van Rossumb6775db1994-08-01 11:34:53 +0000982 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +0000983}
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000984
985