blob: 165ddbde315ed5576d1753bc5ae8a54c3f87ddd4 [file] [log] [blame]
Tim Peters2a799bf2002-12-16 20:18:38 +00001/* C implementation for the date/time type documented at
2 * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage
3 */
4
5#include "Python.h"
6#include "modsupport.h"
7#include "structmember.h"
8
9#include <time.h>
10
Tim Peters1b6f7a92004-06-20 02:50:16 +000011#include "timefuncs.h"
Tim Peters9ddf40b2004-06-20 22:41:32 +000012
13/* Differentiate between building the core module and building extension
14 * modules.
15 */
Guido van Rossum360e4b82007-05-14 22:51:27 +000016#ifndef Py_BUILD_CORE
Tim Peters9ddf40b2004-06-20 22:41:32 +000017#define Py_BUILD_CORE
Guido van Rossum360e4b82007-05-14 22:51:27 +000018#endif
Tim Peters2a799bf2002-12-16 20:18:38 +000019#include "datetime.h"
Tim Peters9ddf40b2004-06-20 22:41:32 +000020#undef Py_BUILD_CORE
Tim Peters2a799bf2002-12-16 20:18:38 +000021
22/* We require that C int be at least 32 bits, and use int virtually
23 * everywhere. In just a few cases we use a temp long, where a Python
24 * API returns a C long. In such cases, we have to ensure that the
25 * final result fits in a C int (this can be an issue on 64-bit boxes).
26 */
27#if SIZEOF_INT < 4
28# error "datetime.c requires that C int have at least 32 bits"
29#endif
30
31#define MINYEAR 1
32#define MAXYEAR 9999
33
34/* Nine decimal digits is easy to communicate, and leaves enough room
35 * so that two delta days can be added w/o fear of overflowing a signed
36 * 32-bit int, and with plenty of room left over to absorb any possible
37 * carries from adding seconds.
38 */
39#define MAX_DELTA_DAYS 999999999
40
41/* Rename the long macros in datetime.h to more reasonable short names. */
42#define GET_YEAR PyDateTime_GET_YEAR
43#define GET_MONTH PyDateTime_GET_MONTH
44#define GET_DAY PyDateTime_GET_DAY
45#define DATE_GET_HOUR PyDateTime_DATE_GET_HOUR
46#define DATE_GET_MINUTE PyDateTime_DATE_GET_MINUTE
47#define DATE_GET_SECOND PyDateTime_DATE_GET_SECOND
48#define DATE_GET_MICROSECOND PyDateTime_DATE_GET_MICROSECOND
49
50/* Date accessors for date and datetime. */
51#define SET_YEAR(o, v) (((o)->data[0] = ((v) & 0xff00) >> 8), \
52 ((o)->data[1] = ((v) & 0x00ff)))
53#define SET_MONTH(o, v) (PyDateTime_GET_MONTH(o) = (v))
54#define SET_DAY(o, v) (PyDateTime_GET_DAY(o) = (v))
55
56/* Date/Time accessors for datetime. */
57#define DATE_SET_HOUR(o, v) (PyDateTime_DATE_GET_HOUR(o) = (v))
58#define DATE_SET_MINUTE(o, v) (PyDateTime_DATE_GET_MINUTE(o) = (v))
59#define DATE_SET_SECOND(o, v) (PyDateTime_DATE_GET_SECOND(o) = (v))
60#define DATE_SET_MICROSECOND(o, v) \
61 (((o)->data[7] = ((v) & 0xff0000) >> 16), \
62 ((o)->data[8] = ((v) & 0x00ff00) >> 8), \
63 ((o)->data[9] = ((v) & 0x0000ff)))
64
65/* Time accessors for time. */
66#define TIME_GET_HOUR PyDateTime_TIME_GET_HOUR
67#define TIME_GET_MINUTE PyDateTime_TIME_GET_MINUTE
68#define TIME_GET_SECOND PyDateTime_TIME_GET_SECOND
69#define TIME_GET_MICROSECOND PyDateTime_TIME_GET_MICROSECOND
70#define TIME_SET_HOUR(o, v) (PyDateTime_TIME_GET_HOUR(o) = (v))
71#define TIME_SET_MINUTE(o, v) (PyDateTime_TIME_GET_MINUTE(o) = (v))
72#define TIME_SET_SECOND(o, v) (PyDateTime_TIME_GET_SECOND(o) = (v))
73#define TIME_SET_MICROSECOND(o, v) \
74 (((o)->data[3] = ((v) & 0xff0000) >> 16), \
75 ((o)->data[4] = ((v) & 0x00ff00) >> 8), \
76 ((o)->data[5] = ((v) & 0x0000ff)))
77
78/* Delta accessors for timedelta. */
79#define GET_TD_DAYS(o) (((PyDateTime_Delta *)(o))->days)
80#define GET_TD_SECONDS(o) (((PyDateTime_Delta *)(o))->seconds)
81#define GET_TD_MICROSECONDS(o) (((PyDateTime_Delta *)(o))->microseconds)
82
83#define SET_TD_DAYS(o, v) ((o)->days = (v))
84#define SET_TD_SECONDS(o, v) ((o)->seconds = (v))
85#define SET_TD_MICROSECONDS(o, v) ((o)->microseconds = (v))
86
Tim Petersa032d2e2003-01-11 00:15:54 +000087/* p is a pointer to a time or a datetime object; HASTZINFO(p) returns
88 * p->hastzinfo.
89 */
90#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo)
91
Tim Peters3f606292004-03-21 23:38:41 +000092/* M is a char or int claiming to be a valid month. The macro is equivalent
93 * to the two-sided Python test
94 * 1 <= M <= 12
95 */
96#define MONTH_IS_SANE(M) ((unsigned int)(M) - 1 < 12)
97
Tim Peters2a799bf2002-12-16 20:18:38 +000098/* Forward declarations. */
99static PyTypeObject PyDateTime_DateType;
100static PyTypeObject PyDateTime_DateTimeType;
Tim Peters2a799bf2002-12-16 20:18:38 +0000101static PyTypeObject PyDateTime_DeltaType;
102static PyTypeObject PyDateTime_TimeType;
103static PyTypeObject PyDateTime_TZInfoType;
Tim Peters2a799bf2002-12-16 20:18:38 +0000104
105/* ---------------------------------------------------------------------------
106 * Math utilities.
107 */
108
109/* k = i+j overflows iff k differs in sign from both inputs,
110 * iff k^i has sign bit set and k^j has sign bit set,
111 * iff (k^i)&(k^j) has sign bit set.
112 */
113#define SIGNED_ADD_OVERFLOWED(RESULT, I, J) \
114 ((((RESULT) ^ (I)) & ((RESULT) ^ (J))) < 0)
115
116/* Compute Python divmod(x, y), returning the quotient and storing the
117 * remainder into *r. The quotient is the floor of x/y, and that's
118 * the real point of this. C will probably truncate instead (C99
119 * requires truncation; C89 left it implementation-defined).
120 * Simplification: we *require* that y > 0 here. That's appropriate
121 * for all the uses made of it. This simplifies the code and makes
122 * the overflow case impossible (divmod(LONG_MIN, -1) is the only
123 * overflow case).
124 */
125static int
126divmod(int x, int y, int *r)
127{
128 int quo;
129
130 assert(y > 0);
131 quo = x / y;
132 *r = x - quo * y;
133 if (*r < 0) {
134 --quo;
135 *r += y;
136 }
137 assert(0 <= *r && *r < y);
138 return quo;
139}
140
Tim Peters5d644dd2003-01-02 16:32:54 +0000141/* Round a double to the nearest long. |x| must be small enough to fit
142 * in a C long; this is not checked.
143 */
144static long
145round_to_long(double x)
146{
147 if (x >= 0.0)
148 x = floor(x + 0.5);
149 else
150 x = ceil(x - 0.5);
151 return (long)x;
152}
153
Tim Peters2a799bf2002-12-16 20:18:38 +0000154/* ---------------------------------------------------------------------------
155 * General calendrical helper functions
156 */
157
158/* For each month ordinal in 1..12, the number of days in that month,
159 * and the number of days before that month in the same year. These
160 * are correct for non-leap years only.
161 */
162static int _days_in_month[] = {
163 0, /* unused; this vector uses 1-based indexing */
164 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
165};
166
167static int _days_before_month[] = {
168 0, /* unused; this vector uses 1-based indexing */
169 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
170};
171
172/* year -> 1 if leap year, else 0. */
173static int
174is_leap(int year)
175{
176 /* Cast year to unsigned. The result is the same either way, but
177 * C can generate faster code for unsigned mod than for signed
178 * mod (especially for % 4 -- a good compiler should just grab
179 * the last 2 bits when the LHS is unsigned).
180 */
181 const unsigned int ayear = (unsigned int)year;
182 return ayear % 4 == 0 && (ayear % 100 != 0 || ayear % 400 == 0);
183}
184
185/* year, month -> number of days in that month in that year */
186static int
187days_in_month(int year, int month)
188{
189 assert(month >= 1);
190 assert(month <= 12);
191 if (month == 2 && is_leap(year))
192 return 29;
193 else
194 return _days_in_month[month];
195}
196
197/* year, month -> number of days in year preceeding first day of month */
198static int
199days_before_month(int year, int month)
200{
201 int days;
202
203 assert(month >= 1);
204 assert(month <= 12);
205 days = _days_before_month[month];
206 if (month > 2 && is_leap(year))
207 ++days;
208 return days;
209}
210
211/* year -> number of days before January 1st of year. Remember that we
212 * start with year 1, so days_before_year(1) == 0.
213 */
214static int
215days_before_year(int year)
216{
217 int y = year - 1;
218 /* This is incorrect if year <= 0; we really want the floor
219 * here. But so long as MINYEAR is 1, the smallest year this
220 * can see is 0 (this can happen in some normalization endcases),
221 * so we'll just special-case that.
222 */
223 assert (year >= 0);
224 if (y >= 0)
225 return y*365 + y/4 - y/100 + y/400;
226 else {
227 assert(y == -1);
228 return -366;
229 }
230}
231
232/* Number of days in 4, 100, and 400 year cycles. That these have
233 * the correct values is asserted in the module init function.
234 */
235#define DI4Y 1461 /* days_before_year(5); days in 4 years */
236#define DI100Y 36524 /* days_before_year(101); days in 100 years */
237#define DI400Y 146097 /* days_before_year(401); days in 400 years */
238
239/* ordinal -> year, month, day, considering 01-Jan-0001 as day 1. */
240static void
241ord_to_ymd(int ordinal, int *year, int *month, int *day)
242{
243 int n, n1, n4, n100, n400, leapyear, preceding;
244
245 /* ordinal is a 1-based index, starting at 1-Jan-1. The pattern of
246 * leap years repeats exactly every 400 years. The basic strategy is
247 * to find the closest 400-year boundary at or before ordinal, then
248 * work with the offset from that boundary to ordinal. Life is much
249 * clearer if we subtract 1 from ordinal first -- then the values
250 * of ordinal at 400-year boundaries are exactly those divisible
251 * by DI400Y:
252 *
253 * D M Y n n-1
254 * -- --- ---- ---------- ----------------
255 * 31 Dec -400 -DI400Y -DI400Y -1
256 * 1 Jan -399 -DI400Y +1 -DI400Y 400-year boundary
257 * ...
258 * 30 Dec 000 -1 -2
259 * 31 Dec 000 0 -1
260 * 1 Jan 001 1 0 400-year boundary
261 * 2 Jan 001 2 1
262 * 3 Jan 001 3 2
263 * ...
264 * 31 Dec 400 DI400Y DI400Y -1
265 * 1 Jan 401 DI400Y +1 DI400Y 400-year boundary
266 */
267 assert(ordinal >= 1);
268 --ordinal;
269 n400 = ordinal / DI400Y;
270 n = ordinal % DI400Y;
271 *year = n400 * 400 + 1;
272
273 /* Now n is the (non-negative) offset, in days, from January 1 of
274 * year, to the desired date. Now compute how many 100-year cycles
275 * precede n.
276 * Note that it's possible for n100 to equal 4! In that case 4 full
277 * 100-year cycles precede the desired day, which implies the
278 * desired day is December 31 at the end of a 400-year cycle.
279 */
280 n100 = n / DI100Y;
281 n = n % DI100Y;
282
283 /* Now compute how many 4-year cycles precede it. */
284 n4 = n / DI4Y;
285 n = n % DI4Y;
286
287 /* And now how many single years. Again n1 can be 4, and again
288 * meaning that the desired day is December 31 at the end of the
289 * 4-year cycle.
290 */
291 n1 = n / 365;
292 n = n % 365;
293
294 *year += n100 * 100 + n4 * 4 + n1;
295 if (n1 == 4 || n100 == 4) {
296 assert(n == 0);
297 *year -= 1;
298 *month = 12;
299 *day = 31;
300 return;
301 }
302
303 /* Now the year is correct, and n is the offset from January 1. We
304 * find the month via an estimate that's either exact or one too
305 * large.
306 */
307 leapyear = n1 == 3 && (n4 != 24 || n100 == 3);
308 assert(leapyear == is_leap(*year));
309 *month = (n + 50) >> 5;
310 preceding = (_days_before_month[*month] + (*month > 2 && leapyear));
311 if (preceding > n) {
312 /* estimate is too large */
313 *month -= 1;
314 preceding -= days_in_month(*year, *month);
315 }
316 n -= preceding;
317 assert(0 <= n);
318 assert(n < days_in_month(*year, *month));
319
320 *day = n + 1;
321}
322
323/* year, month, day -> ordinal, considering 01-Jan-0001 as day 1. */
324static int
325ymd_to_ord(int year, int month, int day)
326{
327 return days_before_year(year) + days_before_month(year, month) + day;
328}
329
330/* Day of week, where Monday==0, ..., Sunday==6. 1/1/1 was a Monday. */
331static int
332weekday(int year, int month, int day)
333{
334 return (ymd_to_ord(year, month, day) + 6) % 7;
335}
336
337/* Ordinal of the Monday starting week 1 of the ISO year. Week 1 is the
338 * first calendar week containing a Thursday.
339 */
340static int
341iso_week1_monday(int year)
342{
343 int first_day = ymd_to_ord(year, 1, 1); /* ord of 1/1 */
344 /* 0 if 1/1 is a Monday, 1 if a Tue, etc. */
345 int first_weekday = (first_day + 6) % 7;
346 /* ordinal of closest Monday at or before 1/1 */
347 int week1_monday = first_day - first_weekday;
348
349 if (first_weekday > 3) /* if 1/1 was Fri, Sat, Sun */
350 week1_monday += 7;
351 return week1_monday;
352}
353
354/* ---------------------------------------------------------------------------
355 * Range checkers.
356 */
357
358/* Check that -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS. If so, return 0.
359 * If not, raise OverflowError and return -1.
360 */
361static int
362check_delta_day_range(int days)
363{
364 if (-MAX_DELTA_DAYS <= days && days <= MAX_DELTA_DAYS)
365 return 0;
366 PyErr_Format(PyExc_OverflowError,
367 "days=%d; must have magnitude <= %d",
Guido van Rossumbd43e912002-12-16 20:34:55 +0000368 days, MAX_DELTA_DAYS);
Tim Peters2a799bf2002-12-16 20:18:38 +0000369 return -1;
370}
371
372/* Check that date arguments are in range. Return 0 if they are. If they
373 * aren't, raise ValueError and return -1.
374 */
375static int
376check_date_args(int year, int month, int day)
377{
378
379 if (year < MINYEAR || year > MAXYEAR) {
380 PyErr_SetString(PyExc_ValueError,
381 "year is out of range");
382 return -1;
383 }
384 if (month < 1 || month > 12) {
385 PyErr_SetString(PyExc_ValueError,
386 "month must be in 1..12");
387 return -1;
388 }
389 if (day < 1 || day > days_in_month(year, month)) {
390 PyErr_SetString(PyExc_ValueError,
391 "day is out of range for month");
392 return -1;
393 }
394 return 0;
395}
396
397/* Check that time arguments are in range. Return 0 if they are. If they
398 * aren't, raise ValueError and return -1.
399 */
400static int
401check_time_args(int h, int m, int s, int us)
402{
403 if (h < 0 || h > 23) {
404 PyErr_SetString(PyExc_ValueError,
405 "hour must be in 0..23");
406 return -1;
407 }
408 if (m < 0 || m > 59) {
409 PyErr_SetString(PyExc_ValueError,
410 "minute must be in 0..59");
411 return -1;
412 }
413 if (s < 0 || s > 59) {
414 PyErr_SetString(PyExc_ValueError,
415 "second must be in 0..59");
416 return -1;
417 }
418 if (us < 0 || us > 999999) {
419 PyErr_SetString(PyExc_ValueError,
420 "microsecond must be in 0..999999");
421 return -1;
422 }
423 return 0;
424}
425
426/* ---------------------------------------------------------------------------
427 * Normalization utilities.
428 */
429
430/* One step of a mixed-radix conversion. A "hi" unit is equivalent to
431 * factor "lo" units. factor must be > 0. If *lo is less than 0, or
432 * at least factor, enough of *lo is converted into "hi" units so that
433 * 0 <= *lo < factor. The input values must be such that int overflow
434 * is impossible.
435 */
436static void
437normalize_pair(int *hi, int *lo, int factor)
438{
439 assert(factor > 0);
440 assert(lo != hi);
441 if (*lo < 0 || *lo >= factor) {
442 const int num_hi = divmod(*lo, factor, lo);
443 const int new_hi = *hi + num_hi;
444 assert(! SIGNED_ADD_OVERFLOWED(new_hi, *hi, num_hi));
445 *hi = new_hi;
446 }
447 assert(0 <= *lo && *lo < factor);
448}
449
450/* Fiddle days (d), seconds (s), and microseconds (us) so that
451 * 0 <= *s < 24*3600
452 * 0 <= *us < 1000000
453 * The input values must be such that the internals don't overflow.
454 * The way this routine is used, we don't get close.
455 */
456static void
457normalize_d_s_us(int *d, int *s, int *us)
458{
459 if (*us < 0 || *us >= 1000000) {
460 normalize_pair(s, us, 1000000);
461 /* |s| can't be bigger than about
462 * |original s| + |original us|/1000000 now.
463 */
464
465 }
466 if (*s < 0 || *s >= 24*3600) {
467 normalize_pair(d, s, 24*3600);
468 /* |d| can't be bigger than about
469 * |original d| +
470 * (|original s| + |original us|/1000000) / (24*3600) now.
471 */
472 }
473 assert(0 <= *s && *s < 24*3600);
474 assert(0 <= *us && *us < 1000000);
475}
476
477/* Fiddle years (y), months (m), and days (d) so that
478 * 1 <= *m <= 12
479 * 1 <= *d <= days_in_month(*y, *m)
480 * The input values must be such that the internals don't overflow.
481 * The way this routine is used, we don't get close.
482 */
483static void
484normalize_y_m_d(int *y, int *m, int *d)
485{
486 int dim; /* # of days in month */
487
488 /* This gets muddy: the proper range for day can't be determined
489 * without knowing the correct month and year, but if day is, e.g.,
490 * plus or minus a million, the current month and year values make
491 * no sense (and may also be out of bounds themselves).
492 * Saying 12 months == 1 year should be non-controversial.
493 */
494 if (*m < 1 || *m > 12) {
495 --*m;
496 normalize_pair(y, m, 12);
497 ++*m;
498 /* |y| can't be bigger than about
499 * |original y| + |original m|/12 now.
500 */
501 }
502 assert(1 <= *m && *m <= 12);
503
504 /* Now only day can be out of bounds (year may also be out of bounds
505 * for a datetime object, but we don't care about that here).
506 * If day is out of bounds, what to do is arguable, but at least the
507 * method here is principled and explainable.
508 */
509 dim = days_in_month(*y, *m);
510 if (*d < 1 || *d > dim) {
511 /* Move day-1 days from the first of the month. First try to
512 * get off cheap if we're only one day out of range
513 * (adjustments for timezone alone can't be worse than that).
514 */
515 if (*d == 0) {
516 --*m;
517 if (*m > 0)
518 *d = days_in_month(*y, *m);
519 else {
520 --*y;
521 *m = 12;
522 *d = 31;
523 }
524 }
525 else if (*d == dim + 1) {
526 /* move forward a day */
527 ++*m;
528 *d = 1;
529 if (*m > 12) {
530 *m = 1;
531 ++*y;
532 }
533 }
534 else {
535 int ordinal = ymd_to_ord(*y, *m, 1) +
536 *d - 1;
537 ord_to_ymd(ordinal, y, m, d);
538 }
539 }
540 assert(*m > 0);
541 assert(*d > 0);
542}
543
544/* Fiddle out-of-bounds months and days so that the result makes some kind
545 * of sense. The parameters are both inputs and outputs. Returns < 0 on
546 * failure, where failure means the adjusted year is out of bounds.
547 */
548static int
549normalize_date(int *year, int *month, int *day)
550{
551 int result;
552
553 normalize_y_m_d(year, month, day);
554 if (MINYEAR <= *year && *year <= MAXYEAR)
555 result = 0;
556 else {
557 PyErr_SetString(PyExc_OverflowError,
558 "date value out of range");
559 result = -1;
560 }
561 return result;
562}
563
564/* Force all the datetime fields into range. The parameters are both
565 * inputs and outputs. Returns < 0 on error.
566 */
567static int
568normalize_datetime(int *year, int *month, int *day,
569 int *hour, int *minute, int *second,
570 int *microsecond)
571{
572 normalize_pair(second, microsecond, 1000000);
573 normalize_pair(minute, second, 60);
574 normalize_pair(hour, minute, 60);
575 normalize_pair(day, hour, 24);
576 return normalize_date(year, month, day);
577}
578
579/* ---------------------------------------------------------------------------
Tim Petersb0c854d2003-05-17 15:57:00 +0000580 * Basic object allocation: tp_alloc implementations. These allocate
581 * Python objects of the right size and type, and do the Python object-
582 * initialization bit. If there's not enough memory, they return NULL after
583 * setting MemoryError. All data members remain uninitialized trash.
584 *
585 * We abuse the tp_alloc "nitems" argument to communicate whether a tzinfo
Tim Peters03eaf8b2003-05-18 02:24:46 +0000586 * member is needed. This is ugly, imprecise, and possibly insecure.
587 * tp_basicsize for the time and datetime types is set to the size of the
588 * struct that has room for the tzinfo member, so subclasses in Python will
589 * allocate enough space for a tzinfo member whether or not one is actually
590 * needed. That's the "ugly and imprecise" parts. The "possibly insecure"
591 * part is that PyType_GenericAlloc() (which subclasses in Python end up
592 * using) just happens today to effectively ignore the nitems argument
593 * when tp_itemsize is 0, which it is for these type objects. If that
594 * changes, perhaps the callers of tp_alloc slots in this file should
595 * be changed to force a 0 nitems argument unless the type being allocated
596 * is a base type implemented in this file (so that tp_alloc is time_alloc
597 * or datetime_alloc below, which know about the nitems abuse).
Tim Petersb0c854d2003-05-17 15:57:00 +0000598 */
599
600static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000601time_alloc(PyTypeObject *type, Py_ssize_t aware)
Tim Petersb0c854d2003-05-17 15:57:00 +0000602{
603 PyObject *self;
604
605 self = (PyObject *)
606 PyObject_MALLOC(aware ?
607 sizeof(PyDateTime_Time) :
608 sizeof(_PyDateTime_BaseTime));
609 if (self == NULL)
610 return (PyObject *)PyErr_NoMemory();
611 PyObject_INIT(self, type);
612 return self;
613}
614
615static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000616datetime_alloc(PyTypeObject *type, Py_ssize_t aware)
Tim Petersb0c854d2003-05-17 15:57:00 +0000617{
618 PyObject *self;
619
620 self = (PyObject *)
621 PyObject_MALLOC(aware ?
622 sizeof(PyDateTime_DateTime) :
623 sizeof(_PyDateTime_BaseDateTime));
624 if (self == NULL)
625 return (PyObject *)PyErr_NoMemory();
626 PyObject_INIT(self, type);
627 return self;
628}
629
630/* ---------------------------------------------------------------------------
631 * Helpers for setting object fields. These work on pointers to the
632 * appropriate base class.
633 */
634
635/* For date and datetime. */
636static void
637set_date_fields(PyDateTime_Date *self, int y, int m, int d)
638{
639 self->hashcode = -1;
640 SET_YEAR(self, y);
641 SET_MONTH(self, m);
642 SET_DAY(self, d);
643}
644
645/* ---------------------------------------------------------------------------
646 * Create various objects, mostly without range checking.
647 */
648
649/* Create a date instance with no range checking. */
650static PyObject *
651new_date_ex(int year, int month, int day, PyTypeObject *type)
652{
653 PyDateTime_Date *self;
654
655 self = (PyDateTime_Date *) (type->tp_alloc(type, 0));
656 if (self != NULL)
657 set_date_fields(self, year, month, day);
658 return (PyObject *) self;
659}
660
661#define new_date(year, month, day) \
662 new_date_ex(year, month, day, &PyDateTime_DateType)
663
664/* Create a datetime instance with no range checking. */
665static PyObject *
666new_datetime_ex(int year, int month, int day, int hour, int minute,
667 int second, int usecond, PyObject *tzinfo, PyTypeObject *type)
668{
669 PyDateTime_DateTime *self;
670 char aware = tzinfo != Py_None;
671
672 self = (PyDateTime_DateTime *) (type->tp_alloc(type, aware));
673 if (self != NULL) {
674 self->hastzinfo = aware;
675 set_date_fields((PyDateTime_Date *)self, year, month, day);
676 DATE_SET_HOUR(self, hour);
677 DATE_SET_MINUTE(self, minute);
678 DATE_SET_SECOND(self, second);
679 DATE_SET_MICROSECOND(self, usecond);
680 if (aware) {
681 Py_INCREF(tzinfo);
682 self->tzinfo = tzinfo;
683 }
684 }
685 return (PyObject *)self;
686}
687
688#define new_datetime(y, m, d, hh, mm, ss, us, tzinfo) \
689 new_datetime_ex(y, m, d, hh, mm, ss, us, tzinfo, \
690 &PyDateTime_DateTimeType)
691
692/* Create a time instance with no range checking. */
693static PyObject *
694new_time_ex(int hour, int minute, int second, int usecond,
695 PyObject *tzinfo, PyTypeObject *type)
696{
697 PyDateTime_Time *self;
698 char aware = tzinfo != Py_None;
699
700 self = (PyDateTime_Time *) (type->tp_alloc(type, aware));
701 if (self != NULL) {
702 self->hastzinfo = aware;
703 self->hashcode = -1;
704 TIME_SET_HOUR(self, hour);
705 TIME_SET_MINUTE(self, minute);
706 TIME_SET_SECOND(self, second);
707 TIME_SET_MICROSECOND(self, usecond);
708 if (aware) {
709 Py_INCREF(tzinfo);
710 self->tzinfo = tzinfo;
711 }
712 }
713 return (PyObject *)self;
714}
715
716#define new_time(hh, mm, ss, us, tzinfo) \
717 new_time_ex(hh, mm, ss, us, tzinfo, &PyDateTime_TimeType)
718
719/* Create a timedelta instance. Normalize the members iff normalize is
720 * true. Passing false is a speed optimization, if you know for sure
721 * that seconds and microseconds are already in their proper ranges. In any
722 * case, raises OverflowError and returns NULL if the normalized days is out
723 * of range).
724 */
725static PyObject *
726new_delta_ex(int days, int seconds, int microseconds, int normalize,
727 PyTypeObject *type)
728{
729 PyDateTime_Delta *self;
730
731 if (normalize)
732 normalize_d_s_us(&days, &seconds, &microseconds);
733 assert(0 <= seconds && seconds < 24*3600);
734 assert(0 <= microseconds && microseconds < 1000000);
735
736 if (check_delta_day_range(days) < 0)
737 return NULL;
738
739 self = (PyDateTime_Delta *) (type->tp_alloc(type, 0));
740 if (self != NULL) {
741 self->hashcode = -1;
742 SET_TD_DAYS(self, days);
743 SET_TD_SECONDS(self, seconds);
744 SET_TD_MICROSECONDS(self, microseconds);
745 }
746 return (PyObject *) self;
747}
748
749#define new_delta(d, s, us, normalize) \
750 new_delta_ex(d, s, us, normalize, &PyDateTime_DeltaType)
751
752/* ---------------------------------------------------------------------------
Tim Peters2a799bf2002-12-16 20:18:38 +0000753 * tzinfo helpers.
754 */
755
Tim Peters855fe882002-12-22 03:43:39 +0000756/* Ensure that p is None or of a tzinfo subclass. Return 0 if OK; if not
757 * raise TypeError and return -1.
758 */
759static int
760check_tzinfo_subclass(PyObject *p)
761{
762 if (p == Py_None || PyTZInfo_Check(p))
763 return 0;
764 PyErr_Format(PyExc_TypeError,
765 "tzinfo argument must be None or of a tzinfo subclass, "
766 "not type '%s'",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000767 Py_Type(p)->tp_name);
Tim Peters855fe882002-12-22 03:43:39 +0000768 return -1;
769}
770
Tim Petersbad8ff02002-12-30 20:52:32 +0000771/* Return tzinfo.methname(tzinfoarg), without any checking of results.
Tim Peters855fe882002-12-22 03:43:39 +0000772 * If tzinfo is None, returns None.
773 */
774static PyObject *
Tim Petersbad8ff02002-12-30 20:52:32 +0000775call_tzinfo_method(PyObject *tzinfo, char *methname, PyObject *tzinfoarg)
Tim Peters855fe882002-12-22 03:43:39 +0000776{
777 PyObject *result;
778
Tim Petersbad8ff02002-12-30 20:52:32 +0000779 assert(tzinfo && methname && tzinfoarg);
Tim Peters855fe882002-12-22 03:43:39 +0000780 assert(check_tzinfo_subclass(tzinfo) >= 0);
781 if (tzinfo == Py_None) {
782 result = Py_None;
783 Py_INCREF(result);
784 }
785 else
Tim Petersbad8ff02002-12-30 20:52:32 +0000786 result = PyObject_CallMethod(tzinfo, methname, "O", tzinfoarg);
Tim Peters855fe882002-12-22 03:43:39 +0000787 return result;
788}
789
Tim Peters2a799bf2002-12-16 20:18:38 +0000790/* If self has a tzinfo member, return a BORROWED reference to it. Else
791 * return NULL, which is NOT AN ERROR. There are no error returns here,
792 * and the caller must not decref the result.
793 */
794static PyObject *
795get_tzinfo_member(PyObject *self)
796{
797 PyObject *tzinfo = NULL;
798
Tim Petersa9bc1682003-01-11 03:39:11 +0000799 if (PyDateTime_Check(self) && HASTZINFO(self))
800 tzinfo = ((PyDateTime_DateTime *)self)->tzinfo;
Tim Petersa032d2e2003-01-11 00:15:54 +0000801 else if (PyTime_Check(self) && HASTZINFO(self))
Tim Peters37f39822003-01-10 03:49:02 +0000802 tzinfo = ((PyDateTime_Time *)self)->tzinfo;
Tim Peters2a799bf2002-12-16 20:18:38 +0000803
804 return tzinfo;
805}
806
Tim Petersbad8ff02002-12-30 20:52:32 +0000807/* Call getattr(tzinfo, name)(tzinfoarg), and extract an int from the
Tim Peters2a799bf2002-12-16 20:18:38 +0000808 * result. tzinfo must be an instance of the tzinfo class. If the method
809 * returns None, this returns 0 and sets *none to 1. If the method doesn't
Tim Peters397301e2003-01-02 21:28:08 +0000810 * return None or timedelta, TypeError is raised and this returns -1. If it
811 * returnsa timedelta and the value is out of range or isn't a whole number
812 * of minutes, ValueError is raised and this returns -1.
Tim Peters2a799bf2002-12-16 20:18:38 +0000813 * Else *none is set to 0 and the integer method result is returned.
814 */
815static int
816call_utc_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg,
817 int *none)
818{
819 PyObject *u;
Tim Peters397301e2003-01-02 21:28:08 +0000820 int result = -1;
Tim Peters2a799bf2002-12-16 20:18:38 +0000821
822 assert(tzinfo != NULL);
823 assert(PyTZInfo_Check(tzinfo));
824 assert(tzinfoarg != NULL);
825
826 *none = 0;
Tim Petersbad8ff02002-12-30 20:52:32 +0000827 u = call_tzinfo_method(tzinfo, name, tzinfoarg);
Tim Peters2a799bf2002-12-16 20:18:38 +0000828 if (u == NULL)
829 return -1;
830
Tim Peters27362852002-12-23 16:17:39 +0000831 else if (u == Py_None) {
Tim Peters2a799bf2002-12-16 20:18:38 +0000832 result = 0;
833 *none = 1;
Tim Peters2a799bf2002-12-16 20:18:38 +0000834 }
Tim Peters855fe882002-12-22 03:43:39 +0000835 else if (PyDelta_Check(u)) {
836 const int days = GET_TD_DAYS(u);
837 if (days < -1 || days > 0)
838 result = 24*60; /* trigger ValueError below */
839 else {
840 /* next line can't overflow because we know days
841 * is -1 or 0 now
842 */
843 int ss = days * 24 * 3600 + GET_TD_SECONDS(u);
844 result = divmod(ss, 60, &ss);
845 if (ss || GET_TD_MICROSECONDS(u)) {
846 PyErr_Format(PyExc_ValueError,
847 "tzinfo.%s() must return a "
848 "whole number of minutes",
849 name);
850 result = -1;
Tim Peters855fe882002-12-22 03:43:39 +0000851 }
852 }
853 }
Tim Peters2a799bf2002-12-16 20:18:38 +0000854 else {
855 PyErr_Format(PyExc_TypeError,
Tim Peters397301e2003-01-02 21:28:08 +0000856 "tzinfo.%s() must return None or "
Tim Peters855fe882002-12-22 03:43:39 +0000857 "timedelta, not '%s'",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000858 name, Py_Type(u)->tp_name);
Tim Peters2a799bf2002-12-16 20:18:38 +0000859 }
860
Tim Peters2a799bf2002-12-16 20:18:38 +0000861 Py_DECREF(u);
862 if (result < -1439 || result > 1439) {
863 PyErr_Format(PyExc_ValueError,
Neal Norwitz506a2242003-01-04 01:02:25 +0000864 "tzinfo.%s() returned %d; must be in "
Tim Peters2a799bf2002-12-16 20:18:38 +0000865 "-1439 .. 1439",
866 name, result);
867 result = -1;
868 }
Tim Peters397301e2003-01-02 21:28:08 +0000869 return result;
Tim Peters2a799bf2002-12-16 20:18:38 +0000870}
871
872/* Call tzinfo.utcoffset(tzinfoarg), and extract an integer from the
873 * result. tzinfo must be an instance of the tzinfo class. If utcoffset()
874 * returns None, call_utcoffset returns 0 and sets *none to 1. If uctoffset()
Tim Peters397301e2003-01-02 21:28:08 +0000875 * doesn't return None or timedelta, TypeError is raised and this returns -1.
876 * If utcoffset() returns an invalid timedelta (out of range, or not a whole
877 * # of minutes), ValueError is raised and this returns -1. Else *none is
878 * set to 0 and the offset is returned (as int # of minutes east of UTC).
Tim Peters2a799bf2002-12-16 20:18:38 +0000879 */
880static int
881call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg, int *none)
882{
883 return call_utc_tzinfo_method(tzinfo, "utcoffset", tzinfoarg, none);
884}
885
Tim Petersbad8ff02002-12-30 20:52:32 +0000886/* Call tzinfo.name(tzinfoarg), and return the offset as a timedelta or None.
887 */
Tim Peters855fe882002-12-22 03:43:39 +0000888static PyObject *
Tim Petersbad8ff02002-12-30 20:52:32 +0000889offset_as_timedelta(PyObject *tzinfo, char *name, PyObject *tzinfoarg) {
Tim Peters855fe882002-12-22 03:43:39 +0000890 PyObject *result;
891
Tim Petersbad8ff02002-12-30 20:52:32 +0000892 assert(tzinfo && name && tzinfoarg);
Tim Peters855fe882002-12-22 03:43:39 +0000893 if (tzinfo == Py_None) {
894 result = Py_None;
895 Py_INCREF(result);
896 }
897 else {
898 int none;
Tim Petersbad8ff02002-12-30 20:52:32 +0000899 int offset = call_utc_tzinfo_method(tzinfo, name, tzinfoarg,
900 &none);
Tim Peters855fe882002-12-22 03:43:39 +0000901 if (offset < 0 && PyErr_Occurred())
902 return NULL;
903 if (none) {
904 result = Py_None;
905 Py_INCREF(result);
906 }
907 else
908 result = new_delta(0, offset * 60, 0, 1);
909 }
910 return result;
911}
912
Tim Peters2a799bf2002-12-16 20:18:38 +0000913/* Call tzinfo.dst(tzinfoarg), and extract an integer from the
914 * result. tzinfo must be an instance of the tzinfo class. If dst()
915 * returns None, call_dst returns 0 and sets *none to 1. If dst()
Tim Peters397301e2003-01-02 21:28:08 +0000916 & doesn't return None or timedelta, TypeError is raised and this
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000917 * returns -1. If dst() returns an invalid timedelta for a UTC offset,
Tim Peters397301e2003-01-02 21:28:08 +0000918 * ValueError is raised and this returns -1. Else *none is set to 0 and
919 * the offset is returned (as an int # of minutes east of UTC).
Tim Peters2a799bf2002-12-16 20:18:38 +0000920 */
921static int
922call_dst(PyObject *tzinfo, PyObject *tzinfoarg, int *none)
923{
924 return call_utc_tzinfo_method(tzinfo, "dst", tzinfoarg, none);
925}
926
Tim Petersbad8ff02002-12-30 20:52:32 +0000927/* Call tzinfo.tzname(tzinfoarg), and return the result. tzinfo must be
Tim Peters855fe882002-12-22 03:43:39 +0000928 * an instance of the tzinfo class or None. If tzinfo isn't None, and
Tim Petersbad8ff02002-12-30 20:52:32 +0000929 * tzname() doesn't return None or a string, TypeError is raised and this
Guido van Rossume3d1d412007-05-23 21:24:35 +0000930 * returns NULL. If the result is a string, we ensure it is a Unicode
931 * string.
Tim Peters2a799bf2002-12-16 20:18:38 +0000932 */
933static PyObject *
Tim Petersbad8ff02002-12-30 20:52:32 +0000934call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
Tim Peters2a799bf2002-12-16 20:18:38 +0000935{
936 PyObject *result;
937
938 assert(tzinfo != NULL);
Tim Peters855fe882002-12-22 03:43:39 +0000939 assert(check_tzinfo_subclass(tzinfo) >= 0);
Tim Petersbad8ff02002-12-30 20:52:32 +0000940 assert(tzinfoarg != NULL);
Tim Peters2a799bf2002-12-16 20:18:38 +0000941
Tim Peters855fe882002-12-22 03:43:39 +0000942 if (tzinfo == Py_None) {
943 result = Py_None;
944 Py_INCREF(result);
945 }
946 else
Tim Petersbad8ff02002-12-30 20:52:32 +0000947 result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg);
Tim Peters855fe882002-12-22 03:43:39 +0000948
Guido van Rossume3d1d412007-05-23 21:24:35 +0000949 if (result != NULL && result != Py_None) {
950 if (!PyString_Check(result) && !PyUnicode_Check(result)) {
951 PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "
952 "return None or a string, not '%s'",
Martin v. Löwis5d7428b2007-07-21 18:47:48 +0000953 Py_Type(result)->tp_name);
Guido van Rossume3d1d412007-05-23 21:24:35 +0000954 Py_DECREF(result);
955 result = NULL;
956 }
957 else if (!PyUnicode_Check(result)) {
958 PyObject *temp = PyUnicode_FromObject(result);
959 Py_DECREF(result);
960 result = temp;
961 }
Tim Peters2a799bf2002-12-16 20:18:38 +0000962 }
963 return result;
964}
965
966typedef enum {
967 /* an exception has been set; the caller should pass it on */
968 OFFSET_ERROR,
969
Tim Petersa9bc1682003-01-11 03:39:11 +0000970 /* type isn't date, datetime, or time subclass */
Tim Peters2a799bf2002-12-16 20:18:38 +0000971 OFFSET_UNKNOWN,
972
973 /* date,
Tim Petersa9bc1682003-01-11 03:39:11 +0000974 * datetime with !hastzinfo
975 * datetime with None tzinfo,
976 * datetime where utcoffset() returns None
Tim Peters37f39822003-01-10 03:49:02 +0000977 * time with !hastzinfo
978 * time with None tzinfo,
979 * time where utcoffset() returns None
Tim Peters2a799bf2002-12-16 20:18:38 +0000980 */
981 OFFSET_NAIVE,
982
Tim Petersa9bc1682003-01-11 03:39:11 +0000983 /* time or datetime where utcoffset() doesn't return None */
Georg Brandle810fe22006-02-19 15:28:47 +0000984 OFFSET_AWARE
Tim Peters2a799bf2002-12-16 20:18:38 +0000985} naivety;
986
Tim Peters14b69412002-12-22 18:10:22 +0000987/* Classify an object as to whether it's naive or offset-aware. See
Tim Peters2a799bf2002-12-16 20:18:38 +0000988 * the "naivety" typedef for details. If the type is aware, *offset is set
989 * to minutes east of UTC (as returned by the tzinfo.utcoffset() method).
Tim Peters14b69412002-12-22 18:10:22 +0000990 * If the type is offset-naive (or unknown, or error), *offset is set to 0.
Tim Peterse39a80c2002-12-30 21:28:52 +0000991 * tzinfoarg is the argument to pass to the tzinfo.utcoffset() method.
Tim Peters2a799bf2002-12-16 20:18:38 +0000992 */
993static naivety
Tim Peterse39a80c2002-12-30 21:28:52 +0000994classify_utcoffset(PyObject *op, PyObject *tzinfoarg, int *offset)
Tim Peters2a799bf2002-12-16 20:18:38 +0000995{
996 int none;
997 PyObject *tzinfo;
998
Tim Peterse39a80c2002-12-30 21:28:52 +0000999 assert(tzinfoarg != NULL);
Tim Peters2a799bf2002-12-16 20:18:38 +00001000 *offset = 0;
Tim Peters14b69412002-12-22 18:10:22 +00001001 tzinfo = get_tzinfo_member(op); /* NULL means no tzinfo, not error */
Tim Peters2a799bf2002-12-16 20:18:38 +00001002 if (tzinfo == Py_None)
1003 return OFFSET_NAIVE;
Tim Peters14b69412002-12-22 18:10:22 +00001004 if (tzinfo == NULL) {
1005 /* note that a datetime passes the PyDate_Check test */
1006 return (PyTime_Check(op) || PyDate_Check(op)) ?
1007 OFFSET_NAIVE : OFFSET_UNKNOWN;
1008 }
Tim Peterse39a80c2002-12-30 21:28:52 +00001009 *offset = call_utcoffset(tzinfo, tzinfoarg, &none);
Tim Peters2a799bf2002-12-16 20:18:38 +00001010 if (*offset == -1 && PyErr_Occurred())
1011 return OFFSET_ERROR;
1012 return none ? OFFSET_NAIVE : OFFSET_AWARE;
1013}
1014
Tim Peters00237032002-12-27 02:21:51 +00001015/* Classify two objects as to whether they're naive or offset-aware.
1016 * This isn't quite the same as calling classify_utcoffset() twice: for
1017 * binary operations (comparison and subtraction), we generally want to
1018 * ignore the tzinfo members if they're identical. This is by design,
1019 * so that results match "naive" expectations when mixing objects from a
1020 * single timezone. So in that case, this sets both offsets to 0 and
1021 * both naiveties to OFFSET_NAIVE.
1022 * The function returns 0 if everything's OK, and -1 on error.
1023 */
1024static int
1025classify_two_utcoffsets(PyObject *o1, int *offset1, naivety *n1,
Tim Peterse39a80c2002-12-30 21:28:52 +00001026 PyObject *tzinfoarg1,
1027 PyObject *o2, int *offset2, naivety *n2,
1028 PyObject *tzinfoarg2)
Tim Peters00237032002-12-27 02:21:51 +00001029{
1030 if (get_tzinfo_member(o1) == get_tzinfo_member(o2)) {
1031 *offset1 = *offset2 = 0;
1032 *n1 = *n2 = OFFSET_NAIVE;
1033 }
1034 else {
Tim Peterse39a80c2002-12-30 21:28:52 +00001035 *n1 = classify_utcoffset(o1, tzinfoarg1, offset1);
Tim Peters00237032002-12-27 02:21:51 +00001036 if (*n1 == OFFSET_ERROR)
1037 return -1;
Tim Peterse39a80c2002-12-30 21:28:52 +00001038 *n2 = classify_utcoffset(o2, tzinfoarg2, offset2);
Tim Peters00237032002-12-27 02:21:51 +00001039 if (*n2 == OFFSET_ERROR)
1040 return -1;
1041 }
1042 return 0;
1043}
1044
Tim Peters2a799bf2002-12-16 20:18:38 +00001045/* repr is like "someclass(arg1, arg2)". If tzinfo isn't None,
1046 * stuff
1047 * ", tzinfo=" + repr(tzinfo)
1048 * before the closing ")".
1049 */
1050static PyObject *
1051append_keyword_tzinfo(PyObject *repr, PyObject *tzinfo)
1052{
1053 PyObject *temp;
1054
Walter Dörwald1ab83302007-05-18 17:15:44 +00001055 assert(PyUnicode_Check(repr));
Tim Peters2a799bf2002-12-16 20:18:38 +00001056 assert(tzinfo);
1057 if (tzinfo == Py_None)
1058 return repr;
1059 /* Get rid of the trailing ')'. */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001060 assert(PyUnicode_AS_UNICODE(repr)[PyUnicode_GET_SIZE(repr)-1] == ')');
1061 temp = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(repr),
1062 PyUnicode_GET_SIZE(repr) - 1);
Tim Peters2a799bf2002-12-16 20:18:38 +00001063 Py_DECREF(repr);
1064 if (temp == NULL)
1065 return NULL;
Walter Dörwald517bcfe2007-05-23 20:45:05 +00001066 repr = PyUnicode_FromFormat("%U, tzinfo=%R)", temp, tzinfo);
1067 Py_DECREF(temp);
Tim Peters2a799bf2002-12-16 20:18:38 +00001068 return repr;
1069}
1070
1071/* ---------------------------------------------------------------------------
1072 * String format helpers.
1073 */
1074
1075static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00001076format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds)
Tim Peters2a799bf2002-12-16 20:18:38 +00001077{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001078 static const char *DayNames[] = {
Tim Peters2a799bf2002-12-16 20:18:38 +00001079 "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
1080 };
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001081 static const char *MonthNames[] = {
Tim Peters2a799bf2002-12-16 20:18:38 +00001082 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
1083 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
1084 };
1085
Tim Peters2a799bf2002-12-16 20:18:38 +00001086 int wday = weekday(GET_YEAR(date), GET_MONTH(date), GET_DAY(date));
1087
Walter Dörwald4af32b32007-05-31 16:19:50 +00001088 return PyUnicode_FromFormat("%s %s %2d %02d:%02d:%02d %04d",
1089 DayNames[wday], MonthNames[GET_MONTH(date)-1],
1090 GET_DAY(date), hours, minutes, seconds,
1091 GET_YEAR(date));
Tim Peters2a799bf2002-12-16 20:18:38 +00001092}
1093
1094/* Add an hours & minutes UTC offset string to buf. buf has no more than
1095 * buflen bytes remaining. The UTC offset is gotten by calling
1096 * tzinfo.uctoffset(tzinfoarg). If that returns None, \0 is stored into
1097 * *buf, and that's all. Else the returned value is checked for sanity (an
1098 * integer in range), and if that's OK it's converted to an hours & minutes
1099 * string of the form
1100 * sign HH sep MM
1101 * Returns 0 if everything is OK. If the return value from utcoffset() is
1102 * bogus, an appropriate exception is set and -1 is returned.
1103 */
1104static int
Tim Peters328fff72002-12-20 01:31:27 +00001105format_utcoffset(char *buf, size_t buflen, const char *sep,
Tim Peters2a799bf2002-12-16 20:18:38 +00001106 PyObject *tzinfo, PyObject *tzinfoarg)
1107{
1108 int offset;
1109 int hours;
1110 int minutes;
1111 char sign;
1112 int none;
1113
1114 offset = call_utcoffset(tzinfo, tzinfoarg, &none);
1115 if (offset == -1 && PyErr_Occurred())
1116 return -1;
1117 if (none) {
1118 *buf = '\0';
1119 return 0;
1120 }
1121 sign = '+';
1122 if (offset < 0) {
1123 sign = '-';
1124 offset = - offset;
1125 }
1126 hours = divmod(offset, 60, &minutes);
1127 PyOS_snprintf(buf, buflen, "%c%02d%s%02d", sign, hours, sep, minutes);
1128 return 0;
1129}
1130
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001131static PyObject *
1132make_Zreplacement(PyObject *object, PyObject *tzinfoarg)
1133{
Neal Norwitzaea70e02007-08-12 04:32:26 +00001134 PyObject *temp;
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001135 PyObject *tzinfo = get_tzinfo_member(object);
1136 PyObject *Zreplacement = PyString_FromString("");
1137 if (Zreplacement == NULL)
1138 return NULL;
Neal Norwitzaea70e02007-08-12 04:32:26 +00001139 if (tzinfo == Py_None || tzinfo == NULL)
1140 return Zreplacement;
1141
1142 assert(tzinfoarg != NULL);
1143 temp = call_tzname(tzinfo, tzinfoarg);
1144 if (temp == NULL)
1145 goto Error;
1146 if (temp == Py_None) {
1147 Py_DECREF(temp);
1148 return Zreplacement;
1149 }
1150
1151 assert(PyUnicode_Check(temp));
1152 /* Since the tzname is getting stuffed into the
1153 * format, we have to double any % signs so that
1154 * strftime doesn't treat them as format codes.
1155 */
1156 Py_DECREF(Zreplacement);
1157 Zreplacement = PyObject_CallMethod(temp, "replace", "ss", "%", "%%");
1158 Py_DECREF(temp);
1159 if (Zreplacement == NULL)
1160 return NULL;
1161 if (PyUnicode_Check(Zreplacement)) {
1162 /* XXX(nnorwitz): this is really convoluted, is it correct? */
1163 PyObject *Zreplacement2 =
1164 _PyUnicode_AsDefaultEncodedString(Zreplacement, NULL);
1165 if (Zreplacement2 == NULL)
1166 return NULL;
1167 Py_INCREF(Zreplacement2);
1168 /* Zreplacement is owned, but Zreplacement2 is borrowed.
1169 If they are different, we have to release Zreplacement. */
1170 if (Zreplacement != Zreplacement2) {
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001171 Py_DECREF(Zreplacement);
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001172 }
Neal Norwitzaea70e02007-08-12 04:32:26 +00001173 Zreplacement = Zreplacement2;
1174 }
1175 if (!PyString_Check(Zreplacement)) {
1176 PyErr_SetString(PyExc_TypeError,
1177 "tzname.replace() did not return a string");
1178 goto Error;
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001179 }
1180 return Zreplacement;
1181
1182 Error:
1183 Py_DECREF(Zreplacement);
1184 return NULL;
1185}
1186
Tim Peters2a799bf2002-12-16 20:18:38 +00001187/* I sure don't want to reproduce the strftime code from the time module,
1188 * so this imports the module and calls it. All the hair is due to
1189 * giving special meanings to the %z and %Z format codes via a preprocessing
1190 * step on the format string.
Tim Petersbad8ff02002-12-30 20:52:32 +00001191 * tzinfoarg is the argument to pass to the object's tzinfo method, if
1192 * needed.
Tim Peters2a799bf2002-12-16 20:18:38 +00001193 */
1194static PyObject *
Tim Petersbad8ff02002-12-30 20:52:32 +00001195wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
1196 PyObject *tzinfoarg)
Tim Peters2a799bf2002-12-16 20:18:38 +00001197{
1198 PyObject *result = NULL; /* guilty until proved innocent */
1199
1200 PyObject *zreplacement = NULL; /* py string, replacement for %z */
1201 PyObject *Zreplacement = NULL; /* py string, replacement for %Z */
1202
Guido van Rossumbce56a62007-05-10 18:04:33 +00001203 const char *pin;/* pointer to next char in input format */
1204 Py_ssize_t flen;/* length of input format */
Tim Peters2a799bf2002-12-16 20:18:38 +00001205 char ch; /* next char in input format */
1206
1207 PyObject *newfmt = NULL; /* py string, the output format */
1208 char *pnew; /* pointer to available byte in output format */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001209 int totalnew; /* number bytes total in output format buffer,
Tim Peters2a799bf2002-12-16 20:18:38 +00001210 exclusive of trailing \0 */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001211 int usednew; /* number bytes used so far in output format buffer */
Tim Peters2a799bf2002-12-16 20:18:38 +00001212
Guido van Rossumbce56a62007-05-10 18:04:33 +00001213 const char *ptoappend;/* pointer to string to append to output buffer */
Tim Peters2a799bf2002-12-16 20:18:38 +00001214 int ntoappend; /* # of bytes to append to output buffer */
1215
Tim Peters2a799bf2002-12-16 20:18:38 +00001216 assert(object && format && timetuple);
Guido van Rossumbce56a62007-05-10 18:04:33 +00001217 assert(PyString_Check(format) || PyUnicode_Check(format));
1218
1219 /* Convert the input format to a C string and size */
1220 if (PyObject_AsCharBuffer(format, &pin, &flen) < 0)
1221 return NULL;
Tim Peters2a799bf2002-12-16 20:18:38 +00001222
Tim Petersd6844152002-12-22 20:58:42 +00001223 /* Give up if the year is before 1900.
1224 * Python strftime() plays games with the year, and different
1225 * games depending on whether envar PYTHON2K is set. This makes
1226 * years before 1900 a nightmare, even if the platform strftime
1227 * supports them (and not all do).
1228 * We could get a lot farther here by avoiding Python's strftime
1229 * wrapper and calling the C strftime() directly, but that isn't
1230 * an option in the Python implementation of this module.
1231 */
1232 {
1233 long year;
1234 PyObject *pyyear = PySequence_GetItem(timetuple, 0);
1235 if (pyyear == NULL) return NULL;
1236 assert(PyInt_Check(pyyear));
1237 year = PyInt_AsLong(pyyear);
1238 Py_DECREF(pyyear);
1239 if (year < 1900) {
1240 PyErr_Format(PyExc_ValueError, "year=%ld is before "
1241 "1900; the datetime strftime() "
1242 "methods require year >= 1900",
1243 year);
1244 return NULL;
1245 }
1246 }
1247
Tim Peters2a799bf2002-12-16 20:18:38 +00001248 /* Scan the input format, looking for %z and %Z escapes, building
Tim Peters328fff72002-12-20 01:31:27 +00001249 * a new format. Since computing the replacements for those codes
1250 * is expensive, don't unless they're actually used.
Tim Peters2a799bf2002-12-16 20:18:38 +00001251 */
Guido van Rossumbce56a62007-05-10 18:04:33 +00001252 totalnew = flen + 1; /* realistic if no %z/%Z */
Tim Peters2a799bf2002-12-16 20:18:38 +00001253 newfmt = PyString_FromStringAndSize(NULL, totalnew);
1254 if (newfmt == NULL) goto Done;
1255 pnew = PyString_AsString(newfmt);
1256 usednew = 0;
1257
Tim Peters2a799bf2002-12-16 20:18:38 +00001258 while ((ch = *pin++) != '\0') {
1259 if (ch != '%') {
Tim Peters328fff72002-12-20 01:31:27 +00001260 ptoappend = pin - 1;
Tim Peters2a799bf2002-12-16 20:18:38 +00001261 ntoappend = 1;
1262 }
1263 else if ((ch = *pin++) == '\0') {
1264 /* There's a lone trailing %; doesn't make sense. */
1265 PyErr_SetString(PyExc_ValueError, "strftime format "
1266 "ends with raw %");
1267 goto Done;
1268 }
1269 /* A % has been seen and ch is the character after it. */
1270 else if (ch == 'z') {
1271 if (zreplacement == NULL) {
1272 /* format utcoffset */
Tim Peters328fff72002-12-20 01:31:27 +00001273 char buf[100];
Tim Peters2a799bf2002-12-16 20:18:38 +00001274 PyObject *tzinfo = get_tzinfo_member(object);
1275 zreplacement = PyString_FromString("");
1276 if (zreplacement == NULL) goto Done;
1277 if (tzinfo != Py_None && tzinfo != NULL) {
Tim Petersbad8ff02002-12-30 20:52:32 +00001278 assert(tzinfoarg != NULL);
Tim Peters2a799bf2002-12-16 20:18:38 +00001279 if (format_utcoffset(buf,
Tim Peters328fff72002-12-20 01:31:27 +00001280 sizeof(buf),
Tim Peters2a799bf2002-12-16 20:18:38 +00001281 "",
1282 tzinfo,
Tim Petersbad8ff02002-12-30 20:52:32 +00001283 tzinfoarg) < 0)
Tim Peters2a799bf2002-12-16 20:18:38 +00001284 goto Done;
1285 Py_DECREF(zreplacement);
1286 zreplacement = PyString_FromString(buf);
1287 if (zreplacement == NULL) goto Done;
1288 }
1289 }
1290 assert(zreplacement != NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001291 ptoappend = PyString_AS_STRING(zreplacement);
1292 ntoappend = PyString_GET_SIZE(zreplacement);
Tim Peters2a799bf2002-12-16 20:18:38 +00001293 }
1294 else if (ch == 'Z') {
1295 /* format tzname */
1296 if (Zreplacement == NULL) {
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001297 Zreplacement = make_Zreplacement(object,
1298 tzinfoarg);
1299 if (Zreplacement == NULL)
1300 goto Done;
Tim Peters2a799bf2002-12-16 20:18:38 +00001301 }
1302 assert(Zreplacement != NULL);
Guido van Rossumd8595fe2007-05-23 21:36:49 +00001303 assert(PyString_Check(Zreplacement));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001304 ptoappend = PyString_AS_STRING(Zreplacement);
1305 ntoappend = PyString_GET_SIZE(Zreplacement);
Tim Peters2a799bf2002-12-16 20:18:38 +00001306 }
1307 else {
Tim Peters328fff72002-12-20 01:31:27 +00001308 /* percent followed by neither z nor Z */
1309 ptoappend = pin - 2;
Tim Peters2a799bf2002-12-16 20:18:38 +00001310 ntoappend = 2;
1311 }
1312
1313 /* Append the ntoappend chars starting at ptoappend to
1314 * the new format.
1315 */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001316 assert(ptoappend != NULL);
Tim Peters2a799bf2002-12-16 20:18:38 +00001317 assert(ntoappend >= 0);
1318 if (ntoappend == 0)
1319 continue;
1320 while (usednew + ntoappend > totalnew) {
1321 int bigger = totalnew << 1;
1322 if ((bigger >> 1) != totalnew) { /* overflow */
1323 PyErr_NoMemory();
1324 goto Done;
1325 }
1326 if (_PyString_Resize(&newfmt, bigger) < 0)
1327 goto Done;
1328 totalnew = bigger;
1329 pnew = PyString_AsString(newfmt) + usednew;
1330 }
1331 memcpy(pnew, ptoappend, ntoappend);
1332 pnew += ntoappend;
1333 usednew += ntoappend;
1334 assert(usednew <= totalnew);
1335 } /* end while() */
1336
1337 if (_PyString_Resize(&newfmt, usednew) < 0)
1338 goto Done;
1339 {
1340 PyObject *time = PyImport_ImportModule("time");
1341 if (time == NULL)
1342 goto Done;
1343 result = PyObject_CallMethod(time, "strftime", "OO",
1344 newfmt, timetuple);
1345 Py_DECREF(time);
1346 }
1347 Done:
1348 Py_XDECREF(zreplacement);
1349 Py_XDECREF(Zreplacement);
1350 Py_XDECREF(newfmt);
1351 return result;
1352}
1353
Tim Peters2a799bf2002-12-16 20:18:38 +00001354/* ---------------------------------------------------------------------------
1355 * Wrap functions from the time module. These aren't directly available
1356 * from C. Perhaps they should be.
1357 */
1358
1359/* Call time.time() and return its result (a Python float). */
1360static PyObject *
Guido van Rossumbd43e912002-12-16 20:34:55 +00001361time_time(void)
Tim Peters2a799bf2002-12-16 20:18:38 +00001362{
1363 PyObject *result = NULL;
1364 PyObject *time = PyImport_ImportModule("time");
1365
1366 if (time != NULL) {
1367 result = PyObject_CallMethod(time, "time", "()");
1368 Py_DECREF(time);
1369 }
1370 return result;
1371}
1372
1373/* Build a time.struct_time. The weekday and day number are automatically
1374 * computed from the y,m,d args.
1375 */
1376static PyObject *
1377build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag)
1378{
1379 PyObject *time;
1380 PyObject *result = NULL;
1381
1382 time = PyImport_ImportModule("time");
1383 if (time != NULL) {
1384 result = PyObject_CallMethod(time, "struct_time",
1385 "((iiiiiiiii))",
1386 y, m, d,
1387 hh, mm, ss,
1388 weekday(y, m, d),
1389 days_before_month(y, m) + d,
1390 dstflag);
1391 Py_DECREF(time);
1392 }
1393 return result;
1394}
1395
1396/* ---------------------------------------------------------------------------
1397 * Miscellaneous helpers.
1398 */
1399
Guido van Rossum19960592006-08-24 17:29:38 +00001400/* For various reasons, we need to use tp_richcompare instead of tp_compare.
Tim Peters2a799bf2002-12-16 20:18:38 +00001401 * The comparisons here all most naturally compute a cmp()-like result.
1402 * This little helper turns that into a bool result for rich comparisons.
1403 */
1404static PyObject *
1405diff_to_bool(int diff, int op)
1406{
1407 PyObject *result;
1408 int istrue;
1409
1410 switch (op) {
1411 case Py_EQ: istrue = diff == 0; break;
1412 case Py_NE: istrue = diff != 0; break;
1413 case Py_LE: istrue = diff <= 0; break;
1414 case Py_GE: istrue = diff >= 0; break;
1415 case Py_LT: istrue = diff < 0; break;
1416 case Py_GT: istrue = diff > 0; break;
1417 default:
1418 assert(! "op unknown");
1419 istrue = 0; /* To shut up compiler */
1420 }
1421 result = istrue ? Py_True : Py_False;
1422 Py_INCREF(result);
1423 return result;
1424}
1425
Tim Peters07534a62003-02-07 22:50:28 +00001426/* Raises a "can't compare" TypeError and returns NULL. */
1427static PyObject *
1428cmperror(PyObject *a, PyObject *b)
1429{
1430 PyErr_Format(PyExc_TypeError,
1431 "can't compare %s to %s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001432 Py_Type(a)->tp_name, Py_Type(b)->tp_name);
Tim Peters07534a62003-02-07 22:50:28 +00001433 return NULL;
1434}
1435
Tim Peters2a799bf2002-12-16 20:18:38 +00001436/* ---------------------------------------------------------------------------
Tim Peters2a799bf2002-12-16 20:18:38 +00001437 * Cached Python objects; these are set by the module init function.
1438 */
1439
1440/* Conversion factors. */
1441static PyObject *us_per_us = NULL; /* 1 */
1442static PyObject *us_per_ms = NULL; /* 1000 */
1443static PyObject *us_per_second = NULL; /* 1000000 */
1444static PyObject *us_per_minute = NULL; /* 1e6 * 60 as Python int */
1445static PyObject *us_per_hour = NULL; /* 1e6 * 3600 as Python long */
1446static PyObject *us_per_day = NULL; /* 1e6 * 3600 * 24 as Python long */
1447static PyObject *us_per_week = NULL; /* 1e6*3600*24*7 as Python long */
1448static PyObject *seconds_per_day = NULL; /* 3600*24 as Python int */
1449
Tim Peters2a799bf2002-12-16 20:18:38 +00001450/* ---------------------------------------------------------------------------
1451 * Class implementations.
1452 */
1453
1454/*
1455 * PyDateTime_Delta implementation.
1456 */
1457
1458/* Convert a timedelta to a number of us,
1459 * (24*3600*self.days + self.seconds)*1000000 + self.microseconds
1460 * as a Python int or long.
1461 * Doing mixed-radix arithmetic by hand instead is excruciating in C,
1462 * due to ubiquitous overflow possibilities.
1463 */
1464static PyObject *
1465delta_to_microseconds(PyDateTime_Delta *self)
1466{
1467 PyObject *x1 = NULL;
1468 PyObject *x2 = NULL;
1469 PyObject *x3 = NULL;
1470 PyObject *result = NULL;
1471
1472 x1 = PyInt_FromLong(GET_TD_DAYS(self));
1473 if (x1 == NULL)
1474 goto Done;
1475 x2 = PyNumber_Multiply(x1, seconds_per_day); /* days in seconds */
1476 if (x2 == NULL)
1477 goto Done;
1478 Py_DECREF(x1);
1479 x1 = NULL;
1480
1481 /* x2 has days in seconds */
1482 x1 = PyInt_FromLong(GET_TD_SECONDS(self)); /* seconds */
1483 if (x1 == NULL)
1484 goto Done;
1485 x3 = PyNumber_Add(x1, x2); /* days and seconds in seconds */
1486 if (x3 == NULL)
1487 goto Done;
1488 Py_DECREF(x1);
1489 Py_DECREF(x2);
1490 x1 = x2 = NULL;
1491
1492 /* x3 has days+seconds in seconds */
1493 x1 = PyNumber_Multiply(x3, us_per_second); /* us */
1494 if (x1 == NULL)
1495 goto Done;
1496 Py_DECREF(x3);
1497 x3 = NULL;
1498
1499 /* x1 has days+seconds in us */
1500 x2 = PyInt_FromLong(GET_TD_MICROSECONDS(self));
1501 if (x2 == NULL)
1502 goto Done;
1503 result = PyNumber_Add(x1, x2);
1504
1505Done:
1506 Py_XDECREF(x1);
1507 Py_XDECREF(x2);
1508 Py_XDECREF(x3);
1509 return result;
1510}
1511
1512/* Convert a number of us (as a Python int or long) to a timedelta.
1513 */
1514static PyObject *
Tim Petersb0c854d2003-05-17 15:57:00 +00001515microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)
Tim Peters2a799bf2002-12-16 20:18:38 +00001516{
1517 int us;
1518 int s;
1519 int d;
Tim Peters0b0f41c2002-12-19 01:44:38 +00001520 long temp;
Tim Peters2a799bf2002-12-16 20:18:38 +00001521
1522 PyObject *tuple = NULL;
1523 PyObject *num = NULL;
1524 PyObject *result = NULL;
1525
1526 tuple = PyNumber_Divmod(pyus, us_per_second);
1527 if (tuple == NULL)
1528 goto Done;
1529
1530 num = PyTuple_GetItem(tuple, 1); /* us */
1531 if (num == NULL)
1532 goto Done;
Tim Peters0b0f41c2002-12-19 01:44:38 +00001533 temp = PyLong_AsLong(num);
Tim Peters2a799bf2002-12-16 20:18:38 +00001534 num = NULL;
Tim Peters0b0f41c2002-12-19 01:44:38 +00001535 if (temp == -1 && PyErr_Occurred())
1536 goto Done;
1537 assert(0 <= temp && temp < 1000000);
1538 us = (int)temp;
Tim Peters2a799bf2002-12-16 20:18:38 +00001539 if (us < 0) {
1540 /* The divisor was positive, so this must be an error. */
1541 assert(PyErr_Occurred());
1542 goto Done;
1543 }
1544
1545 num = PyTuple_GetItem(tuple, 0); /* leftover seconds */
1546 if (num == NULL)
1547 goto Done;
1548 Py_INCREF(num);
1549 Py_DECREF(tuple);
1550
1551 tuple = PyNumber_Divmod(num, seconds_per_day);
1552 if (tuple == NULL)
1553 goto Done;
1554 Py_DECREF(num);
1555
1556 num = PyTuple_GetItem(tuple, 1); /* seconds */
1557 if (num == NULL)
1558 goto Done;
Tim Peters0b0f41c2002-12-19 01:44:38 +00001559 temp = PyLong_AsLong(num);
Tim Peters2a799bf2002-12-16 20:18:38 +00001560 num = NULL;
Tim Peters0b0f41c2002-12-19 01:44:38 +00001561 if (temp == -1 && PyErr_Occurred())
1562 goto Done;
1563 assert(0 <= temp && temp < 24*3600);
1564 s = (int)temp;
1565
Tim Peters2a799bf2002-12-16 20:18:38 +00001566 if (s < 0) {
1567 /* The divisor was positive, so this must be an error. */
1568 assert(PyErr_Occurred());
1569 goto Done;
1570 }
1571
1572 num = PyTuple_GetItem(tuple, 0); /* leftover days */
1573 if (num == NULL)
1574 goto Done;
1575 Py_INCREF(num);
Tim Peters0b0f41c2002-12-19 01:44:38 +00001576 temp = PyLong_AsLong(num);
1577 if (temp == -1 && PyErr_Occurred())
Tim Peters2a799bf2002-12-16 20:18:38 +00001578 goto Done;
Tim Peters0b0f41c2002-12-19 01:44:38 +00001579 d = (int)temp;
1580 if ((long)d != temp) {
1581 PyErr_SetString(PyExc_OverflowError, "normalized days too "
1582 "large to fit in a C int");
1583 goto Done;
1584 }
Tim Petersb0c854d2003-05-17 15:57:00 +00001585 result = new_delta_ex(d, s, us, 0, type);
Tim Peters2a799bf2002-12-16 20:18:38 +00001586
1587Done:
1588 Py_XDECREF(tuple);
1589 Py_XDECREF(num);
1590 return result;
1591}
1592
Tim Petersb0c854d2003-05-17 15:57:00 +00001593#define microseconds_to_delta(pymicros) \
1594 microseconds_to_delta_ex(pymicros, &PyDateTime_DeltaType)
1595
Tim Peters2a799bf2002-12-16 20:18:38 +00001596static PyObject *
1597multiply_int_timedelta(PyObject *intobj, PyDateTime_Delta *delta)
1598{
1599 PyObject *pyus_in;
1600 PyObject *pyus_out;
1601 PyObject *result;
1602
1603 pyus_in = delta_to_microseconds(delta);
1604 if (pyus_in == NULL)
1605 return NULL;
1606
1607 pyus_out = PyNumber_Multiply(pyus_in, intobj);
1608 Py_DECREF(pyus_in);
1609 if (pyus_out == NULL)
1610 return NULL;
1611
1612 result = microseconds_to_delta(pyus_out);
1613 Py_DECREF(pyus_out);
1614 return result;
1615}
1616
1617static PyObject *
1618divide_timedelta_int(PyDateTime_Delta *delta, PyObject *intobj)
1619{
1620 PyObject *pyus_in;
1621 PyObject *pyus_out;
1622 PyObject *result;
1623
1624 pyus_in = delta_to_microseconds(delta);
1625 if (pyus_in == NULL)
1626 return NULL;
1627
1628 pyus_out = PyNumber_FloorDivide(pyus_in, intobj);
1629 Py_DECREF(pyus_in);
1630 if (pyus_out == NULL)
1631 return NULL;
1632
1633 result = microseconds_to_delta(pyus_out);
1634 Py_DECREF(pyus_out);
1635 return result;
1636}
1637
1638static PyObject *
1639delta_add(PyObject *left, PyObject *right)
1640{
1641 PyObject *result = Py_NotImplemented;
1642
1643 if (PyDelta_Check(left) && PyDelta_Check(right)) {
1644 /* delta + delta */
1645 /* The C-level additions can't overflow because of the
1646 * invariant bounds.
1647 */
1648 int days = GET_TD_DAYS(left) + GET_TD_DAYS(right);
1649 int seconds = GET_TD_SECONDS(left) + GET_TD_SECONDS(right);
1650 int microseconds = GET_TD_MICROSECONDS(left) +
1651 GET_TD_MICROSECONDS(right);
1652 result = new_delta(days, seconds, microseconds, 1);
1653 }
1654
1655 if (result == Py_NotImplemented)
1656 Py_INCREF(result);
1657 return result;
1658}
1659
1660static PyObject *
1661delta_negative(PyDateTime_Delta *self)
1662{
1663 return new_delta(-GET_TD_DAYS(self),
1664 -GET_TD_SECONDS(self),
1665 -GET_TD_MICROSECONDS(self),
1666 1);
1667}
1668
1669static PyObject *
1670delta_positive(PyDateTime_Delta *self)
1671{
1672 /* Could optimize this (by returning self) if this isn't a
1673 * subclass -- but who uses unary + ? Approximately nobody.
1674 */
1675 return new_delta(GET_TD_DAYS(self),
1676 GET_TD_SECONDS(self),
1677 GET_TD_MICROSECONDS(self),
1678 0);
1679}
1680
1681static PyObject *
1682delta_abs(PyDateTime_Delta *self)
1683{
1684 PyObject *result;
1685
1686 assert(GET_TD_MICROSECONDS(self) >= 0);
1687 assert(GET_TD_SECONDS(self) >= 0);
1688
1689 if (GET_TD_DAYS(self) < 0)
1690 result = delta_negative(self);
1691 else
1692 result = delta_positive(self);
1693
1694 return result;
1695}
1696
1697static PyObject *
1698delta_subtract(PyObject *left, PyObject *right)
1699{
1700 PyObject *result = Py_NotImplemented;
1701
1702 if (PyDelta_Check(left) && PyDelta_Check(right)) {
1703 /* delta - delta */
1704 PyObject *minus_right = PyNumber_Negative(right);
1705 if (minus_right) {
1706 result = delta_add(left, minus_right);
1707 Py_DECREF(minus_right);
1708 }
1709 else
1710 result = NULL;
1711 }
1712
1713 if (result == Py_NotImplemented)
1714 Py_INCREF(result);
1715 return result;
1716}
1717
Tim Peters2a799bf2002-12-16 20:18:38 +00001718static PyObject *
Guido van Rossum19960592006-08-24 17:29:38 +00001719delta_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters2a799bf2002-12-16 20:18:38 +00001720{
Tim Petersaa7d8492003-02-08 03:28:59 +00001721 if (PyDelta_Check(other)) {
Guido van Rossum19960592006-08-24 17:29:38 +00001722 int diff = GET_TD_DAYS(self) - GET_TD_DAYS(other);
Tim Peters07534a62003-02-07 22:50:28 +00001723 if (diff == 0) {
1724 diff = GET_TD_SECONDS(self) - GET_TD_SECONDS(other);
1725 if (diff == 0)
1726 diff = GET_TD_MICROSECONDS(self) -
1727 GET_TD_MICROSECONDS(other);
1728 }
Guido van Rossum19960592006-08-24 17:29:38 +00001729 return diff_to_bool(diff, op);
Tim Peters2a799bf2002-12-16 20:18:38 +00001730 }
Guido van Rossum19960592006-08-24 17:29:38 +00001731 else {
1732 Py_INCREF(Py_NotImplemented);
1733 return Py_NotImplemented;
1734 }
Tim Peters2a799bf2002-12-16 20:18:38 +00001735}
1736
1737static PyObject *delta_getstate(PyDateTime_Delta *self);
1738
1739static long
1740delta_hash(PyDateTime_Delta *self)
1741{
1742 if (self->hashcode == -1) {
1743 PyObject *temp = delta_getstate(self);
1744 if (temp != NULL) {
1745 self->hashcode = PyObject_Hash(temp);
1746 Py_DECREF(temp);
1747 }
1748 }
1749 return self->hashcode;
1750}
1751
1752static PyObject *
1753delta_multiply(PyObject *left, PyObject *right)
1754{
1755 PyObject *result = Py_NotImplemented;
1756
1757 if (PyDelta_Check(left)) {
1758 /* delta * ??? */
1759 if (PyInt_Check(right) || PyLong_Check(right))
1760 result = multiply_int_timedelta(right,
1761 (PyDateTime_Delta *) left);
1762 }
1763 else if (PyInt_Check(left) || PyLong_Check(left))
1764 result = multiply_int_timedelta(left,
1765 (PyDateTime_Delta *) right);
1766
1767 if (result == Py_NotImplemented)
1768 Py_INCREF(result);
1769 return result;
1770}
1771
1772static PyObject *
1773delta_divide(PyObject *left, PyObject *right)
1774{
1775 PyObject *result = Py_NotImplemented;
1776
1777 if (PyDelta_Check(left)) {
1778 /* delta * ??? */
1779 if (PyInt_Check(right) || PyLong_Check(right))
1780 result = divide_timedelta_int(
1781 (PyDateTime_Delta *)left,
1782 right);
1783 }
1784
1785 if (result == Py_NotImplemented)
1786 Py_INCREF(result);
1787 return result;
1788}
1789
1790/* Fold in the value of the tag ("seconds", "weeks", etc) component of a
1791 * timedelta constructor. sofar is the # of microseconds accounted for
1792 * so far, and there are factor microseconds per current unit, the number
1793 * of which is given by num. num * factor is added to sofar in a
1794 * numerically careful way, and that's the result. Any fractional
1795 * microseconds left over (this can happen if num is a float type) are
1796 * added into *leftover.
1797 * Note that there are many ways this can give an error (NULL) return.
1798 */
1799static PyObject *
1800accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor,
1801 double *leftover)
1802{
1803 PyObject *prod;
1804 PyObject *sum;
1805
1806 assert(num != NULL);
1807
1808 if (PyInt_Check(num) || PyLong_Check(num)) {
1809 prod = PyNumber_Multiply(num, factor);
1810 if (prod == NULL)
1811 return NULL;
1812 sum = PyNumber_Add(sofar, prod);
1813 Py_DECREF(prod);
1814 return sum;
1815 }
1816
1817 if (PyFloat_Check(num)) {
1818 double dnum;
1819 double fracpart;
1820 double intpart;
1821 PyObject *x;
1822 PyObject *y;
1823
1824 /* The Plan: decompose num into an integer part and a
1825 * fractional part, num = intpart + fracpart.
1826 * Then num * factor ==
1827 * intpart * factor + fracpart * factor
1828 * and the LHS can be computed exactly in long arithmetic.
1829 * The RHS is again broken into an int part and frac part.
1830 * and the frac part is added into *leftover.
1831 */
1832 dnum = PyFloat_AsDouble(num);
1833 if (dnum == -1.0 && PyErr_Occurred())
1834 return NULL;
1835 fracpart = modf(dnum, &intpart);
1836 x = PyLong_FromDouble(intpart);
1837 if (x == NULL)
1838 return NULL;
1839
1840 prod = PyNumber_Multiply(x, factor);
1841 Py_DECREF(x);
1842 if (prod == NULL)
1843 return NULL;
1844
1845 sum = PyNumber_Add(sofar, prod);
1846 Py_DECREF(prod);
1847 if (sum == NULL)
1848 return NULL;
1849
1850 if (fracpart == 0.0)
1851 return sum;
1852 /* So far we've lost no information. Dealing with the
1853 * fractional part requires float arithmetic, and may
1854 * lose a little info.
1855 */
1856 assert(PyInt_Check(factor) || PyLong_Check(factor));
Guido van Rossumddefaf32007-01-14 03:31:43 +00001857 dnum = PyLong_AsDouble(factor);
Tim Peters2a799bf2002-12-16 20:18:38 +00001858
1859 dnum *= fracpart;
1860 fracpart = modf(dnum, &intpart);
1861 x = PyLong_FromDouble(intpart);
1862 if (x == NULL) {
1863 Py_DECREF(sum);
1864 return NULL;
1865 }
1866
1867 y = PyNumber_Add(sum, x);
1868 Py_DECREF(sum);
1869 Py_DECREF(x);
1870 *leftover += fracpart;
1871 return y;
1872 }
1873
1874 PyErr_Format(PyExc_TypeError,
1875 "unsupported type for timedelta %s component: %s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001876 tag, Py_Type(num)->tp_name);
Tim Peters2a799bf2002-12-16 20:18:38 +00001877 return NULL;
1878}
1879
1880static PyObject *
1881delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
1882{
1883 PyObject *self = NULL;
1884
1885 /* Argument objects. */
1886 PyObject *day = NULL;
1887 PyObject *second = NULL;
1888 PyObject *us = NULL;
1889 PyObject *ms = NULL;
1890 PyObject *minute = NULL;
1891 PyObject *hour = NULL;
1892 PyObject *week = NULL;
1893
1894 PyObject *x = NULL; /* running sum of microseconds */
1895 PyObject *y = NULL; /* temp sum of microseconds */
1896 double leftover_us = 0.0;
1897
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00001898 static char *keywords[] = {
Tim Peters2a799bf2002-12-16 20:18:38 +00001899 "days", "seconds", "microseconds", "milliseconds",
1900 "minutes", "hours", "weeks", NULL
1901 };
1902
1903 if (PyArg_ParseTupleAndKeywords(args, kw, "|OOOOOOO:__new__",
1904 keywords,
1905 &day, &second, &us,
1906 &ms, &minute, &hour, &week) == 0)
1907 goto Done;
1908
1909 x = PyInt_FromLong(0);
1910 if (x == NULL)
1911 goto Done;
1912
1913#define CLEANUP \
1914 Py_DECREF(x); \
1915 x = y; \
1916 if (x == NULL) \
1917 goto Done
1918
1919 if (us) {
1920 y = accum("microseconds", x, us, us_per_us, &leftover_us);
1921 CLEANUP;
1922 }
1923 if (ms) {
1924 y = accum("milliseconds", x, ms, us_per_ms, &leftover_us);
1925 CLEANUP;
1926 }
1927 if (second) {
1928 y = accum("seconds", x, second, us_per_second, &leftover_us);
1929 CLEANUP;
1930 }
1931 if (minute) {
1932 y = accum("minutes", x, minute, us_per_minute, &leftover_us);
1933 CLEANUP;
1934 }
1935 if (hour) {
1936 y = accum("hours", x, hour, us_per_hour, &leftover_us);
1937 CLEANUP;
1938 }
1939 if (day) {
1940 y = accum("days", x, day, us_per_day, &leftover_us);
1941 CLEANUP;
1942 }
1943 if (week) {
1944 y = accum("weeks", x, week, us_per_week, &leftover_us);
1945 CLEANUP;
1946 }
1947 if (leftover_us) {
1948 /* Round to nearest whole # of us, and add into x. */
Tim Peters5d644dd2003-01-02 16:32:54 +00001949 PyObject *temp = PyLong_FromLong(round_to_long(leftover_us));
Tim Peters2a799bf2002-12-16 20:18:38 +00001950 if (temp == NULL) {
1951 Py_DECREF(x);
1952 goto Done;
1953 }
1954 y = PyNumber_Add(x, temp);
1955 Py_DECREF(temp);
1956 CLEANUP;
1957 }
1958
Tim Petersb0c854d2003-05-17 15:57:00 +00001959 self = microseconds_to_delta_ex(x, type);
Tim Peters2a799bf2002-12-16 20:18:38 +00001960 Py_DECREF(x);
1961Done:
1962 return self;
1963
1964#undef CLEANUP
1965}
1966
1967static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00001968delta_bool(PyDateTime_Delta *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00001969{
1970 return (GET_TD_DAYS(self) != 0
1971 || GET_TD_SECONDS(self) != 0
1972 || GET_TD_MICROSECONDS(self) != 0);
1973}
1974
1975static PyObject *
1976delta_repr(PyDateTime_Delta *self)
1977{
1978 if (GET_TD_MICROSECONDS(self) != 0)
Walter Dörwald1ab83302007-05-18 17:15:44 +00001979 return PyUnicode_FromFormat("%s(%d, %d, %d)",
Martin v. Löwis5d7428b2007-07-21 18:47:48 +00001980 Py_Type(self)->tp_name,
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001981 GET_TD_DAYS(self),
1982 GET_TD_SECONDS(self),
1983 GET_TD_MICROSECONDS(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00001984 if (GET_TD_SECONDS(self) != 0)
Walter Dörwald1ab83302007-05-18 17:15:44 +00001985 return PyUnicode_FromFormat("%s(%d, %d)",
Martin v. Löwis5d7428b2007-07-21 18:47:48 +00001986 Py_Type(self)->tp_name,
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001987 GET_TD_DAYS(self),
1988 GET_TD_SECONDS(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00001989
Walter Dörwald1ab83302007-05-18 17:15:44 +00001990 return PyUnicode_FromFormat("%s(%d)",
Martin v. Löwis5d7428b2007-07-21 18:47:48 +00001991 Py_Type(self)->tp_name,
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001992 GET_TD_DAYS(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00001993}
1994
1995static PyObject *
1996delta_str(PyDateTime_Delta *self)
1997{
Tim Peters2a799bf2002-12-16 20:18:38 +00001998 int us = GET_TD_MICROSECONDS(self);
Walter Dörwaldbaf853c2007-05-31 18:42:47 +00001999 int seconds = GET_TD_SECONDS(self);
2000 int minutes = divmod(seconds, 60, &seconds);
2001 int hours = divmod(minutes, 60, &minutes);
2002 int days = GET_TD_DAYS(self);
Tim Peters2a799bf2002-12-16 20:18:38 +00002003
2004 if (days) {
Walter Dörwaldbaf853c2007-05-31 18:42:47 +00002005 if (us)
2006 return PyUnicode_FromFormat("%d day%s, %d:%02d:%02d.%06d",
2007 days, (days == 1 || days == -1) ? "" : "s",
2008 hours, minutes, seconds, us);
2009 else
2010 return PyUnicode_FromFormat("%d day%s, %d:%02d:%02d",
2011 days, (days == 1 || days == -1) ? "" : "s",
2012 hours, minutes, seconds);
2013 } else {
2014 if (us)
2015 return PyUnicode_FromFormat("%d:%02d:%02d.%06d",
2016 hours, minutes, seconds, us);
2017 else
2018 return PyUnicode_FromFormat("%d:%02d:%02d",
2019 hours, minutes, seconds);
Tim Peters2a799bf2002-12-16 20:18:38 +00002020 }
2021
Tim Peters2a799bf2002-12-16 20:18:38 +00002022}
2023
Tim Peters371935f2003-02-01 01:52:50 +00002024/* Pickle support, a simple use of __reduce__. */
2025
Tim Petersb57f8f02003-02-01 02:54:15 +00002026/* __getstate__ isn't exposed */
Tim Peters2a799bf2002-12-16 20:18:38 +00002027static PyObject *
2028delta_getstate(PyDateTime_Delta *self)
2029{
2030 return Py_BuildValue("iii", GET_TD_DAYS(self),
2031 GET_TD_SECONDS(self),
2032 GET_TD_MICROSECONDS(self));
2033}
2034
Tim Peters2a799bf2002-12-16 20:18:38 +00002035static PyObject *
2036delta_reduce(PyDateTime_Delta* self)
2037{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002038 return Py_BuildValue("ON", Py_Type(self), delta_getstate(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00002039}
2040
2041#define OFFSET(field) offsetof(PyDateTime_Delta, field)
2042
2043static PyMemberDef delta_members[] = {
Guido van Rossum177e41a2003-01-30 22:06:23 +00002044
Neal Norwitzdfb80862002-12-19 02:30:56 +00002045 {"days", T_INT, OFFSET(days), READONLY,
Tim Peters2a799bf2002-12-16 20:18:38 +00002046 PyDoc_STR("Number of days.")},
2047
Neal Norwitzdfb80862002-12-19 02:30:56 +00002048 {"seconds", T_INT, OFFSET(seconds), READONLY,
Tim Peters2a799bf2002-12-16 20:18:38 +00002049 PyDoc_STR("Number of seconds (>= 0 and less than 1 day).")},
2050
Neal Norwitzdfb80862002-12-19 02:30:56 +00002051 {"microseconds", T_INT, OFFSET(microseconds), READONLY,
Tim Peters2a799bf2002-12-16 20:18:38 +00002052 PyDoc_STR("Number of microseconds (>= 0 and less than 1 second).")},
2053 {NULL}
2054};
2055
2056static PyMethodDef delta_methods[] = {
Guido van Rossum177e41a2003-01-30 22:06:23 +00002057 {"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS,
2058 PyDoc_STR("__reduce__() -> (cls, state)")},
2059
Tim Peters2a799bf2002-12-16 20:18:38 +00002060 {NULL, NULL},
2061};
2062
2063static char delta_doc[] =
2064PyDoc_STR("Difference between two datetime values.");
2065
2066static PyNumberMethods delta_as_number = {
2067 delta_add, /* nb_add */
2068 delta_subtract, /* nb_subtract */
2069 delta_multiply, /* nb_multiply */
Tim Peters2a799bf2002-12-16 20:18:38 +00002070 0, /* nb_remainder */
2071 0, /* nb_divmod */
2072 0, /* nb_power */
2073 (unaryfunc)delta_negative, /* nb_negative */
2074 (unaryfunc)delta_positive, /* nb_positive */
2075 (unaryfunc)delta_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00002076 (inquiry)delta_bool, /* nb_bool */
Tim Peters2a799bf2002-12-16 20:18:38 +00002077 0, /*nb_invert*/
2078 0, /*nb_lshift*/
2079 0, /*nb_rshift*/
2080 0, /*nb_and*/
2081 0, /*nb_xor*/
2082 0, /*nb_or*/
2083 0, /*nb_coerce*/
2084 0, /*nb_int*/
2085 0, /*nb_long*/
2086 0, /*nb_float*/
2087 0, /*nb_oct*/
2088 0, /*nb_hex*/
2089 0, /*nb_inplace_add*/
2090 0, /*nb_inplace_subtract*/
2091 0, /*nb_inplace_multiply*/
Tim Peters2a799bf2002-12-16 20:18:38 +00002092 0, /*nb_inplace_remainder*/
2093 0, /*nb_inplace_power*/
2094 0, /*nb_inplace_lshift*/
2095 0, /*nb_inplace_rshift*/
2096 0, /*nb_inplace_and*/
2097 0, /*nb_inplace_xor*/
2098 0, /*nb_inplace_or*/
2099 delta_divide, /* nb_floor_divide */
2100 0, /* nb_true_divide */
2101 0, /* nb_inplace_floor_divide */
2102 0, /* nb_inplace_true_divide */
2103};
2104
2105static PyTypeObject PyDateTime_DeltaType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002106 PyVarObject_HEAD_INIT(NULL, 0)
Tim Peters2a799bf2002-12-16 20:18:38 +00002107 "datetime.timedelta", /* tp_name */
2108 sizeof(PyDateTime_Delta), /* tp_basicsize */
2109 0, /* tp_itemsize */
2110 0, /* tp_dealloc */
2111 0, /* tp_print */
2112 0, /* tp_getattr */
2113 0, /* tp_setattr */
2114 0, /* tp_compare */
2115 (reprfunc)delta_repr, /* tp_repr */
2116 &delta_as_number, /* tp_as_number */
2117 0, /* tp_as_sequence */
2118 0, /* tp_as_mapping */
2119 (hashfunc)delta_hash, /* tp_hash */
2120 0, /* tp_call */
2121 (reprfunc)delta_str, /* tp_str */
2122 PyObject_GenericGetAttr, /* tp_getattro */
2123 0, /* tp_setattro */
2124 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002125 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters2a799bf2002-12-16 20:18:38 +00002126 delta_doc, /* tp_doc */
2127 0, /* tp_traverse */
2128 0, /* tp_clear */
Guido van Rossum19960592006-08-24 17:29:38 +00002129 delta_richcompare, /* tp_richcompare */
Tim Peters2a799bf2002-12-16 20:18:38 +00002130 0, /* tp_weaklistoffset */
2131 0, /* tp_iter */
2132 0, /* tp_iternext */
2133 delta_methods, /* tp_methods */
2134 delta_members, /* tp_members */
2135 0, /* tp_getset */
2136 0, /* tp_base */
2137 0, /* tp_dict */
2138 0, /* tp_descr_get */
2139 0, /* tp_descr_set */
2140 0, /* tp_dictoffset */
2141 0, /* tp_init */
2142 0, /* tp_alloc */
2143 delta_new, /* tp_new */
Tim Peters4c530132003-05-16 22:44:06 +00002144 0, /* tp_free */
Tim Peters2a799bf2002-12-16 20:18:38 +00002145};
2146
2147/*
2148 * PyDateTime_Date implementation.
2149 */
2150
2151/* Accessor properties. */
2152
2153static PyObject *
2154date_year(PyDateTime_Date *self, void *unused)
2155{
2156 return PyInt_FromLong(GET_YEAR(self));
2157}
2158
2159static PyObject *
2160date_month(PyDateTime_Date *self, void *unused)
2161{
2162 return PyInt_FromLong(GET_MONTH(self));
2163}
2164
2165static PyObject *
2166date_day(PyDateTime_Date *self, void *unused)
2167{
2168 return PyInt_FromLong(GET_DAY(self));
2169}
2170
2171static PyGetSetDef date_getset[] = {
2172 {"year", (getter)date_year},
2173 {"month", (getter)date_month},
2174 {"day", (getter)date_day},
2175 {NULL}
2176};
2177
2178/* Constructors. */
2179
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002180static char *date_kws[] = {"year", "month", "day", NULL};
Tim Peters12bf3392002-12-24 05:41:27 +00002181
Tim Peters2a799bf2002-12-16 20:18:38 +00002182static PyObject *
2183date_new(PyTypeObject *type, PyObject *args, PyObject *kw)
2184{
2185 PyObject *self = NULL;
Tim Peters70533e22003-02-01 04:40:04 +00002186 PyObject *state;
Tim Peters2a799bf2002-12-16 20:18:38 +00002187 int year;
2188 int month;
2189 int day;
2190
Guido van Rossum177e41a2003-01-30 22:06:23 +00002191 /* Check for invocation from pickle with __getstate__ state */
2192 if (PyTuple_GET_SIZE(args) == 1 &&
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002193 PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
2194 PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE &&
2195 MONTH_IS_SANE(PyBytes_AS_STRING(state)[2]))
Guido van Rossum177e41a2003-01-30 22:06:23 +00002196 {
Tim Peters70533e22003-02-01 04:40:04 +00002197 PyDateTime_Date *me;
2198
Tim Peters604c0132004-06-07 23:04:33 +00002199 me = (PyDateTime_Date *) (type->tp_alloc(type, 0));
Tim Peters70533e22003-02-01 04:40:04 +00002200 if (me != NULL) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002201 char *pdata = PyBytes_AS_STRING(state);
Tim Peters70533e22003-02-01 04:40:04 +00002202 memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE);
2203 me->hashcode = -1;
Guido van Rossum177e41a2003-01-30 22:06:23 +00002204 }
Tim Peters70533e22003-02-01 04:40:04 +00002205 return (PyObject *)me;
Guido van Rossum177e41a2003-01-30 22:06:23 +00002206 }
2207
Tim Peters12bf3392002-12-24 05:41:27 +00002208 if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws,
Tim Peters2a799bf2002-12-16 20:18:38 +00002209 &year, &month, &day)) {
2210 if (check_date_args(year, month, day) < 0)
2211 return NULL;
Guido van Rossum8b7a9a32003-04-14 22:01:58 +00002212 self = new_date_ex(year, month, day, type);
Tim Peters2a799bf2002-12-16 20:18:38 +00002213 }
2214 return self;
2215}
2216
2217/* Return new date from localtime(t). */
2218static PyObject *
Tim Peters1b6f7a92004-06-20 02:50:16 +00002219date_local_from_time_t(PyObject *cls, double ts)
Tim Peters2a799bf2002-12-16 20:18:38 +00002220{
2221 struct tm *tm;
Tim Peters1b6f7a92004-06-20 02:50:16 +00002222 time_t t;
Tim Peters2a799bf2002-12-16 20:18:38 +00002223 PyObject *result = NULL;
2224
Tim Peters1b6f7a92004-06-20 02:50:16 +00002225 t = _PyTime_DoubleToTimet(ts);
2226 if (t == (time_t)-1 && PyErr_Occurred())
2227 return NULL;
Tim Peters2a799bf2002-12-16 20:18:38 +00002228 tm = localtime(&t);
2229 if (tm)
2230 result = PyObject_CallFunction(cls, "iii",
2231 tm->tm_year + 1900,
2232 tm->tm_mon + 1,
2233 tm->tm_mday);
2234 else
2235 PyErr_SetString(PyExc_ValueError,
2236 "timestamp out of range for "
2237 "platform localtime() function");
2238 return result;
2239}
2240
2241/* Return new date from current time.
2242 * We say this is equivalent to fromtimestamp(time.time()), and the
2243 * only way to be sure of that is to *call* time.time(). That's not
2244 * generally the same as calling C's time.
2245 */
2246static PyObject *
2247date_today(PyObject *cls, PyObject *dummy)
2248{
2249 PyObject *time;
2250 PyObject *result;
2251
2252 time = time_time();
2253 if (time == NULL)
2254 return NULL;
2255
2256 /* Note well: today() is a class method, so this may not call
2257 * date.fromtimestamp. For example, it may call
2258 * datetime.fromtimestamp. That's why we need all the accuracy
2259 * time.time() delivers; if someone were gonzo about optimization,
2260 * date.today() could get away with plain C time().
2261 */
2262 result = PyObject_CallMethod(cls, "fromtimestamp", "O", time);
2263 Py_DECREF(time);
2264 return result;
2265}
2266
2267/* Return new date from given timestamp (Python timestamp -- a double). */
2268static PyObject *
2269date_fromtimestamp(PyObject *cls, PyObject *args)
2270{
2271 double timestamp;
2272 PyObject *result = NULL;
2273
2274 if (PyArg_ParseTuple(args, "d:fromtimestamp", &timestamp))
Tim Peters1b6f7a92004-06-20 02:50:16 +00002275 result = date_local_from_time_t(cls, timestamp);
Tim Peters2a799bf2002-12-16 20:18:38 +00002276 return result;
2277}
2278
2279/* Return new date from proleptic Gregorian ordinal. Raises ValueError if
2280 * the ordinal is out of range.
2281 */
2282static PyObject *
2283date_fromordinal(PyObject *cls, PyObject *args)
2284{
2285 PyObject *result = NULL;
2286 int ordinal;
2287
2288 if (PyArg_ParseTuple(args, "i:fromordinal", &ordinal)) {
2289 int year;
2290 int month;
2291 int day;
2292
2293 if (ordinal < 1)
2294 PyErr_SetString(PyExc_ValueError, "ordinal must be "
2295 ">= 1");
2296 else {
2297 ord_to_ymd(ordinal, &year, &month, &day);
2298 result = PyObject_CallFunction(cls, "iii",
2299 year, month, day);
2300 }
2301 }
2302 return result;
2303}
2304
2305/*
2306 * Date arithmetic.
2307 */
2308
2309/* date + timedelta -> date. If arg negate is true, subtract the timedelta
2310 * instead.
2311 */
2312static PyObject *
2313add_date_timedelta(PyDateTime_Date *date, PyDateTime_Delta *delta, int negate)
2314{
2315 PyObject *result = NULL;
2316 int year = GET_YEAR(date);
2317 int month = GET_MONTH(date);
2318 int deltadays = GET_TD_DAYS(delta);
2319 /* C-level overflow is impossible because |deltadays| < 1e9. */
2320 int day = GET_DAY(date) + (negate ? -deltadays : deltadays);
2321
2322 if (normalize_date(&year, &month, &day) >= 0)
2323 result = new_date(year, month, day);
2324 return result;
2325}
2326
2327static PyObject *
2328date_add(PyObject *left, PyObject *right)
2329{
2330 if (PyDateTime_Check(left) || PyDateTime_Check(right)) {
2331 Py_INCREF(Py_NotImplemented);
2332 return Py_NotImplemented;
2333 }
Tim Petersaa7d8492003-02-08 03:28:59 +00002334 if (PyDate_Check(left)) {
Tim Peters2a799bf2002-12-16 20:18:38 +00002335 /* date + ??? */
2336 if (PyDelta_Check(right))
2337 /* date + delta */
2338 return add_date_timedelta((PyDateTime_Date *) left,
2339 (PyDateTime_Delta *) right,
2340 0);
2341 }
2342 else {
2343 /* ??? + date
2344 * 'right' must be one of us, or we wouldn't have been called
2345 */
2346 if (PyDelta_Check(left))
2347 /* delta + date */
2348 return add_date_timedelta((PyDateTime_Date *) right,
2349 (PyDateTime_Delta *) left,
2350 0);
2351 }
2352 Py_INCREF(Py_NotImplemented);
2353 return Py_NotImplemented;
2354}
2355
2356static PyObject *
2357date_subtract(PyObject *left, PyObject *right)
2358{
2359 if (PyDateTime_Check(left) || PyDateTime_Check(right)) {
2360 Py_INCREF(Py_NotImplemented);
2361 return Py_NotImplemented;
2362 }
Tim Petersaa7d8492003-02-08 03:28:59 +00002363 if (PyDate_Check(left)) {
2364 if (PyDate_Check(right)) {
Tim Peters2a799bf2002-12-16 20:18:38 +00002365 /* date - date */
2366 int left_ord = ymd_to_ord(GET_YEAR(left),
2367 GET_MONTH(left),
2368 GET_DAY(left));
2369 int right_ord = ymd_to_ord(GET_YEAR(right),
2370 GET_MONTH(right),
2371 GET_DAY(right));
2372 return new_delta(left_ord - right_ord, 0, 0, 0);
2373 }
2374 if (PyDelta_Check(right)) {
2375 /* date - delta */
2376 return add_date_timedelta((PyDateTime_Date *) left,
2377 (PyDateTime_Delta *) right,
2378 1);
2379 }
2380 }
2381 Py_INCREF(Py_NotImplemented);
2382 return Py_NotImplemented;
2383}
2384
2385
2386/* Various ways to turn a date into a string. */
2387
2388static PyObject *
2389date_repr(PyDateTime_Date *self)
2390{
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002391 return PyUnicode_FromFormat("%s(%d, %d, %d)",
Martin v. Löwis5d7428b2007-07-21 18:47:48 +00002392 Py_Type(self)->tp_name,
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002393 GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00002394}
2395
2396static PyObject *
2397date_isoformat(PyDateTime_Date *self)
2398{
Walter Dörwaldbafa1372007-05-31 17:50:48 +00002399 return PyUnicode_FromFormat("%04d-%02d-%02d",
2400 GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00002401}
2402
Tim Peterse2df5ff2003-05-02 18:39:55 +00002403/* str() calls the appropriate isoformat() method. */
Tim Peters2a799bf2002-12-16 20:18:38 +00002404static PyObject *
2405date_str(PyDateTime_Date *self)
2406{
2407 return PyObject_CallMethod((PyObject *)self, "isoformat", "()");
2408}
2409
2410
2411static PyObject *
2412date_ctime(PyDateTime_Date *self)
2413{
2414 return format_ctime(self, 0, 0, 0);
2415}
2416
2417static PyObject *
2418date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)
2419{
2420 /* This method can be inherited, and needs to call the
2421 * timetuple() method appropriate to self's class.
2422 */
2423 PyObject *result;
2424 PyObject *format;
2425 PyObject *tuple;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002426 static char *keywords[] = {"format", NULL};
Tim Peters2a799bf2002-12-16 20:18:38 +00002427
Guido van Rossumbce56a62007-05-10 18:04:33 +00002428 if (! PyArg_ParseTupleAndKeywords(args, kw, "S:strftime", keywords,
2429 &format))
Tim Peters2a799bf2002-12-16 20:18:38 +00002430 return NULL;
2431
2432 tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()");
2433 if (tuple == NULL)
2434 return NULL;
Tim Petersbad8ff02002-12-30 20:52:32 +00002435 result = wrap_strftime((PyObject *)self, format, tuple,
2436 (PyObject *)self);
Tim Peters2a799bf2002-12-16 20:18:38 +00002437 Py_DECREF(tuple);
2438 return result;
2439}
2440
2441/* ISO methods. */
2442
2443static PyObject *
2444date_isoweekday(PyDateTime_Date *self)
2445{
2446 int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
2447
2448 return PyInt_FromLong(dow + 1);
2449}
2450
2451static PyObject *
2452date_isocalendar(PyDateTime_Date *self)
2453{
2454 int year = GET_YEAR(self);
2455 int week1_monday = iso_week1_monday(year);
2456 int today = ymd_to_ord(year, GET_MONTH(self), GET_DAY(self));
2457 int week;
2458 int day;
2459
2460 week = divmod(today - week1_monday, 7, &day);
2461 if (week < 0) {
2462 --year;
2463 week1_monday = iso_week1_monday(year);
2464 week = divmod(today - week1_monday, 7, &day);
2465 }
2466 else if (week >= 52 && today >= iso_week1_monday(year + 1)) {
2467 ++year;
2468 week = 0;
2469 }
2470 return Py_BuildValue("iii", year, week + 1, day + 1);
2471}
2472
2473/* Miscellaneous methods. */
2474
Tim Peters2a799bf2002-12-16 20:18:38 +00002475static PyObject *
Guido van Rossum19960592006-08-24 17:29:38 +00002476date_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters2a799bf2002-12-16 20:18:38 +00002477{
Guido van Rossum19960592006-08-24 17:29:38 +00002478 if (PyDate_Check(other)) {
2479 int diff = memcmp(((PyDateTime_Date *)self)->data,
2480 ((PyDateTime_Date *)other)->data,
2481 _PyDateTime_DATE_DATASIZE);
2482 return diff_to_bool(diff, op);
2483 }
2484 else {
Tim Peters07534a62003-02-07 22:50:28 +00002485 Py_INCREF(Py_NotImplemented);
2486 return Py_NotImplemented;
Tim Peters2a799bf2002-12-16 20:18:38 +00002487 }
Tim Peters2a799bf2002-12-16 20:18:38 +00002488}
2489
2490static PyObject *
2491date_timetuple(PyDateTime_Date *self)
2492{
2493 return build_struct_time(GET_YEAR(self),
2494 GET_MONTH(self),
2495 GET_DAY(self),
2496 0, 0, 0, -1);
2497}
2498
Tim Peters12bf3392002-12-24 05:41:27 +00002499static PyObject *
2500date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)
2501{
2502 PyObject *clone;
2503 PyObject *tuple;
2504 int year = GET_YEAR(self);
2505 int month = GET_MONTH(self);
2506 int day = GET_DAY(self);
2507
2508 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iii:replace", date_kws,
2509 &year, &month, &day))
2510 return NULL;
2511 tuple = Py_BuildValue("iii", year, month, day);
2512 if (tuple == NULL)
2513 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002514 clone = date_new(Py_Type(self), tuple, NULL);
Tim Peters12bf3392002-12-24 05:41:27 +00002515 Py_DECREF(tuple);
2516 return clone;
2517}
2518
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002519static PyObject *date_getstate(PyDateTime_Date *self, int hashable);
Tim Peters2a799bf2002-12-16 20:18:38 +00002520
2521static long
2522date_hash(PyDateTime_Date *self)
2523{
2524 if (self->hashcode == -1) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002525 PyObject *temp = date_getstate(self, 1);
Tim Peters2a799bf2002-12-16 20:18:38 +00002526 if (temp != NULL) {
2527 self->hashcode = PyObject_Hash(temp);
2528 Py_DECREF(temp);
2529 }
2530 }
2531 return self->hashcode;
2532}
2533
2534static PyObject *
2535date_toordinal(PyDateTime_Date *self)
2536{
2537 return PyInt_FromLong(ymd_to_ord(GET_YEAR(self), GET_MONTH(self),
2538 GET_DAY(self)));
2539}
2540
2541static PyObject *
2542date_weekday(PyDateTime_Date *self)
2543{
2544 int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self));
2545
2546 return PyInt_FromLong(dow);
2547}
2548
Tim Peters371935f2003-02-01 01:52:50 +00002549/* Pickle support, a simple use of __reduce__. */
Tim Peters2a799bf2002-12-16 20:18:38 +00002550
Tim Petersb57f8f02003-02-01 02:54:15 +00002551/* __getstate__ isn't exposed */
Tim Peters2a799bf2002-12-16 20:18:38 +00002552static PyObject *
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002553date_getstate(PyDateTime_Date *self, int hashable)
Tim Peters2a799bf2002-12-16 20:18:38 +00002554{
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002555 PyObject* field;
2556 if (hashable)
2557 field = PyString_FromStringAndSize(
2558 (char*)self->data, _PyDateTime_DATE_DATASIZE);
2559 else
2560 field = PyBytes_FromStringAndSize(
2561 (char*)self->data, _PyDateTime_DATE_DATASIZE);
2562 return Py_BuildValue("(N)", field);
Tim Peters2a799bf2002-12-16 20:18:38 +00002563}
2564
2565static PyObject *
Guido van Rossum177e41a2003-01-30 22:06:23 +00002566date_reduce(PyDateTime_Date *self, PyObject *arg)
Tim Peters2a799bf2002-12-16 20:18:38 +00002567{
Martin v. Löwis5d7428b2007-07-21 18:47:48 +00002568 return Py_BuildValue("(ON)", Py_Type(self), date_getstate(self, 0));
Tim Peters2a799bf2002-12-16 20:18:38 +00002569}
2570
2571static PyMethodDef date_methods[] = {
Guido van Rossum177e41a2003-01-30 22:06:23 +00002572
Tim Peters2a799bf2002-12-16 20:18:38 +00002573 /* Class methods: */
Guido van Rossum177e41a2003-01-30 22:06:23 +00002574
Tim Peters2a799bf2002-12-16 20:18:38 +00002575 {"fromtimestamp", (PyCFunction)date_fromtimestamp, METH_VARARGS |
2576 METH_CLASS,
2577 PyDoc_STR("timestamp -> local date from a POSIX timestamp (like "
2578 "time.time()).")},
2579
2580 {"fromordinal", (PyCFunction)date_fromordinal, METH_VARARGS |
2581 METH_CLASS,
2582 PyDoc_STR("int -> date corresponding to a proleptic Gregorian "
2583 "ordinal.")},
2584
2585 {"today", (PyCFunction)date_today, METH_NOARGS | METH_CLASS,
2586 PyDoc_STR("Current date or datetime: same as "
2587 "self.__class__.fromtimestamp(time.time()).")},
2588
2589 /* Instance methods: */
2590
2591 {"ctime", (PyCFunction)date_ctime, METH_NOARGS,
2592 PyDoc_STR("Return ctime() style string.")},
2593
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002594 {"strftime", (PyCFunction)date_strftime, METH_VARARGS | METH_KEYWORDS,
Tim Peters2a799bf2002-12-16 20:18:38 +00002595 PyDoc_STR("format -> strftime() style string.")},
2596
2597 {"timetuple", (PyCFunction)date_timetuple, METH_NOARGS,
2598 PyDoc_STR("Return time tuple, compatible with time.localtime().")},
2599
2600 {"isocalendar", (PyCFunction)date_isocalendar, METH_NOARGS,
2601 PyDoc_STR("Return a 3-tuple containing ISO year, week number, and "
2602 "weekday.")},
2603
2604 {"isoformat", (PyCFunction)date_isoformat, METH_NOARGS,
2605 PyDoc_STR("Return string in ISO 8601 format, YYYY-MM-DD.")},
2606
2607 {"isoweekday", (PyCFunction)date_isoweekday, METH_NOARGS,
2608 PyDoc_STR("Return the day of the week represented by the date.\n"
2609 "Monday == 1 ... Sunday == 7")},
2610
2611 {"toordinal", (PyCFunction)date_toordinal, METH_NOARGS,
2612 PyDoc_STR("Return proleptic Gregorian ordinal. January 1 of year "
2613 "1 is day 1.")},
2614
2615 {"weekday", (PyCFunction)date_weekday, METH_NOARGS,
2616 PyDoc_STR("Return the day of the week represented by the date.\n"
2617 "Monday == 0 ... Sunday == 6")},
2618
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002619 {"replace", (PyCFunction)date_replace, METH_VARARGS | METH_KEYWORDS,
Tim Peters12bf3392002-12-24 05:41:27 +00002620 PyDoc_STR("Return date with new specified fields.")},
2621
Guido van Rossum177e41a2003-01-30 22:06:23 +00002622 {"__reduce__", (PyCFunction)date_reduce, METH_NOARGS,
2623 PyDoc_STR("__reduce__() -> (cls, state)")},
2624
Tim Peters2a799bf2002-12-16 20:18:38 +00002625 {NULL, NULL}
2626};
2627
2628static char date_doc[] =
Raymond Hettinger3a4231d2004-12-19 20:13:24 +00002629PyDoc_STR("date(year, month, day) --> date object");
Tim Peters2a799bf2002-12-16 20:18:38 +00002630
2631static PyNumberMethods date_as_number = {
2632 date_add, /* nb_add */
2633 date_subtract, /* nb_subtract */
2634 0, /* nb_multiply */
Tim Peters2a799bf2002-12-16 20:18:38 +00002635 0, /* nb_remainder */
2636 0, /* nb_divmod */
2637 0, /* nb_power */
2638 0, /* nb_negative */
2639 0, /* nb_positive */
2640 0, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00002641 0, /* nb_bool */
Tim Peters2a799bf2002-12-16 20:18:38 +00002642};
2643
2644static PyTypeObject PyDateTime_DateType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002645 PyVarObject_HEAD_INIT(NULL, 0)
Tim Peters2a799bf2002-12-16 20:18:38 +00002646 "datetime.date", /* tp_name */
2647 sizeof(PyDateTime_Date), /* tp_basicsize */
2648 0, /* tp_itemsize */
Guido van Rossum8b7a9a32003-04-14 22:01:58 +00002649 0, /* tp_dealloc */
Tim Peters2a799bf2002-12-16 20:18:38 +00002650 0, /* tp_print */
2651 0, /* tp_getattr */
2652 0, /* tp_setattr */
2653 0, /* tp_compare */
2654 (reprfunc)date_repr, /* tp_repr */
2655 &date_as_number, /* tp_as_number */
2656 0, /* tp_as_sequence */
2657 0, /* tp_as_mapping */
2658 (hashfunc)date_hash, /* tp_hash */
2659 0, /* tp_call */
2660 (reprfunc)date_str, /* tp_str */
2661 PyObject_GenericGetAttr, /* tp_getattro */
2662 0, /* tp_setattro */
2663 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002664 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters2a799bf2002-12-16 20:18:38 +00002665 date_doc, /* tp_doc */
2666 0, /* tp_traverse */
2667 0, /* tp_clear */
Guido van Rossum19960592006-08-24 17:29:38 +00002668 date_richcompare, /* tp_richcompare */
Tim Peters2a799bf2002-12-16 20:18:38 +00002669 0, /* tp_weaklistoffset */
2670 0, /* tp_iter */
2671 0, /* tp_iternext */
2672 date_methods, /* tp_methods */
2673 0, /* tp_members */
2674 date_getset, /* tp_getset */
2675 0, /* tp_base */
2676 0, /* tp_dict */
2677 0, /* tp_descr_get */
2678 0, /* tp_descr_set */
2679 0, /* tp_dictoffset */
2680 0, /* tp_init */
2681 0, /* tp_alloc */
2682 date_new, /* tp_new */
Tim Peters4c530132003-05-16 22:44:06 +00002683 0, /* tp_free */
Tim Peters2a799bf2002-12-16 20:18:38 +00002684};
2685
2686/*
Tim Peters2a799bf2002-12-16 20:18:38 +00002687 * PyDateTime_TZInfo implementation.
2688 */
2689
2690/* This is a pure abstract base class, so doesn't do anything beyond
2691 * raising NotImplemented exceptions. Real tzinfo classes need
2692 * to derive from this. This is mostly for clarity, and for efficiency in
Tim Petersa9bc1682003-01-11 03:39:11 +00002693 * datetime and time constructors (their tzinfo arguments need to
Tim Peters2a799bf2002-12-16 20:18:38 +00002694 * be subclasses of this tzinfo class, which is easy and quick to check).
2695 *
2696 * Note: For reasons having to do with pickling of subclasses, we have
2697 * to allow tzinfo objects to be instantiated. This wasn't an issue
2698 * in the Python implementation (__init__() could raise NotImplementedError
2699 * there without ill effect), but doing so in the C implementation hit a
2700 * brick wall.
2701 */
2702
2703static PyObject *
2704tzinfo_nogo(const char* methodname)
2705{
2706 PyErr_Format(PyExc_NotImplementedError,
2707 "a tzinfo subclass must implement %s()",
2708 methodname);
2709 return NULL;
2710}
2711
2712/* Methods. A subclass must implement these. */
2713
Tim Peters52dcce22003-01-23 16:36:11 +00002714static PyObject *
Tim Peters2a799bf2002-12-16 20:18:38 +00002715tzinfo_tzname(PyDateTime_TZInfo *self, PyObject *dt)
2716{
2717 return tzinfo_nogo("tzname");
2718}
2719
Tim Peters52dcce22003-01-23 16:36:11 +00002720static PyObject *
Tim Peters2a799bf2002-12-16 20:18:38 +00002721tzinfo_utcoffset(PyDateTime_TZInfo *self, PyObject *dt)
2722{
2723 return tzinfo_nogo("utcoffset");
2724}
2725
Tim Peters52dcce22003-01-23 16:36:11 +00002726static PyObject *
Tim Peters2a799bf2002-12-16 20:18:38 +00002727tzinfo_dst(PyDateTime_TZInfo *self, PyObject *dt)
2728{
2729 return tzinfo_nogo("dst");
2730}
2731
Tim Peters52dcce22003-01-23 16:36:11 +00002732static PyObject *
2733tzinfo_fromutc(PyDateTime_TZInfo *self, PyDateTime_DateTime *dt)
2734{
2735 int y, m, d, hh, mm, ss, us;
2736
2737 PyObject *result;
2738 int off, dst;
2739 int none;
2740 int delta;
2741
2742 if (! PyDateTime_Check(dt)) {
2743 PyErr_SetString(PyExc_TypeError,
2744 "fromutc: argument must be a datetime");
2745 return NULL;
2746 }
2747 if (! HASTZINFO(dt) || dt->tzinfo != (PyObject *)self) {
2748 PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo "
2749 "is not self");
2750 return NULL;
2751 }
2752
2753 off = call_utcoffset(dt->tzinfo, (PyObject *)dt, &none);
2754 if (off == -1 && PyErr_Occurred())
2755 return NULL;
2756 if (none) {
2757 PyErr_SetString(PyExc_ValueError, "fromutc: non-None "
2758 "utcoffset() result required");
2759 return NULL;
2760 }
2761
2762 dst = call_dst(dt->tzinfo, (PyObject *)dt, &none);
2763 if (dst == -1 && PyErr_Occurred())
2764 return NULL;
2765 if (none) {
2766 PyErr_SetString(PyExc_ValueError, "fromutc: non-None "
2767 "dst() result required");
2768 return NULL;
2769 }
2770
2771 y = GET_YEAR(dt);
2772 m = GET_MONTH(dt);
2773 d = GET_DAY(dt);
2774 hh = DATE_GET_HOUR(dt);
2775 mm = DATE_GET_MINUTE(dt);
2776 ss = DATE_GET_SECOND(dt);
2777 us = DATE_GET_MICROSECOND(dt);
2778
2779 delta = off - dst;
2780 mm += delta;
2781 if ((mm < 0 || mm >= 60) &&
2782 normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0)
Tim Petersb1049e82003-01-23 17:20:36 +00002783 return NULL;
Tim Peters52dcce22003-01-23 16:36:11 +00002784 result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo);
2785 if (result == NULL)
2786 return result;
2787
2788 dst = call_dst(dt->tzinfo, result, &none);
2789 if (dst == -1 && PyErr_Occurred())
2790 goto Fail;
2791 if (none)
2792 goto Inconsistent;
2793 if (dst == 0)
2794 return result;
2795
2796 mm += dst;
2797 if ((mm < 0 || mm >= 60) &&
2798 normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0)
2799 goto Fail;
2800 Py_DECREF(result);
2801 result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo);
2802 return result;
2803
2804Inconsistent:
2805 PyErr_SetString(PyExc_ValueError, "fromutc: tz.dst() gave"
2806 "inconsistent results; cannot convert");
2807
2808 /* fall thru to failure */
2809Fail:
2810 Py_DECREF(result);
2811 return NULL;
2812}
2813
Tim Peters2a799bf2002-12-16 20:18:38 +00002814/*
2815 * Pickle support. This is solely so that tzinfo subclasses can use
Guido van Rossum177e41a2003-01-30 22:06:23 +00002816 * pickling -- tzinfo itself is supposed to be uninstantiable.
Tim Peters2a799bf2002-12-16 20:18:38 +00002817 */
2818
Guido van Rossum177e41a2003-01-30 22:06:23 +00002819static PyObject *
2820tzinfo_reduce(PyObject *self)
2821{
2822 PyObject *args, *state, *tmp;
2823 PyObject *getinitargs, *getstate;
Tim Peters2a799bf2002-12-16 20:18:38 +00002824
Guido van Rossum177e41a2003-01-30 22:06:23 +00002825 tmp = PyTuple_New(0);
2826 if (tmp == NULL)
2827 return NULL;
Tim Peters2a799bf2002-12-16 20:18:38 +00002828
Guido van Rossum177e41a2003-01-30 22:06:23 +00002829 getinitargs = PyObject_GetAttrString(self, "__getinitargs__");
2830 if (getinitargs != NULL) {
2831 args = PyObject_CallObject(getinitargs, tmp);
2832 Py_DECREF(getinitargs);
2833 if (args == NULL) {
2834 Py_DECREF(tmp);
2835 return NULL;
2836 }
2837 }
2838 else {
2839 PyErr_Clear();
2840 args = tmp;
2841 Py_INCREF(args);
2842 }
2843
2844 getstate = PyObject_GetAttrString(self, "__getstate__");
2845 if (getstate != NULL) {
2846 state = PyObject_CallObject(getstate, tmp);
2847 Py_DECREF(getstate);
2848 if (state == NULL) {
2849 Py_DECREF(args);
2850 Py_DECREF(tmp);
2851 return NULL;
2852 }
2853 }
2854 else {
2855 PyObject **dictptr;
2856 PyErr_Clear();
2857 state = Py_None;
2858 dictptr = _PyObject_GetDictPtr(self);
2859 if (dictptr && *dictptr && PyDict_Size(*dictptr))
2860 state = *dictptr;
2861 Py_INCREF(state);
2862 }
2863
2864 Py_DECREF(tmp);
2865
2866 if (state == Py_None) {
2867 Py_DECREF(state);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002868 return Py_BuildValue("(ON)", Py_Type(self), args);
Guido van Rossum177e41a2003-01-30 22:06:23 +00002869 }
2870 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002871 return Py_BuildValue("(ONN)", Py_Type(self), args, state);
Guido van Rossum177e41a2003-01-30 22:06:23 +00002872}
Tim Peters2a799bf2002-12-16 20:18:38 +00002873
2874static PyMethodDef tzinfo_methods[] = {
Guido van Rossum177e41a2003-01-30 22:06:23 +00002875
Tim Peters2a799bf2002-12-16 20:18:38 +00002876 {"tzname", (PyCFunction)tzinfo_tzname, METH_O,
2877 PyDoc_STR("datetime -> string name of time zone.")},
2878
2879 {"utcoffset", (PyCFunction)tzinfo_utcoffset, METH_O,
2880 PyDoc_STR("datetime -> minutes east of UTC (negative for "
2881 "west of UTC).")},
2882
2883 {"dst", (PyCFunction)tzinfo_dst, METH_O,
2884 PyDoc_STR("datetime -> DST offset in minutes east of UTC.")},
2885
Tim Peters52dcce22003-01-23 16:36:11 +00002886 {"fromutc", (PyCFunction)tzinfo_fromutc, METH_O,
2887 PyDoc_STR("datetime in UTC -> datetime in local time.")},
2888
Guido van Rossum177e41a2003-01-30 22:06:23 +00002889 {"__reduce__", (PyCFunction)tzinfo_reduce, METH_NOARGS,
2890 PyDoc_STR("-> (cls, state)")},
2891
Tim Peters2a799bf2002-12-16 20:18:38 +00002892 {NULL, NULL}
2893};
2894
2895static char tzinfo_doc[] =
2896PyDoc_STR("Abstract base class for time zone info objects.");
2897
Neal Norwitz227b5332006-03-22 09:28:35 +00002898static PyTypeObject PyDateTime_TZInfoType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002899 PyVarObject_HEAD_INIT(NULL, 0)
Tim Peters2a799bf2002-12-16 20:18:38 +00002900 "datetime.tzinfo", /* tp_name */
2901 sizeof(PyDateTime_TZInfo), /* tp_basicsize */
2902 0, /* tp_itemsize */
2903 0, /* tp_dealloc */
2904 0, /* tp_print */
2905 0, /* tp_getattr */
2906 0, /* tp_setattr */
2907 0, /* tp_compare */
2908 0, /* tp_repr */
2909 0, /* tp_as_number */
2910 0, /* tp_as_sequence */
2911 0, /* tp_as_mapping */
2912 0, /* tp_hash */
2913 0, /* tp_call */
2914 0, /* tp_str */
2915 PyObject_GenericGetAttr, /* tp_getattro */
2916 0, /* tp_setattro */
2917 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002918 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters2a799bf2002-12-16 20:18:38 +00002919 tzinfo_doc, /* tp_doc */
2920 0, /* tp_traverse */
2921 0, /* tp_clear */
2922 0, /* tp_richcompare */
2923 0, /* tp_weaklistoffset */
2924 0, /* tp_iter */
2925 0, /* tp_iternext */
2926 tzinfo_methods, /* tp_methods */
2927 0, /* tp_members */
2928 0, /* tp_getset */
2929 0, /* tp_base */
2930 0, /* tp_dict */
2931 0, /* tp_descr_get */
2932 0, /* tp_descr_set */
2933 0, /* tp_dictoffset */
2934 0, /* tp_init */
2935 0, /* tp_alloc */
2936 PyType_GenericNew, /* tp_new */
2937 0, /* tp_free */
2938};
2939
2940/*
Tim Peters37f39822003-01-10 03:49:02 +00002941 * PyDateTime_Time implementation.
Tim Peters2a799bf2002-12-16 20:18:38 +00002942 */
2943
Tim Peters37f39822003-01-10 03:49:02 +00002944/* Accessor properties.
Tim Peters2a799bf2002-12-16 20:18:38 +00002945 */
2946
2947static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00002948time_hour(PyDateTime_Time *self, void *unused)
Tim Peters2a799bf2002-12-16 20:18:38 +00002949{
Tim Peters37f39822003-01-10 03:49:02 +00002950 return PyInt_FromLong(TIME_GET_HOUR(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00002951}
2952
Tim Peters37f39822003-01-10 03:49:02 +00002953static PyObject *
2954time_minute(PyDateTime_Time *self, void *unused)
2955{
2956 return PyInt_FromLong(TIME_GET_MINUTE(self));
2957}
2958
2959/* The name time_second conflicted with some platform header file. */
2960static PyObject *
2961py_time_second(PyDateTime_Time *self, void *unused)
2962{
2963 return PyInt_FromLong(TIME_GET_SECOND(self));
2964}
2965
2966static PyObject *
2967time_microsecond(PyDateTime_Time *self, void *unused)
2968{
2969 return PyInt_FromLong(TIME_GET_MICROSECOND(self));
2970}
2971
2972static PyObject *
2973time_tzinfo(PyDateTime_Time *self, void *unused)
2974{
Tim Petersa032d2e2003-01-11 00:15:54 +00002975 PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
Tim Peters37f39822003-01-10 03:49:02 +00002976 Py_INCREF(result);
2977 return result;
2978}
2979
2980static PyGetSetDef time_getset[] = {
2981 {"hour", (getter)time_hour},
2982 {"minute", (getter)time_minute},
2983 {"second", (getter)py_time_second},
2984 {"microsecond", (getter)time_microsecond},
2985 {"tzinfo", (getter)time_tzinfo},
Tim Peters2a799bf2002-12-16 20:18:38 +00002986 {NULL}
2987};
2988
2989/*
2990 * Constructors.
2991 */
2992
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002993static char *time_kws[] = {"hour", "minute", "second", "microsecond",
Tim Peters37f39822003-01-10 03:49:02 +00002994 "tzinfo", NULL};
Tim Peters12bf3392002-12-24 05:41:27 +00002995
Tim Peters2a799bf2002-12-16 20:18:38 +00002996static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00002997time_new(PyTypeObject *type, PyObject *args, PyObject *kw)
Tim Peters2a799bf2002-12-16 20:18:38 +00002998{
2999 PyObject *self = NULL;
Tim Peters70533e22003-02-01 04:40:04 +00003000 PyObject *state;
Tim Peters2a799bf2002-12-16 20:18:38 +00003001 int hour = 0;
3002 int minute = 0;
3003 int second = 0;
3004 int usecond = 0;
3005 PyObject *tzinfo = Py_None;
3006
Guido van Rossum177e41a2003-01-30 22:06:23 +00003007 /* Check for invocation from pickle with __getstate__ state */
3008 if (PyTuple_GET_SIZE(args) >= 1 &&
3009 PyTuple_GET_SIZE(args) <= 2 &&
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003010 PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
3011 PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE &&
3012 ((unsigned char) (PyBytes_AS_STRING(state)[0])) < 24)
Guido van Rossum177e41a2003-01-30 22:06:23 +00003013 {
Tim Peters70533e22003-02-01 04:40:04 +00003014 PyDateTime_Time *me;
3015 char aware;
3016
3017 if (PyTuple_GET_SIZE(args) == 2) {
Guido van Rossum177e41a2003-01-30 22:06:23 +00003018 tzinfo = PyTuple_GET_ITEM(args, 1);
Tim Peters70533e22003-02-01 04:40:04 +00003019 if (check_tzinfo_subclass(tzinfo) < 0) {
3020 PyErr_SetString(PyExc_TypeError, "bad "
3021 "tzinfo state arg");
3022 return NULL;
Guido van Rossum177e41a2003-01-30 22:06:23 +00003023 }
3024 }
Tim Peters70533e22003-02-01 04:40:04 +00003025 aware = (char)(tzinfo != Py_None);
Tim Peters604c0132004-06-07 23:04:33 +00003026 me = (PyDateTime_Time *) (type->tp_alloc(type, aware));
Tim Peters70533e22003-02-01 04:40:04 +00003027 if (me != NULL) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003028 char *pdata = PyBytes_AS_STRING(state);
Tim Peters70533e22003-02-01 04:40:04 +00003029
3030 memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE);
3031 me->hashcode = -1;
3032 me->hastzinfo = aware;
3033 if (aware) {
3034 Py_INCREF(tzinfo);
3035 me->tzinfo = tzinfo;
3036 }
3037 }
3038 return (PyObject *)me;
Guido van Rossum177e41a2003-01-30 22:06:23 +00003039 }
3040
Tim Peters37f39822003-01-10 03:49:02 +00003041 if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO", time_kws,
Tim Peters2a799bf2002-12-16 20:18:38 +00003042 &hour, &minute, &second, &usecond,
3043 &tzinfo)) {
3044 if (check_time_args(hour, minute, second, usecond) < 0)
3045 return NULL;
3046 if (check_tzinfo_subclass(tzinfo) < 0)
3047 return NULL;
Tim Petersa98924a2003-05-17 05:55:19 +00003048 self = new_time_ex(hour, minute, second, usecond, tzinfo,
3049 type);
Tim Peters2a799bf2002-12-16 20:18:38 +00003050 }
3051 return self;
3052}
3053
3054/*
3055 * Destructor.
3056 */
3057
3058static void
Tim Peters37f39822003-01-10 03:49:02 +00003059time_dealloc(PyDateTime_Time *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00003060{
Tim Petersa032d2e2003-01-11 00:15:54 +00003061 if (HASTZINFO(self)) {
Tim Peters37f39822003-01-10 03:49:02 +00003062 Py_XDECREF(self->tzinfo);
Neal Norwitz8e914d92003-01-10 15:29:16 +00003063 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003064 Py_Type(self)->tp_free((PyObject *)self);
Tim Peters2a799bf2002-12-16 20:18:38 +00003065}
3066
3067/*
Tim Peters855fe882002-12-22 03:43:39 +00003068 * Indirect access to tzinfo methods.
Tim Peters2a799bf2002-12-16 20:18:38 +00003069 */
3070
Tim Peters2a799bf2002-12-16 20:18:38 +00003071/* These are all METH_NOARGS, so don't need to check the arglist. */
3072static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00003073time_utcoffset(PyDateTime_Time *self, PyObject *unused) {
Tim Petersa032d2e2003-01-11 00:15:54 +00003074 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,
Tim Peters37f39822003-01-10 03:49:02 +00003075 "utcoffset", Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00003076}
3077
3078static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00003079time_dst(PyDateTime_Time *self, PyObject *unused) {
Tim Petersa032d2e2003-01-11 00:15:54 +00003080 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,
Tim Peters37f39822003-01-10 03:49:02 +00003081 "dst", Py_None);
Tim Peters855fe882002-12-22 03:43:39 +00003082}
3083
3084static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00003085time_tzname(PyDateTime_Time *self, PyObject *unused) {
Tim Petersa032d2e2003-01-11 00:15:54 +00003086 return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None,
Tim Peters37f39822003-01-10 03:49:02 +00003087 Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00003088}
3089
3090/*
Tim Peters37f39822003-01-10 03:49:02 +00003091 * Various ways to turn a time into a string.
Tim Peters2a799bf2002-12-16 20:18:38 +00003092 */
3093
3094static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00003095time_repr(PyDateTime_Time *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00003096{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003097 const char *type_name = Py_Type(self)->tp_name;
Tim Peters37f39822003-01-10 03:49:02 +00003098 int h = TIME_GET_HOUR(self);
3099 int m = TIME_GET_MINUTE(self);
3100 int s = TIME_GET_SECOND(self);
3101 int us = TIME_GET_MICROSECOND(self);
3102 PyObject *result = NULL;
Tim Peters2a799bf2002-12-16 20:18:38 +00003103
Tim Peters37f39822003-01-10 03:49:02 +00003104 if (us)
Walter Dörwald7569dfe2007-05-19 21:49:49 +00003105 result = PyUnicode_FromFormat("%s(%d, %d, %d, %d)",
3106 type_name, h, m, s, us);
Tim Peters37f39822003-01-10 03:49:02 +00003107 else if (s)
Walter Dörwald7569dfe2007-05-19 21:49:49 +00003108 result = PyUnicode_FromFormat("%s(%d, %d, %d)",
3109 type_name, h, m, s);
Tim Peters37f39822003-01-10 03:49:02 +00003110 else
Walter Dörwald7569dfe2007-05-19 21:49:49 +00003111 result = PyUnicode_FromFormat("%s(%d, %d)", type_name, h, m);
Tim Petersa032d2e2003-01-11 00:15:54 +00003112 if (result != NULL && HASTZINFO(self))
Tim Peters37f39822003-01-10 03:49:02 +00003113 result = append_keyword_tzinfo(result, self->tzinfo);
3114 return result;
Tim Peters2a799bf2002-12-16 20:18:38 +00003115}
3116
Tim Peters37f39822003-01-10 03:49:02 +00003117static PyObject *
3118time_str(PyDateTime_Time *self)
3119{
3120 return PyObject_CallMethod((PyObject *)self, "isoformat", "()");
3121}
Tim Peters2a799bf2002-12-16 20:18:38 +00003122
3123static PyObject *
Thomas Wouterscf297e42007-02-23 15:07:44 +00003124time_isoformat(PyDateTime_Time *self, PyObject *unused)
Tim Peters2a799bf2002-12-16 20:18:38 +00003125{
3126 char buf[100];
Tim Peters37f39822003-01-10 03:49:02 +00003127 PyObject *result;
Walter Dörwaldbafa1372007-05-31 17:50:48 +00003128 int us = TIME_GET_MICROSECOND(self);;
Tim Peters2a799bf2002-12-16 20:18:38 +00003129
Walter Dörwaldbafa1372007-05-31 17:50:48 +00003130 if (us)
3131 result = PyUnicode_FromFormat("%02d:%02d:%02d.%06d",
3132 TIME_GET_HOUR(self),
3133 TIME_GET_MINUTE(self),
3134 TIME_GET_SECOND(self),
3135 us);
3136 else
3137 result = PyUnicode_FromFormat("%02d:%02d:%02d",
3138 TIME_GET_HOUR(self),
3139 TIME_GET_MINUTE(self),
3140 TIME_GET_SECOND(self));
Tim Peters37f39822003-01-10 03:49:02 +00003141
Tim Petersa032d2e2003-01-11 00:15:54 +00003142 if (result == NULL || ! HASTZINFO(self) || self->tzinfo == Py_None)
Tim Peters2a799bf2002-12-16 20:18:38 +00003143 return result;
3144
3145 /* We need to append the UTC offset. */
3146 if (format_utcoffset(buf, sizeof(buf), ":", self->tzinfo,
Tim Petersbad8ff02002-12-30 20:52:32 +00003147 Py_None) < 0) {
Tim Peters2a799bf2002-12-16 20:18:38 +00003148 Py_DECREF(result);
3149 return NULL;
3150 }
Walter Dörwaldbafa1372007-05-31 17:50:48 +00003151 PyUnicode_AppendAndDel(&result, PyUnicode_FromString(buf));
Tim Peters2a799bf2002-12-16 20:18:38 +00003152 return result;
3153}
3154
Tim Peters37f39822003-01-10 03:49:02 +00003155static PyObject *
3156time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
3157{
3158 PyObject *result;
3159 PyObject *format;
3160 PyObject *tuple;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00003161 static char *keywords[] = {"format", NULL};
Tim Peters37f39822003-01-10 03:49:02 +00003162
Guido van Rossumbce56a62007-05-10 18:04:33 +00003163 if (! PyArg_ParseTupleAndKeywords(args, kw, "S:strftime", keywords,
3164 &format))
Tim Peters37f39822003-01-10 03:49:02 +00003165 return NULL;
3166
3167 /* Python's strftime does insane things with the year part of the
3168 * timetuple. The year is forced to (the otherwise nonsensical)
3169 * 1900 to worm around that.
3170 */
3171 tuple = Py_BuildValue("iiiiiiiii",
Brett Cannond1080a32004-03-02 04:38:10 +00003172 1900, 1, 1, /* year, month, day */
Tim Peters37f39822003-01-10 03:49:02 +00003173 TIME_GET_HOUR(self),
3174 TIME_GET_MINUTE(self),
3175 TIME_GET_SECOND(self),
Brett Cannond1080a32004-03-02 04:38:10 +00003176 0, 1, -1); /* weekday, daynum, dst */
Tim Peters37f39822003-01-10 03:49:02 +00003177 if (tuple == NULL)
3178 return NULL;
3179 assert(PyTuple_Size(tuple) == 9);
3180 result = wrap_strftime((PyObject *)self, format, tuple, Py_None);
3181 Py_DECREF(tuple);
3182 return result;
3183}
Tim Peters2a799bf2002-12-16 20:18:38 +00003184
3185/*
3186 * Miscellaneous methods.
3187 */
3188
Tim Peters37f39822003-01-10 03:49:02 +00003189static PyObject *
Guido van Rossum19960592006-08-24 17:29:38 +00003190time_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters37f39822003-01-10 03:49:02 +00003191{
3192 int diff;
3193 naivety n1, n2;
3194 int offset1, offset2;
3195
3196 if (! PyTime_Check(other)) {
Guido van Rossum19960592006-08-24 17:29:38 +00003197 Py_INCREF(Py_NotImplemented);
3198 return Py_NotImplemented;
Tim Peters37f39822003-01-10 03:49:02 +00003199 }
Guido van Rossum19960592006-08-24 17:29:38 +00003200 if (classify_two_utcoffsets(self, &offset1, &n1, Py_None,
3201 other, &offset2, &n2, Py_None) < 0)
Tim Peters37f39822003-01-10 03:49:02 +00003202 return NULL;
3203 assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN);
3204 /* If they're both naive, or both aware and have the same offsets,
3205 * we get off cheap. Note that if they're both naive, offset1 ==
3206 * offset2 == 0 at this point.
3207 */
3208 if (n1 == n2 && offset1 == offset2) {
Guido van Rossum19960592006-08-24 17:29:38 +00003209 diff = memcmp(((PyDateTime_Time *)self)->data,
3210 ((PyDateTime_Time *)other)->data,
Tim Peters37f39822003-01-10 03:49:02 +00003211 _PyDateTime_TIME_DATASIZE);
3212 return diff_to_bool(diff, op);
3213 }
3214
3215 if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) {
3216 assert(offset1 != offset2); /* else last "if" handled it */
3217 /* Convert everything except microseconds to seconds. These
3218 * can't overflow (no more than the # of seconds in 2 days).
3219 */
3220 offset1 = TIME_GET_HOUR(self) * 3600 +
3221 (TIME_GET_MINUTE(self) - offset1) * 60 +
3222 TIME_GET_SECOND(self);
3223 offset2 = TIME_GET_HOUR(other) * 3600 +
3224 (TIME_GET_MINUTE(other) - offset2) * 60 +
3225 TIME_GET_SECOND(other);
3226 diff = offset1 - offset2;
3227 if (diff == 0)
3228 diff = TIME_GET_MICROSECOND(self) -
3229 TIME_GET_MICROSECOND(other);
3230 return diff_to_bool(diff, op);
3231 }
3232
3233 assert(n1 != n2);
3234 PyErr_SetString(PyExc_TypeError,
3235 "can't compare offset-naive and "
3236 "offset-aware times");
3237 return NULL;
3238}
3239
3240static long
3241time_hash(PyDateTime_Time *self)
3242{
3243 if (self->hashcode == -1) {
3244 naivety n;
3245 int offset;
3246 PyObject *temp;
3247
3248 n = classify_utcoffset((PyObject *)self, Py_None, &offset);
3249 assert(n != OFFSET_UNKNOWN);
3250 if (n == OFFSET_ERROR)
3251 return -1;
3252
3253 /* Reduce this to a hash of another object. */
3254 if (offset == 0)
3255 temp = PyString_FromStringAndSize((char *)self->data,
3256 _PyDateTime_TIME_DATASIZE);
3257 else {
3258 int hour;
3259 int minute;
3260
3261 assert(n == OFFSET_AWARE);
Tim Petersa032d2e2003-01-11 00:15:54 +00003262 assert(HASTZINFO(self));
Tim Peters37f39822003-01-10 03:49:02 +00003263 hour = divmod(TIME_GET_HOUR(self) * 60 +
3264 TIME_GET_MINUTE(self) - offset,
3265 60,
3266 &minute);
3267 if (0 <= hour && hour < 24)
3268 temp = new_time(hour, minute,
3269 TIME_GET_SECOND(self),
3270 TIME_GET_MICROSECOND(self),
3271 Py_None);
3272 else
3273 temp = Py_BuildValue("iiii",
3274 hour, minute,
3275 TIME_GET_SECOND(self),
3276 TIME_GET_MICROSECOND(self));
3277 }
3278 if (temp != NULL) {
3279 self->hashcode = PyObject_Hash(temp);
3280 Py_DECREF(temp);
3281 }
3282 }
3283 return self->hashcode;
3284}
Tim Peters2a799bf2002-12-16 20:18:38 +00003285
Tim Peters12bf3392002-12-24 05:41:27 +00003286static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00003287time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw)
Tim Peters12bf3392002-12-24 05:41:27 +00003288{
3289 PyObject *clone;
3290 PyObject *tuple;
3291 int hh = TIME_GET_HOUR(self);
3292 int mm = TIME_GET_MINUTE(self);
3293 int ss = TIME_GET_SECOND(self);
3294 int us = TIME_GET_MICROSECOND(self);
Tim Petersa032d2e2003-01-11 00:15:54 +00003295 PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None;
Tim Peters12bf3392002-12-24 05:41:27 +00003296
3297 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO:replace",
Tim Peters37f39822003-01-10 03:49:02 +00003298 time_kws,
Tim Peters12bf3392002-12-24 05:41:27 +00003299 &hh, &mm, &ss, &us, &tzinfo))
3300 return NULL;
3301 tuple = Py_BuildValue("iiiiO", hh, mm, ss, us, tzinfo);
3302 if (tuple == NULL)
3303 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003304 clone = time_new(Py_Type(self), tuple, NULL);
Tim Peters12bf3392002-12-24 05:41:27 +00003305 Py_DECREF(tuple);
3306 return clone;
3307}
3308
Tim Peters2a799bf2002-12-16 20:18:38 +00003309static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00003310time_bool(PyDateTime_Time *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00003311{
3312 int offset;
3313 int none;
3314
3315 if (TIME_GET_SECOND(self) || TIME_GET_MICROSECOND(self)) {
3316 /* Since utcoffset is in whole minutes, nothing can
3317 * alter the conclusion that this is nonzero.
3318 */
3319 return 1;
3320 }
3321 offset = 0;
Tim Petersa032d2e2003-01-11 00:15:54 +00003322 if (HASTZINFO(self) && self->tzinfo != Py_None) {
Tim Petersbad8ff02002-12-30 20:52:32 +00003323 offset = call_utcoffset(self->tzinfo, Py_None, &none);
Tim Peters2a799bf2002-12-16 20:18:38 +00003324 if (offset == -1 && PyErr_Occurred())
3325 return -1;
3326 }
3327 return (TIME_GET_MINUTE(self) - offset + TIME_GET_HOUR(self)*60) != 0;
3328}
3329
Tim Peters371935f2003-02-01 01:52:50 +00003330/* Pickle support, a simple use of __reduce__. */
Tim Peters2a799bf2002-12-16 20:18:38 +00003331
Tim Peters33e0f382003-01-10 02:05:14 +00003332/* Let basestate be the non-tzinfo data string.
Tim Peters2a799bf2002-12-16 20:18:38 +00003333 * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo).
3334 * So it's a tuple in any (non-error) case.
Tim Petersb57f8f02003-02-01 02:54:15 +00003335 * __getstate__ isn't exposed.
Tim Peters2a799bf2002-12-16 20:18:38 +00003336 */
3337static PyObject *
Tim Peters37f39822003-01-10 03:49:02 +00003338time_getstate(PyDateTime_Time *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00003339{
3340 PyObject *basestate;
3341 PyObject *result = NULL;
3342
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003343 basestate = PyBytes_FromStringAndSize((char *)self->data,
Tim Peters33e0f382003-01-10 02:05:14 +00003344 _PyDateTime_TIME_DATASIZE);
Tim Peters2a799bf2002-12-16 20:18:38 +00003345 if (basestate != NULL) {
Tim Petersa032d2e2003-01-11 00:15:54 +00003346 if (! HASTZINFO(self) || self->tzinfo == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003347 result = PyTuple_Pack(1, basestate);
Tim Peters2a799bf2002-12-16 20:18:38 +00003348 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003349 result = PyTuple_Pack(2, basestate, self->tzinfo);
Tim Peters2a799bf2002-12-16 20:18:38 +00003350 Py_DECREF(basestate);
3351 }
3352 return result;
3353}
3354
3355static PyObject *
Guido van Rossum177e41a2003-01-30 22:06:23 +00003356time_reduce(PyDateTime_Time *self, PyObject *arg)
Tim Peters2a799bf2002-12-16 20:18:38 +00003357{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003358 return Py_BuildValue("(ON)", Py_Type(self), time_getstate(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00003359}
3360
Tim Peters37f39822003-01-10 03:49:02 +00003361static PyMethodDef time_methods[] = {
Guido van Rossum177e41a2003-01-30 22:06:23 +00003362
Thomas Wouterscf297e42007-02-23 15:07:44 +00003363 {"isoformat", (PyCFunction)time_isoformat, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00003364 PyDoc_STR("Return string in ISO 8601 format, HH:MM:SS[.mmmmmm]"
3365 "[+HH:MM].")},
3366
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003367 {"strftime", (PyCFunction)time_strftime, METH_VARARGS | METH_KEYWORDS,
Tim Peters37f39822003-01-10 03:49:02 +00003368 PyDoc_STR("format -> strftime() style string.")},
3369
3370 {"utcoffset", (PyCFunction)time_utcoffset, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00003371 PyDoc_STR("Return self.tzinfo.utcoffset(self).")},
3372
Tim Peters37f39822003-01-10 03:49:02 +00003373 {"tzname", (PyCFunction)time_tzname, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00003374 PyDoc_STR("Return self.tzinfo.tzname(self).")},
3375
Tim Peters37f39822003-01-10 03:49:02 +00003376 {"dst", (PyCFunction)time_dst, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00003377 PyDoc_STR("Return self.tzinfo.dst(self).")},
3378
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003379 {"replace", (PyCFunction)time_replace, METH_VARARGS | METH_KEYWORDS,
Tim Peters37f39822003-01-10 03:49:02 +00003380 PyDoc_STR("Return time with new specified fields.")},
Tim Peters12bf3392002-12-24 05:41:27 +00003381
Guido van Rossum177e41a2003-01-30 22:06:23 +00003382 {"__reduce__", (PyCFunction)time_reduce, METH_NOARGS,
3383 PyDoc_STR("__reduce__() -> (cls, state)")},
3384
Tim Peters2a799bf2002-12-16 20:18:38 +00003385 {NULL, NULL}
Tim Peters2a799bf2002-12-16 20:18:38 +00003386};
3387
Tim Peters37f39822003-01-10 03:49:02 +00003388static char time_doc[] =
Raymond Hettinger3a4231d2004-12-19 20:13:24 +00003389PyDoc_STR("time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\
3390\n\
3391All arguments are optional. tzinfo may be None, or an instance of\n\
3392a tzinfo subclass. The remaining arguments may be ints or longs.\n");
Tim Peters2a799bf2002-12-16 20:18:38 +00003393
Tim Peters37f39822003-01-10 03:49:02 +00003394static PyNumberMethods time_as_number = {
Tim Peters2a799bf2002-12-16 20:18:38 +00003395 0, /* nb_add */
3396 0, /* nb_subtract */
3397 0, /* nb_multiply */
Tim Peters2a799bf2002-12-16 20:18:38 +00003398 0, /* nb_remainder */
3399 0, /* nb_divmod */
3400 0, /* nb_power */
3401 0, /* nb_negative */
3402 0, /* nb_positive */
3403 0, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00003404 (inquiry)time_bool, /* nb_bool */
Tim Peters2a799bf2002-12-16 20:18:38 +00003405};
3406
Neal Norwitz227b5332006-03-22 09:28:35 +00003407static PyTypeObject PyDateTime_TimeType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003408 PyVarObject_HEAD_INIT(NULL, 0)
Tim Peters0bf60bd2003-01-08 20:40:01 +00003409 "datetime.time", /* tp_name */
Tim Peters37f39822003-01-10 03:49:02 +00003410 sizeof(PyDateTime_Time), /* tp_basicsize */
Tim Peters2a799bf2002-12-16 20:18:38 +00003411 0, /* tp_itemsize */
Tim Peters37f39822003-01-10 03:49:02 +00003412 (destructor)time_dealloc, /* tp_dealloc */
Tim Peters2a799bf2002-12-16 20:18:38 +00003413 0, /* tp_print */
3414 0, /* tp_getattr */
3415 0, /* tp_setattr */
3416 0, /* tp_compare */
Tim Peters37f39822003-01-10 03:49:02 +00003417 (reprfunc)time_repr, /* tp_repr */
3418 &time_as_number, /* tp_as_number */
Tim Peters2a799bf2002-12-16 20:18:38 +00003419 0, /* tp_as_sequence */
3420 0, /* tp_as_mapping */
Tim Peters37f39822003-01-10 03:49:02 +00003421 (hashfunc)time_hash, /* tp_hash */
Tim Peters2a799bf2002-12-16 20:18:38 +00003422 0, /* tp_call */
Tim Peters37f39822003-01-10 03:49:02 +00003423 (reprfunc)time_str, /* tp_str */
Tim Peters2a799bf2002-12-16 20:18:38 +00003424 PyObject_GenericGetAttr, /* tp_getattro */
3425 0, /* tp_setattro */
3426 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00003427 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters37f39822003-01-10 03:49:02 +00003428 time_doc, /* tp_doc */
Tim Peters2a799bf2002-12-16 20:18:38 +00003429 0, /* tp_traverse */
3430 0, /* tp_clear */
Guido van Rossum19960592006-08-24 17:29:38 +00003431 time_richcompare, /* tp_richcompare */
Tim Peters2a799bf2002-12-16 20:18:38 +00003432 0, /* tp_weaklistoffset */
3433 0, /* tp_iter */
3434 0, /* tp_iternext */
Tim Peters37f39822003-01-10 03:49:02 +00003435 time_methods, /* tp_methods */
Tim Peters2a799bf2002-12-16 20:18:38 +00003436 0, /* tp_members */
Tim Peters37f39822003-01-10 03:49:02 +00003437 time_getset, /* tp_getset */
3438 0, /* tp_base */
Tim Peters2a799bf2002-12-16 20:18:38 +00003439 0, /* tp_dict */
3440 0, /* tp_descr_get */
3441 0, /* tp_descr_set */
3442 0, /* tp_dictoffset */
3443 0, /* tp_init */
Tim Petersa98924a2003-05-17 05:55:19 +00003444 time_alloc, /* tp_alloc */
Tim Peters37f39822003-01-10 03:49:02 +00003445 time_new, /* tp_new */
Tim Peters4c530132003-05-16 22:44:06 +00003446 0, /* tp_free */
Tim Peters2a799bf2002-12-16 20:18:38 +00003447};
3448
3449/*
Tim Petersa9bc1682003-01-11 03:39:11 +00003450 * PyDateTime_DateTime implementation.
Tim Peters2a799bf2002-12-16 20:18:38 +00003451 */
3452
Tim Petersa9bc1682003-01-11 03:39:11 +00003453/* Accessor properties. Properties for day, month, and year are inherited
3454 * from date.
Tim Peters2a799bf2002-12-16 20:18:38 +00003455 */
3456
3457static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003458datetime_hour(PyDateTime_DateTime *self, void *unused)
Tim Peters2a799bf2002-12-16 20:18:38 +00003459{
Tim Petersa9bc1682003-01-11 03:39:11 +00003460 return PyInt_FromLong(DATE_GET_HOUR(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00003461}
3462
Tim Petersa9bc1682003-01-11 03:39:11 +00003463static PyObject *
3464datetime_minute(PyDateTime_DateTime *self, void *unused)
3465{
3466 return PyInt_FromLong(DATE_GET_MINUTE(self));
3467}
3468
3469static PyObject *
3470datetime_second(PyDateTime_DateTime *self, void *unused)
3471{
3472 return PyInt_FromLong(DATE_GET_SECOND(self));
3473}
3474
3475static PyObject *
3476datetime_microsecond(PyDateTime_DateTime *self, void *unused)
3477{
3478 return PyInt_FromLong(DATE_GET_MICROSECOND(self));
3479}
3480
3481static PyObject *
3482datetime_tzinfo(PyDateTime_DateTime *self, void *unused)
3483{
3484 PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;
3485 Py_INCREF(result);
3486 return result;
3487}
3488
3489static PyGetSetDef datetime_getset[] = {
3490 {"hour", (getter)datetime_hour},
3491 {"minute", (getter)datetime_minute},
3492 {"second", (getter)datetime_second},
3493 {"microsecond", (getter)datetime_microsecond},
3494 {"tzinfo", (getter)datetime_tzinfo},
Tim Peters2a799bf2002-12-16 20:18:38 +00003495 {NULL}
3496};
3497
3498/*
3499 * Constructors.
Tim Peters2a799bf2002-12-16 20:18:38 +00003500 */
3501
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00003502static char *datetime_kws[] = {
Tim Peters12bf3392002-12-24 05:41:27 +00003503 "year", "month", "day", "hour", "minute", "second",
3504 "microsecond", "tzinfo", NULL
3505};
3506
Tim Peters2a799bf2002-12-16 20:18:38 +00003507static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003508datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw)
Tim Peters2a799bf2002-12-16 20:18:38 +00003509{
3510 PyObject *self = NULL;
Tim Peters70533e22003-02-01 04:40:04 +00003511 PyObject *state;
Tim Peters2a799bf2002-12-16 20:18:38 +00003512 int year;
3513 int month;
3514 int day;
3515 int hour = 0;
3516 int minute = 0;
3517 int second = 0;
3518 int usecond = 0;
3519 PyObject *tzinfo = Py_None;
3520
Guido van Rossum177e41a2003-01-30 22:06:23 +00003521 /* Check for invocation from pickle with __getstate__ state */
3522 if (PyTuple_GET_SIZE(args) >= 1 &&
3523 PyTuple_GET_SIZE(args) <= 2 &&
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003524 PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) &&
3525 PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE &&
3526 MONTH_IS_SANE(PyBytes_AS_STRING(state)[2]))
Guido van Rossum177e41a2003-01-30 22:06:23 +00003527 {
Tim Peters70533e22003-02-01 04:40:04 +00003528 PyDateTime_DateTime *me;
3529 char aware;
3530
3531 if (PyTuple_GET_SIZE(args) == 2) {
Guido van Rossum177e41a2003-01-30 22:06:23 +00003532 tzinfo = PyTuple_GET_ITEM(args, 1);
Tim Peters70533e22003-02-01 04:40:04 +00003533 if (check_tzinfo_subclass(tzinfo) < 0) {
3534 PyErr_SetString(PyExc_TypeError, "bad "
3535 "tzinfo state arg");
3536 return NULL;
Guido van Rossum177e41a2003-01-30 22:06:23 +00003537 }
3538 }
Tim Peters70533e22003-02-01 04:40:04 +00003539 aware = (char)(tzinfo != Py_None);
Tim Peters604c0132004-06-07 23:04:33 +00003540 me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware));
Tim Peters70533e22003-02-01 04:40:04 +00003541 if (me != NULL) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003542 char *pdata = PyBytes_AS_STRING(state);
Tim Peters70533e22003-02-01 04:40:04 +00003543
3544 memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE);
3545 me->hashcode = -1;
3546 me->hastzinfo = aware;
3547 if (aware) {
3548 Py_INCREF(tzinfo);
3549 me->tzinfo = tzinfo;
3550 }
3551 }
3552 return (PyObject *)me;
Guido van Rossum177e41a2003-01-30 22:06:23 +00003553 }
3554
Tim Petersa9bc1682003-01-11 03:39:11 +00003555 if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO", datetime_kws,
Tim Peters2a799bf2002-12-16 20:18:38 +00003556 &year, &month, &day, &hour, &minute,
3557 &second, &usecond, &tzinfo)) {
3558 if (check_date_args(year, month, day) < 0)
3559 return NULL;
3560 if (check_time_args(hour, minute, second, usecond) < 0)
3561 return NULL;
3562 if (check_tzinfo_subclass(tzinfo) < 0)
3563 return NULL;
Tim Petersa98924a2003-05-17 05:55:19 +00003564 self = new_datetime_ex(year, month, day,
3565 hour, minute, second, usecond,
3566 tzinfo, type);
Tim Peters2a799bf2002-12-16 20:18:38 +00003567 }
3568 return self;
3569}
3570
Tim Petersa9bc1682003-01-11 03:39:11 +00003571/* TM_FUNC is the shared type of localtime() and gmtime(). */
3572typedef struct tm *(*TM_FUNC)(const time_t *timer);
3573
3574/* Internal helper.
3575 * Build datetime from a time_t and a distinct count of microseconds.
3576 * Pass localtime or gmtime for f, to control the interpretation of timet.
3577 */
3578static PyObject *
3579datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,
3580 PyObject *tzinfo)
3581{
3582 struct tm *tm;
3583 PyObject *result = NULL;
3584
3585 tm = f(&timet);
3586 if (tm) {
3587 /* The platform localtime/gmtime may insert leap seconds,
3588 * indicated by tm->tm_sec > 59. We don't care about them,
3589 * except to the extent that passing them on to the datetime
3590 * constructor would raise ValueError for a reason that
3591 * made no sense to the user.
3592 */
3593 if (tm->tm_sec > 59)
3594 tm->tm_sec = 59;
3595 result = PyObject_CallFunction(cls, "iiiiiiiO",
3596 tm->tm_year + 1900,
3597 tm->tm_mon + 1,
3598 tm->tm_mday,
3599 tm->tm_hour,
3600 tm->tm_min,
3601 tm->tm_sec,
3602 us,
3603 tzinfo);
3604 }
3605 else
3606 PyErr_SetString(PyExc_ValueError,
3607 "timestamp out of range for "
3608 "platform localtime()/gmtime() function");
3609 return result;
3610}
3611
3612/* Internal helper.
3613 * Build datetime from a Python timestamp. Pass localtime or gmtime for f,
3614 * to control the interpretation of the timestamp. Since a double doesn't
3615 * have enough bits to cover a datetime's full range of precision, it's
3616 * better to call datetime_from_timet_and_us provided you have a way
3617 * to get that much precision (e.g., C time() isn't good enough).
3618 */
3619static PyObject *
3620datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp,
3621 PyObject *tzinfo)
3622{
Tim Peters1b6f7a92004-06-20 02:50:16 +00003623 time_t timet;
3624 double fraction;
3625 int us;
Tim Petersa9bc1682003-01-11 03:39:11 +00003626
Tim Peters1b6f7a92004-06-20 02:50:16 +00003627 timet = _PyTime_DoubleToTimet(timestamp);
3628 if (timet == (time_t)-1 && PyErr_Occurred())
3629 return NULL;
3630 fraction = timestamp - (double)timet;
3631 us = (int)round_to_long(fraction * 1e6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003632 if (us < 0) {
3633 /* Truncation towards zero is not what we wanted
3634 for negative numbers (Python's mod semantics) */
3635 timet -= 1;
3636 us += 1000000;
3637 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003638 /* If timestamp is less than one microsecond smaller than a
3639 * full second, round up. Otherwise, ValueErrors are raised
3640 * for some floats. */
3641 if (us == 1000000) {
3642 timet += 1;
3643 us = 0;
3644 }
Tim Petersa9bc1682003-01-11 03:39:11 +00003645 return datetime_from_timet_and_us(cls, f, timet, us, tzinfo);
3646}
3647
3648/* Internal helper.
3649 * Build most accurate possible datetime for current time. Pass localtime or
3650 * gmtime for f as appropriate.
3651 */
3652static PyObject *
3653datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo)
3654{
3655#ifdef HAVE_GETTIMEOFDAY
3656 struct timeval t;
3657
3658#ifdef GETTIMEOFDAY_NO_TZ
3659 gettimeofday(&t);
3660#else
3661 gettimeofday(&t, (struct timezone *)NULL);
3662#endif
3663 return datetime_from_timet_and_us(cls, f, t.tv_sec, (int)t.tv_usec,
3664 tzinfo);
3665
3666#else /* ! HAVE_GETTIMEOFDAY */
3667 /* No flavor of gettimeofday exists on this platform. Python's
3668 * time.time() does a lot of other platform tricks to get the
3669 * best time it can on the platform, and we're not going to do
3670 * better than that (if we could, the better code would belong
3671 * in time.time()!) We're limited by the precision of a double,
3672 * though.
3673 */
3674 PyObject *time;
3675 double dtime;
3676
3677 time = time_time();
3678 if (time == NULL)
3679 return NULL;
3680 dtime = PyFloat_AsDouble(time);
3681 Py_DECREF(time);
3682 if (dtime == -1.0 && PyErr_Occurred())
3683 return NULL;
3684 return datetime_from_timestamp(cls, f, dtime, tzinfo);
3685#endif /* ! HAVE_GETTIMEOFDAY */
3686}
3687
Tim Peters2a799bf2002-12-16 20:18:38 +00003688/* Return best possible local time -- this isn't constrained by the
3689 * precision of a timestamp.
3690 */
3691static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003692datetime_now(PyObject *cls, PyObject *args, PyObject *kw)
Tim Peters2a799bf2002-12-16 20:18:38 +00003693{
Tim Peters10cadce2003-01-23 19:58:02 +00003694 PyObject *self;
Tim Peters2a799bf2002-12-16 20:18:38 +00003695 PyObject *tzinfo = Py_None;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00003696 static char *keywords[] = {"tz", NULL};
Tim Peters2a799bf2002-12-16 20:18:38 +00003697
Tim Peters10cadce2003-01-23 19:58:02 +00003698 if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:now", keywords,
3699 &tzinfo))
3700 return NULL;
3701 if (check_tzinfo_subclass(tzinfo) < 0)
3702 return NULL;
3703
3704 self = datetime_best_possible(cls,
3705 tzinfo == Py_None ? localtime : gmtime,
3706 tzinfo);
3707 if (self != NULL && tzinfo != Py_None) {
3708 /* Convert UTC to tzinfo's zone. */
3709 PyObject *temp = self;
Tim Peters2a44a8d2003-01-23 20:53:10 +00003710 self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);
Tim Peters10cadce2003-01-23 19:58:02 +00003711 Py_DECREF(temp);
Tim Peters2a799bf2002-12-16 20:18:38 +00003712 }
3713 return self;
3714}
3715
Tim Petersa9bc1682003-01-11 03:39:11 +00003716/* Return best possible UTC time -- this isn't constrained by the
3717 * precision of a timestamp.
3718 */
3719static PyObject *
3720datetime_utcnow(PyObject *cls, PyObject *dummy)
3721{
3722 return datetime_best_possible(cls, gmtime, Py_None);
3723}
3724
Tim Peters2a799bf2002-12-16 20:18:38 +00003725/* Return new local datetime from timestamp (Python timestamp -- a double). */
3726static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003727datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)
Tim Peters2a799bf2002-12-16 20:18:38 +00003728{
Tim Peters2a44a8d2003-01-23 20:53:10 +00003729 PyObject *self;
Tim Peters2a799bf2002-12-16 20:18:38 +00003730 double timestamp;
3731 PyObject *tzinfo = Py_None;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00003732 static char *keywords[] = {"timestamp", "tz", NULL};
Tim Peters2a799bf2002-12-16 20:18:38 +00003733
Tim Peters2a44a8d2003-01-23 20:53:10 +00003734 if (! PyArg_ParseTupleAndKeywords(args, kw, "d|O:fromtimestamp",
3735 keywords, &timestamp, &tzinfo))
3736 return NULL;
3737 if (check_tzinfo_subclass(tzinfo) < 0)
3738 return NULL;
3739
3740 self = datetime_from_timestamp(cls,
3741 tzinfo == Py_None ? localtime : gmtime,
3742 timestamp,
3743 tzinfo);
3744 if (self != NULL && tzinfo != Py_None) {
3745 /* Convert UTC to tzinfo's zone. */
3746 PyObject *temp = self;
3747 self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);
3748 Py_DECREF(temp);
Tim Peters2a799bf2002-12-16 20:18:38 +00003749 }
3750 return self;
3751}
3752
Tim Petersa9bc1682003-01-11 03:39:11 +00003753/* Return new UTC datetime from timestamp (Python timestamp -- a double). */
3754static PyObject *
3755datetime_utcfromtimestamp(PyObject *cls, PyObject *args)
3756{
3757 double timestamp;
3758 PyObject *result = NULL;
Tim Peters2a799bf2002-12-16 20:18:38 +00003759
Tim Petersa9bc1682003-01-11 03:39:11 +00003760 if (PyArg_ParseTuple(args, "d:utcfromtimestamp", &timestamp))
3761 result = datetime_from_timestamp(cls, gmtime, timestamp,
3762 Py_None);
3763 return result;
3764}
3765
Skip Montanaro0af3ade2005-01-13 04:12:31 +00003766/* Return new datetime from time.strptime(). */
3767static PyObject *
3768datetime_strptime(PyObject *cls, PyObject *args)
3769{
3770 PyObject *result = NULL, *obj, *module;
3771 const char *string, *format;
3772
3773 if (!PyArg_ParseTuple(args, "ss:strptime", &string, &format))
3774 return NULL;
3775
3776 if ((module = PyImport_ImportModule("time")) == NULL)
3777 return NULL;
3778 obj = PyObject_CallMethod(module, "strptime", "ss", string, format);
3779 Py_DECREF(module);
3780
3781 if (obj != NULL) {
3782 int i, good_timetuple = 1;
3783 long int ia[6];
3784 if (PySequence_Check(obj) && PySequence_Size(obj) >= 6)
3785 for (i=0; i < 6; i++) {
3786 PyObject *p = PySequence_GetItem(obj, i);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003787 if (p == NULL) {
3788 Py_DECREF(obj);
3789 return NULL;
3790 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00003791 if (PyInt_CheckExact(p))
Skip Montanaro0af3ade2005-01-13 04:12:31 +00003792 ia[i] = PyInt_AsLong(p);
3793 else
3794 good_timetuple = 0;
3795 Py_DECREF(p);
3796 }
3797 else
3798 good_timetuple = 0;
3799 if (good_timetuple)
3800 result = PyObject_CallFunction(cls, "iiiiii",
3801 ia[0], ia[1], ia[2], ia[3], ia[4], ia[5]);
3802 else
3803 PyErr_SetString(PyExc_ValueError,
3804 "unexpected value from time.strptime");
3805 Py_DECREF(obj);
3806 }
3807 return result;
3808}
3809
Tim Petersa9bc1682003-01-11 03:39:11 +00003810/* Return new datetime from date/datetime and time arguments. */
3811static PyObject *
3812datetime_combine(PyObject *cls, PyObject *args, PyObject *kw)
3813{
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00003814 static char *keywords[] = {"date", "time", NULL};
Tim Petersa9bc1682003-01-11 03:39:11 +00003815 PyObject *date;
3816 PyObject *time;
3817 PyObject *result = NULL;
3818
3819 if (PyArg_ParseTupleAndKeywords(args, kw, "O!O!:combine", keywords,
3820 &PyDateTime_DateType, &date,
3821 &PyDateTime_TimeType, &time)) {
3822 PyObject *tzinfo = Py_None;
3823
3824 if (HASTZINFO(time))
3825 tzinfo = ((PyDateTime_Time *)time)->tzinfo;
3826 result = PyObject_CallFunction(cls, "iiiiiiiO",
3827 GET_YEAR(date),
3828 GET_MONTH(date),
3829 GET_DAY(date),
3830 TIME_GET_HOUR(time),
3831 TIME_GET_MINUTE(time),
3832 TIME_GET_SECOND(time),
3833 TIME_GET_MICROSECOND(time),
3834 tzinfo);
3835 }
3836 return result;
3837}
Tim Peters2a799bf2002-12-16 20:18:38 +00003838
3839/*
3840 * Destructor.
3841 */
3842
3843static void
Tim Petersa9bc1682003-01-11 03:39:11 +00003844datetime_dealloc(PyDateTime_DateTime *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00003845{
Tim Petersa9bc1682003-01-11 03:39:11 +00003846 if (HASTZINFO(self)) {
3847 Py_XDECREF(self->tzinfo);
3848 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003849 Py_Type(self)->tp_free((PyObject *)self);
Tim Peters2a799bf2002-12-16 20:18:38 +00003850}
3851
3852/*
3853 * Indirect access to tzinfo methods.
3854 */
3855
Tim Peters2a799bf2002-12-16 20:18:38 +00003856/* These are all METH_NOARGS, so don't need to check the arglist. */
3857static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003858datetime_utcoffset(PyDateTime_DateTime *self, PyObject *unused) {
3859 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,
3860 "utcoffset", (PyObject *)self);
Tim Peters2a799bf2002-12-16 20:18:38 +00003861}
3862
3863static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003864datetime_dst(PyDateTime_DateTime *self, PyObject *unused) {
3865 return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,
3866 "dst", (PyObject *)self);
Tim Peters855fe882002-12-22 03:43:39 +00003867}
3868
3869static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003870datetime_tzname(PyDateTime_DateTime *self, PyObject *unused) {
3871 return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None,
3872 (PyObject *)self);
Tim Peters2a799bf2002-12-16 20:18:38 +00003873}
3874
3875/*
Tim Petersa9bc1682003-01-11 03:39:11 +00003876 * datetime arithmetic.
Tim Peters2a799bf2002-12-16 20:18:38 +00003877 */
3878
Tim Petersa9bc1682003-01-11 03:39:11 +00003879/* factor must be 1 (to add) or -1 (to subtract). The result inherits
3880 * the tzinfo state of date.
Tim Peters2a799bf2002-12-16 20:18:38 +00003881 */
3882static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003883add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta,
3884 int factor)
Tim Peters2a799bf2002-12-16 20:18:38 +00003885{
Tim Petersa9bc1682003-01-11 03:39:11 +00003886 /* Note that the C-level additions can't overflow, because of
3887 * invariant bounds on the member values.
3888 */
3889 int year = GET_YEAR(date);
3890 int month = GET_MONTH(date);
3891 int day = GET_DAY(date) + GET_TD_DAYS(delta) * factor;
3892 int hour = DATE_GET_HOUR(date);
3893 int minute = DATE_GET_MINUTE(date);
3894 int second = DATE_GET_SECOND(date) + GET_TD_SECONDS(delta) * factor;
3895 int microsecond = DATE_GET_MICROSECOND(date) +
3896 GET_TD_MICROSECONDS(delta) * factor;
Tim Peters2a799bf2002-12-16 20:18:38 +00003897
Tim Petersa9bc1682003-01-11 03:39:11 +00003898 assert(factor == 1 || factor == -1);
3899 if (normalize_datetime(&year, &month, &day,
3900 &hour, &minute, &second, &microsecond) < 0)
3901 return NULL;
3902 else
3903 return new_datetime(year, month, day,
3904 hour, minute, second, microsecond,
3905 HASTZINFO(date) ? date->tzinfo : Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00003906}
3907
3908static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003909datetime_add(PyObject *left, PyObject *right)
Tim Peters2a799bf2002-12-16 20:18:38 +00003910{
Tim Petersa9bc1682003-01-11 03:39:11 +00003911 if (PyDateTime_Check(left)) {
3912 /* datetime + ??? */
3913 if (PyDelta_Check(right))
3914 /* datetime + delta */
3915 return add_datetime_timedelta(
3916 (PyDateTime_DateTime *)left,
3917 (PyDateTime_Delta *)right,
3918 1);
3919 }
3920 else if (PyDelta_Check(left)) {
3921 /* delta + datetime */
3922 return add_datetime_timedelta((PyDateTime_DateTime *) right,
3923 (PyDateTime_Delta *) left,
3924 1);
3925 }
3926 Py_INCREF(Py_NotImplemented);
3927 return Py_NotImplemented;
Tim Peters2a799bf2002-12-16 20:18:38 +00003928}
3929
3930static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003931datetime_subtract(PyObject *left, PyObject *right)
Tim Peters2a799bf2002-12-16 20:18:38 +00003932{
3933 PyObject *result = Py_NotImplemented;
3934
3935 if (PyDateTime_Check(left)) {
3936 /* datetime - ??? */
3937 if (PyDateTime_Check(right)) {
3938 /* datetime - datetime */
3939 naivety n1, n2;
3940 int offset1, offset2;
Tim Petersa9bc1682003-01-11 03:39:11 +00003941 int delta_d, delta_s, delta_us;
Tim Peters2a799bf2002-12-16 20:18:38 +00003942
Tim Peterse39a80c2002-12-30 21:28:52 +00003943 if (classify_two_utcoffsets(left, &offset1, &n1, left,
3944 right, &offset2, &n2,
3945 right) < 0)
Tim Peters00237032002-12-27 02:21:51 +00003946 return NULL;
Tim Peters8702d5f2002-12-27 02:26:16 +00003947 assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN);
Tim Peters2a799bf2002-12-16 20:18:38 +00003948 if (n1 != n2) {
3949 PyErr_SetString(PyExc_TypeError,
3950 "can't subtract offset-naive and "
3951 "offset-aware datetimes");
3952 return NULL;
3953 }
Tim Petersa9bc1682003-01-11 03:39:11 +00003954 delta_d = ymd_to_ord(GET_YEAR(left),
3955 GET_MONTH(left),
3956 GET_DAY(left)) -
3957 ymd_to_ord(GET_YEAR(right),
3958 GET_MONTH(right),
3959 GET_DAY(right));
3960 /* These can't overflow, since the values are
3961 * normalized. At most this gives the number of
3962 * seconds in one day.
3963 */
3964 delta_s = (DATE_GET_HOUR(left) -
3965 DATE_GET_HOUR(right)) * 3600 +
3966 (DATE_GET_MINUTE(left) -
3967 DATE_GET_MINUTE(right)) * 60 +
3968 (DATE_GET_SECOND(left) -
3969 DATE_GET_SECOND(right));
3970 delta_us = DATE_GET_MICROSECOND(left) -
3971 DATE_GET_MICROSECOND(right);
Tim Peters2a799bf2002-12-16 20:18:38 +00003972 /* (left - offset1) - (right - offset2) =
3973 * (left - right) + (offset2 - offset1)
3974 */
Tim Petersa9bc1682003-01-11 03:39:11 +00003975 delta_s += (offset2 - offset1) * 60;
3976 result = new_delta(delta_d, delta_s, delta_us, 1);
Tim Peters2a799bf2002-12-16 20:18:38 +00003977 }
3978 else if (PyDelta_Check(right)) {
Tim Petersa9bc1682003-01-11 03:39:11 +00003979 /* datetime - delta */
3980 result = add_datetime_timedelta(
Tim Peters2a799bf2002-12-16 20:18:38 +00003981 (PyDateTime_DateTime *)left,
Tim Petersa9bc1682003-01-11 03:39:11 +00003982 (PyDateTime_Delta *)right,
3983 -1);
Tim Peters2a799bf2002-12-16 20:18:38 +00003984 }
3985 }
3986
3987 if (result == Py_NotImplemented)
3988 Py_INCREF(result);
3989 return result;
3990}
3991
3992/* Various ways to turn a datetime into a string. */
3993
3994static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00003995datetime_repr(PyDateTime_DateTime *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00003996{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003997 const char *type_name = Py_Type(self)->tp_name;
Tim Petersa9bc1682003-01-11 03:39:11 +00003998 PyObject *baserepr;
Tim Peters2a799bf2002-12-16 20:18:38 +00003999
Tim Petersa9bc1682003-01-11 03:39:11 +00004000 if (DATE_GET_MICROSECOND(self)) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00004001 baserepr = PyUnicode_FromFormat(
Tim Petersa9bc1682003-01-11 03:39:11 +00004002 "%s(%d, %d, %d, %d, %d, %d, %d)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004003 type_name,
Tim Petersa9bc1682003-01-11 03:39:11 +00004004 GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
4005 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
4006 DATE_GET_SECOND(self),
4007 DATE_GET_MICROSECOND(self));
4008 }
4009 else if (DATE_GET_SECOND(self)) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00004010 baserepr = PyUnicode_FromFormat(
Tim Petersa9bc1682003-01-11 03:39:11 +00004011 "%s(%d, %d, %d, %d, %d, %d)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004012 type_name,
Tim Petersa9bc1682003-01-11 03:39:11 +00004013 GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
4014 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
4015 DATE_GET_SECOND(self));
4016 }
4017 else {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00004018 baserepr = PyUnicode_FromFormat(
Tim Petersa9bc1682003-01-11 03:39:11 +00004019 "%s(%d, %d, %d, %d, %d)",
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004020 type_name,
Tim Petersa9bc1682003-01-11 03:39:11 +00004021 GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
4022 DATE_GET_HOUR(self), DATE_GET_MINUTE(self));
4023 }
Tim Petersa9bc1682003-01-11 03:39:11 +00004024 if (baserepr == NULL || ! HASTZINFO(self))
4025 return baserepr;
Tim Peters2a799bf2002-12-16 20:18:38 +00004026 return append_keyword_tzinfo(baserepr, self->tzinfo);
4027}
4028
Tim Petersa9bc1682003-01-11 03:39:11 +00004029static PyObject *
4030datetime_str(PyDateTime_DateTime *self)
4031{
4032 return PyObject_CallMethod((PyObject *)self, "isoformat", "(s)", " ");
4033}
Tim Peters2a799bf2002-12-16 20:18:38 +00004034
4035static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00004036datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
Tim Peters2a799bf2002-12-16 20:18:38 +00004037{
Walter Dörwaldbc1f8862007-06-20 11:02:38 +00004038 int sep = 'T';
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00004039 static char *keywords[] = {"sep", NULL};
Tim Petersa9bc1682003-01-11 03:39:11 +00004040 char buffer[100];
Tim Petersa9bc1682003-01-11 03:39:11 +00004041 PyObject *result;
Walter Dörwaldbafa1372007-05-31 17:50:48 +00004042 int us = DATE_GET_MICROSECOND(self);
Tim Peters2a799bf2002-12-16 20:18:38 +00004043
Walter Dörwaldd0941302007-07-01 21:58:22 +00004044 if (!PyArg_ParseTupleAndKeywords(args, kw, "|C:isoformat", keywords, &sep))
Tim Petersa9bc1682003-01-11 03:39:11 +00004045 return NULL;
Walter Dörwaldbafa1372007-05-31 17:50:48 +00004046 if (us)
4047 result = PyUnicode_FromFormat("%04d-%02d-%02d%c%02d:%02d:%02d.%06d",
4048 GET_YEAR(self), GET_MONTH(self),
4049 GET_DAY(self), (int)sep,
4050 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
4051 DATE_GET_SECOND(self), us);
4052 else
4053 result = PyUnicode_FromFormat("%04d-%02d-%02d%c%02d:%02d:%02d",
4054 GET_YEAR(self), GET_MONTH(self),
4055 GET_DAY(self), (int)sep,
4056 DATE_GET_HOUR(self), DATE_GET_MINUTE(self),
4057 DATE_GET_SECOND(self));
4058
4059 if (!result || !HASTZINFO(self))
Tim Peters2a799bf2002-12-16 20:18:38 +00004060 return result;
4061
4062 /* We need to append the UTC offset. */
Tim Petersa9bc1682003-01-11 03:39:11 +00004063 if (format_utcoffset(buffer, sizeof(buffer), ":", self->tzinfo,
Tim Peters2a799bf2002-12-16 20:18:38 +00004064 (PyObject *)self) < 0) {
4065 Py_DECREF(result);
4066 return NULL;
4067 }
Walter Dörwaldbafa1372007-05-31 17:50:48 +00004068 PyUnicode_AppendAndDel(&result, PyUnicode_FromString(buffer));
Tim Peters2a799bf2002-12-16 20:18:38 +00004069 return result;
4070}
4071
Tim Petersa9bc1682003-01-11 03:39:11 +00004072static PyObject *
4073datetime_ctime(PyDateTime_DateTime *self)
4074{
4075 return format_ctime((PyDateTime_Date *)self,
4076 DATE_GET_HOUR(self),
4077 DATE_GET_MINUTE(self),
4078 DATE_GET_SECOND(self));
4079}
4080
Tim Peters2a799bf2002-12-16 20:18:38 +00004081/* Miscellaneous methods. */
4082
Tim Petersa9bc1682003-01-11 03:39:11 +00004083static PyObject *
Guido van Rossum19960592006-08-24 17:29:38 +00004084datetime_richcompare(PyObject *self, PyObject *other, int op)
Tim Petersa9bc1682003-01-11 03:39:11 +00004085{
4086 int diff;
4087 naivety n1, n2;
4088 int offset1, offset2;
4089
4090 if (! PyDateTime_Check(other)) {
Guido van Rossum19960592006-08-24 17:29:38 +00004091 if (PyDate_Check(other)) {
4092 /* Prevent invocation of date_richcompare. We want to
4093 return NotImplemented here to give the other object
4094 a chance. But since DateTime is a subclass of
4095 Date, if the other object is a Date, it would
4096 compute an ordering based on the date part alone,
4097 and we don't want that. So force unequal or
4098 uncomparable here in that case. */
4099 if (op == Py_EQ)
4100 Py_RETURN_FALSE;
4101 if (op == Py_NE)
4102 Py_RETURN_TRUE;
4103 return cmperror(self, other);
Tim Peters8d81a012003-01-24 22:36:34 +00004104 }
Guido van Rossum19960592006-08-24 17:29:38 +00004105 Py_INCREF(Py_NotImplemented);
4106 return Py_NotImplemented;
Tim Petersa9bc1682003-01-11 03:39:11 +00004107 }
4108
Guido van Rossum19960592006-08-24 17:29:38 +00004109 if (classify_two_utcoffsets(self, &offset1, &n1, self,
4110 other, &offset2, &n2, other) < 0)
Tim Petersa9bc1682003-01-11 03:39:11 +00004111 return NULL;
4112 assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN);
4113 /* If they're both naive, or both aware and have the same offsets,
4114 * we get off cheap. Note that if they're both naive, offset1 ==
4115 * offset2 == 0 at this point.
4116 */
4117 if (n1 == n2 && offset1 == offset2) {
Guido van Rossum19960592006-08-24 17:29:38 +00004118 diff = memcmp(((PyDateTime_DateTime *)self)->data,
4119 ((PyDateTime_DateTime *)other)->data,
Tim Petersa9bc1682003-01-11 03:39:11 +00004120 _PyDateTime_DATETIME_DATASIZE);
4121 return diff_to_bool(diff, op);
4122 }
4123
4124 if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) {
4125 PyDateTime_Delta *delta;
4126
4127 assert(offset1 != offset2); /* else last "if" handled it */
4128 delta = (PyDateTime_Delta *)datetime_subtract((PyObject *)self,
4129 other);
4130 if (delta == NULL)
4131 return NULL;
4132 diff = GET_TD_DAYS(delta);
4133 if (diff == 0)
4134 diff = GET_TD_SECONDS(delta) |
4135 GET_TD_MICROSECONDS(delta);
4136 Py_DECREF(delta);
4137 return diff_to_bool(diff, op);
4138 }
4139
4140 assert(n1 != n2);
4141 PyErr_SetString(PyExc_TypeError,
4142 "can't compare offset-naive and "
4143 "offset-aware datetimes");
4144 return NULL;
4145}
4146
4147static long
4148datetime_hash(PyDateTime_DateTime *self)
4149{
4150 if (self->hashcode == -1) {
4151 naivety n;
4152 int offset;
4153 PyObject *temp;
4154
4155 n = classify_utcoffset((PyObject *)self, (PyObject *)self,
4156 &offset);
4157 assert(n != OFFSET_UNKNOWN);
4158 if (n == OFFSET_ERROR)
4159 return -1;
4160
4161 /* Reduce this to a hash of another object. */
4162 if (n == OFFSET_NAIVE)
4163 temp = PyString_FromStringAndSize(
4164 (char *)self->data,
4165 _PyDateTime_DATETIME_DATASIZE);
4166 else {
4167 int days;
4168 int seconds;
4169
4170 assert(n == OFFSET_AWARE);
4171 assert(HASTZINFO(self));
4172 days = ymd_to_ord(GET_YEAR(self),
4173 GET_MONTH(self),
4174 GET_DAY(self));
4175 seconds = DATE_GET_HOUR(self) * 3600 +
4176 (DATE_GET_MINUTE(self) - offset) * 60 +
4177 DATE_GET_SECOND(self);
4178 temp = new_delta(days,
4179 seconds,
4180 DATE_GET_MICROSECOND(self),
4181 1);
4182 }
4183 if (temp != NULL) {
4184 self->hashcode = PyObject_Hash(temp);
4185 Py_DECREF(temp);
4186 }
4187 }
4188 return self->hashcode;
4189}
Tim Peters2a799bf2002-12-16 20:18:38 +00004190
4191static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00004192datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
Tim Peters12bf3392002-12-24 05:41:27 +00004193{
4194 PyObject *clone;
4195 PyObject *tuple;
4196 int y = GET_YEAR(self);
4197 int m = GET_MONTH(self);
4198 int d = GET_DAY(self);
4199 int hh = DATE_GET_HOUR(self);
4200 int mm = DATE_GET_MINUTE(self);
4201 int ss = DATE_GET_SECOND(self);
4202 int us = DATE_GET_MICROSECOND(self);
Tim Petersa9bc1682003-01-11 03:39:11 +00004203 PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None;
Tim Peters12bf3392002-12-24 05:41:27 +00004204
4205 if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiiiiO:replace",
Tim Petersa9bc1682003-01-11 03:39:11 +00004206 datetime_kws,
Tim Peters12bf3392002-12-24 05:41:27 +00004207 &y, &m, &d, &hh, &mm, &ss, &us,
4208 &tzinfo))
4209 return NULL;
4210 tuple = Py_BuildValue("iiiiiiiO", y, m, d, hh, mm, ss, us, tzinfo);
4211 if (tuple == NULL)
4212 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004213 clone = datetime_new(Py_Type(self), tuple, NULL);
Tim Peters12bf3392002-12-24 05:41:27 +00004214 Py_DECREF(tuple);
4215 return clone;
4216}
4217
4218static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00004219datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
Tim Peters80475bb2002-12-25 07:40:55 +00004220{
Tim Peters52dcce22003-01-23 16:36:11 +00004221 int y, m, d, hh, mm, ss, us;
Tim Peters521fc152002-12-31 17:36:56 +00004222 PyObject *result;
Tim Peters52dcce22003-01-23 16:36:11 +00004223 int offset, none;
Tim Peters521fc152002-12-31 17:36:56 +00004224
Tim Peters80475bb2002-12-25 07:40:55 +00004225 PyObject *tzinfo;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00004226 static char *keywords[] = {"tz", NULL};
Tim Peters80475bb2002-12-25 07:40:55 +00004227
Tim Peters52dcce22003-01-23 16:36:11 +00004228 if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords,
4229 &PyDateTime_TZInfoType, &tzinfo))
Tim Peters80475bb2002-12-25 07:40:55 +00004230 return NULL;
4231
Tim Peters52dcce22003-01-23 16:36:11 +00004232 if (!HASTZINFO(self) || self->tzinfo == Py_None)
4233 goto NeedAware;
Tim Peters521fc152002-12-31 17:36:56 +00004234
Tim Peters52dcce22003-01-23 16:36:11 +00004235 /* Conversion to self's own time zone is a NOP. */
4236 if (self->tzinfo == tzinfo) {
4237 Py_INCREF(self);
4238 return (PyObject *)self;
Tim Peters710fb152003-01-02 19:35:54 +00004239 }
Tim Peters521fc152002-12-31 17:36:56 +00004240
Tim Peters52dcce22003-01-23 16:36:11 +00004241 /* Convert self to UTC. */
4242 offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none);
4243 if (offset == -1 && PyErr_Occurred())
4244 return NULL;
4245 if (none)
4246 goto NeedAware;
Tim Petersf3615152003-01-01 21:51:37 +00004247
Tim Peters52dcce22003-01-23 16:36:11 +00004248 y = GET_YEAR(self);
4249 m = GET_MONTH(self);
4250 d = GET_DAY(self);
4251 hh = DATE_GET_HOUR(self);
4252 mm = DATE_GET_MINUTE(self);
4253 ss = DATE_GET_SECOND(self);
4254 us = DATE_GET_MICROSECOND(self);
4255
4256 mm -= offset;
Tim Petersf3615152003-01-01 21:51:37 +00004257 if ((mm < 0 || mm >= 60) &&
4258 normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0)
Tim Peters52dcce22003-01-23 16:36:11 +00004259 return NULL;
4260
4261 /* Attach new tzinfo and let fromutc() do the rest. */
4262 result = new_datetime(y, m, d, hh, mm, ss, us, tzinfo);
4263 if (result != NULL) {
4264 PyObject *temp = result;
4265
4266 result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp);
4267 Py_DECREF(temp);
4268 }
Tim Petersadf64202003-01-04 06:03:15 +00004269 return result;
Tim Peters521fc152002-12-31 17:36:56 +00004270
Tim Peters52dcce22003-01-23 16:36:11 +00004271NeedAware:
4272 PyErr_SetString(PyExc_ValueError, "astimezone() cannot be applied to "
4273 "a naive datetime");
Tim Peters521fc152002-12-31 17:36:56 +00004274 return NULL;
Tim Peters80475bb2002-12-25 07:40:55 +00004275}
4276
4277static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00004278datetime_timetuple(PyDateTime_DateTime *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00004279{
4280 int dstflag = -1;
4281
Tim Petersa9bc1682003-01-11 03:39:11 +00004282 if (HASTZINFO(self) && self->tzinfo != Py_None) {
Tim Peters2a799bf2002-12-16 20:18:38 +00004283 int none;
4284
4285 dstflag = call_dst(self->tzinfo, (PyObject *)self, &none);
4286 if (dstflag == -1 && PyErr_Occurred())
4287 return NULL;
4288
4289 if (none)
4290 dstflag = -1;
4291 else if (dstflag != 0)
4292 dstflag = 1;
4293
4294 }
4295 return build_struct_time(GET_YEAR(self),
4296 GET_MONTH(self),
4297 GET_DAY(self),
4298 DATE_GET_HOUR(self),
4299 DATE_GET_MINUTE(self),
4300 DATE_GET_SECOND(self),
4301 dstflag);
4302}
4303
4304static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00004305datetime_getdate(PyDateTime_DateTime *self)
4306{
4307 return new_date(GET_YEAR(self),
4308 GET_MONTH(self),
4309 GET_DAY(self));
4310}
4311
4312static PyObject *
4313datetime_gettime(PyDateTime_DateTime *self)
4314{
4315 return new_time(DATE_GET_HOUR(self),
4316 DATE_GET_MINUTE(self),
4317 DATE_GET_SECOND(self),
4318 DATE_GET_MICROSECOND(self),
4319 Py_None);
4320}
4321
4322static PyObject *
4323datetime_gettimetz(PyDateTime_DateTime *self)
4324{
4325 return new_time(DATE_GET_HOUR(self),
4326 DATE_GET_MINUTE(self),
4327 DATE_GET_SECOND(self),
4328 DATE_GET_MICROSECOND(self),
4329 HASTZINFO(self) ? self->tzinfo : Py_None);
4330}
4331
4332static PyObject *
4333datetime_utctimetuple(PyDateTime_DateTime *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00004334{
4335 int y = GET_YEAR(self);
4336 int m = GET_MONTH(self);
4337 int d = GET_DAY(self);
4338 int hh = DATE_GET_HOUR(self);
4339 int mm = DATE_GET_MINUTE(self);
4340 int ss = DATE_GET_SECOND(self);
4341 int us = 0; /* microseconds are ignored in a timetuple */
4342 int offset = 0;
4343
Tim Petersa9bc1682003-01-11 03:39:11 +00004344 if (HASTZINFO(self) && self->tzinfo != Py_None) {
Tim Peters2a799bf2002-12-16 20:18:38 +00004345 int none;
4346
4347 offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none);
4348 if (offset == -1 && PyErr_Occurred())
4349 return NULL;
4350 }
4351 /* Even if offset is 0, don't call timetuple() -- tm_isdst should be
4352 * 0 in a UTC timetuple regardless of what dst() says.
4353 */
4354 if (offset) {
4355 /* Subtract offset minutes & normalize. */
4356 int stat;
4357
4358 mm -= offset;
4359 stat = normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us);
4360 if (stat < 0) {
4361 /* At the edges, it's possible we overflowed
4362 * beyond MINYEAR or MAXYEAR.
4363 */
4364 if (PyErr_ExceptionMatches(PyExc_OverflowError))
4365 PyErr_Clear();
4366 else
4367 return NULL;
4368 }
4369 }
4370 return build_struct_time(y, m, d, hh, mm, ss, 0);
4371}
4372
Tim Peters371935f2003-02-01 01:52:50 +00004373/* Pickle support, a simple use of __reduce__. */
Tim Peters33e0f382003-01-10 02:05:14 +00004374
Tim Petersa9bc1682003-01-11 03:39:11 +00004375/* Let basestate be the non-tzinfo data string.
Tim Peters2a799bf2002-12-16 20:18:38 +00004376 * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo).
4377 * So it's a tuple in any (non-error) case.
Tim Petersb57f8f02003-02-01 02:54:15 +00004378 * __getstate__ isn't exposed.
Tim Peters2a799bf2002-12-16 20:18:38 +00004379 */
4380static PyObject *
Tim Petersa9bc1682003-01-11 03:39:11 +00004381datetime_getstate(PyDateTime_DateTime *self)
Tim Peters2a799bf2002-12-16 20:18:38 +00004382{
4383 PyObject *basestate;
4384 PyObject *result = NULL;
4385
Martin v. Löwis10a60b32007-07-18 02:28:27 +00004386 basestate = PyBytes_FromStringAndSize((char *)self->data,
4387 _PyDateTime_DATETIME_DATASIZE);
Tim Peters2a799bf2002-12-16 20:18:38 +00004388 if (basestate != NULL) {
Tim Petersa9bc1682003-01-11 03:39:11 +00004389 if (! HASTZINFO(self) || self->tzinfo == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004390 result = PyTuple_Pack(1, basestate);
Tim Peters2a799bf2002-12-16 20:18:38 +00004391 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004392 result = PyTuple_Pack(2, basestate, self->tzinfo);
Tim Peters2a799bf2002-12-16 20:18:38 +00004393 Py_DECREF(basestate);
4394 }
4395 return result;
4396}
4397
4398static PyObject *
Guido van Rossum177e41a2003-01-30 22:06:23 +00004399datetime_reduce(PyDateTime_DateTime *self, PyObject *arg)
Tim Peters2a799bf2002-12-16 20:18:38 +00004400{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004401 return Py_BuildValue("(ON)", Py_Type(self), datetime_getstate(self));
Tim Peters2a799bf2002-12-16 20:18:38 +00004402}
4403
Tim Petersa9bc1682003-01-11 03:39:11 +00004404static PyMethodDef datetime_methods[] = {
Guido van Rossum177e41a2003-01-30 22:06:23 +00004405
Tim Peters2a799bf2002-12-16 20:18:38 +00004406 /* Class methods: */
Tim Peters2a799bf2002-12-16 20:18:38 +00004407
Tim Petersa9bc1682003-01-11 03:39:11 +00004408 {"now", (PyCFunction)datetime_now,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004409 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
Neal Norwitz2fbe5372003-01-23 21:09:05 +00004410 PyDoc_STR("[tz] -> new datetime with tz's local day and time.")},
Tim Peters2a799bf2002-12-16 20:18:38 +00004411
Tim Petersa9bc1682003-01-11 03:39:11 +00004412 {"utcnow", (PyCFunction)datetime_utcnow,
4413 METH_NOARGS | METH_CLASS,
4414 PyDoc_STR("Return a new datetime representing UTC day and time.")},
4415
4416 {"fromtimestamp", (PyCFunction)datetime_fromtimestamp,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004417 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
Tim Peters2a44a8d2003-01-23 20:53:10 +00004418 PyDoc_STR("timestamp[, tz] -> tz's local time from POSIX timestamp.")},
Tim Peters2a799bf2002-12-16 20:18:38 +00004419
Tim Petersa9bc1682003-01-11 03:39:11 +00004420 {"utcfromtimestamp", (PyCFunction)datetime_utcfromtimestamp,
4421 METH_VARARGS | METH_CLASS,
4422 PyDoc_STR("timestamp -> UTC datetime from a POSIX timestamp "
4423 "(like time.time()).")},
4424
Skip Montanaro0af3ade2005-01-13 04:12:31 +00004425 {"strptime", (PyCFunction)datetime_strptime,
4426 METH_VARARGS | METH_CLASS,
4427 PyDoc_STR("string, format -> new datetime parsed from a string "
4428 "(like time.strptime()).")},
4429
Tim Petersa9bc1682003-01-11 03:39:11 +00004430 {"combine", (PyCFunction)datetime_combine,
4431 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
4432 PyDoc_STR("date, time -> datetime with same date and time fields")},
4433
Tim Peters2a799bf2002-12-16 20:18:38 +00004434 /* Instance methods: */
Guido van Rossum177e41a2003-01-30 22:06:23 +00004435
Tim Petersa9bc1682003-01-11 03:39:11 +00004436 {"date", (PyCFunction)datetime_getdate, METH_NOARGS,
4437 PyDoc_STR("Return date object with same year, month and day.")},
4438
4439 {"time", (PyCFunction)datetime_gettime, METH_NOARGS,
4440 PyDoc_STR("Return time object with same time but with tzinfo=None.")},
4441
4442 {"timetz", (PyCFunction)datetime_gettimetz, METH_NOARGS,
4443 PyDoc_STR("Return time object with same time and tzinfo.")},
4444
4445 {"ctime", (PyCFunction)datetime_ctime, METH_NOARGS,
4446 PyDoc_STR("Return ctime() style string.")},
4447
4448 {"timetuple", (PyCFunction)datetime_timetuple, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00004449 PyDoc_STR("Return time tuple, compatible with time.localtime().")},
4450
Tim Petersa9bc1682003-01-11 03:39:11 +00004451 {"utctimetuple", (PyCFunction)datetime_utctimetuple, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00004452 PyDoc_STR("Return UTC time tuple, compatible with time.localtime().")},
4453
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004454 {"isoformat", (PyCFunction)datetime_isoformat, METH_VARARGS | METH_KEYWORDS,
Tim Peters2a799bf2002-12-16 20:18:38 +00004455 PyDoc_STR("[sep] -> string in ISO 8601 format, "
4456 "YYYY-MM-DDTHH:MM:SS[.mmmmmm][+HH:MM].\n\n"
4457 "sep is used to separate the year from the time, and "
4458 "defaults to 'T'.")},
4459
Tim Petersa9bc1682003-01-11 03:39:11 +00004460 {"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00004461 PyDoc_STR("Return self.tzinfo.utcoffset(self).")},
4462
Tim Petersa9bc1682003-01-11 03:39:11 +00004463 {"tzname", (PyCFunction)datetime_tzname, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00004464 PyDoc_STR("Return self.tzinfo.tzname(self).")},
4465
Tim Petersa9bc1682003-01-11 03:39:11 +00004466 {"dst", (PyCFunction)datetime_dst, METH_NOARGS,
Tim Peters2a799bf2002-12-16 20:18:38 +00004467 PyDoc_STR("Return self.tzinfo.dst(self).")},
4468
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004469 {"replace", (PyCFunction)datetime_replace, METH_VARARGS | METH_KEYWORDS,
Tim Petersa9bc1682003-01-11 03:39:11 +00004470 PyDoc_STR("Return datetime with new specified fields.")},
Tim Peters12bf3392002-12-24 05:41:27 +00004471
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004472 {"astimezone", (PyCFunction)datetime_astimezone, METH_VARARGS | METH_KEYWORDS,
Tim Peters80475bb2002-12-25 07:40:55 +00004473 PyDoc_STR("tz -> convert to local time in new timezone tz\n")},
4474
Guido van Rossum177e41a2003-01-30 22:06:23 +00004475 {"__reduce__", (PyCFunction)datetime_reduce, METH_NOARGS,
4476 PyDoc_STR("__reduce__() -> (cls, state)")},
4477
Tim Peters2a799bf2002-12-16 20:18:38 +00004478 {NULL, NULL}
4479};
4480
Tim Petersa9bc1682003-01-11 03:39:11 +00004481static char datetime_doc[] =
Raymond Hettinger3a4231d2004-12-19 20:13:24 +00004482PyDoc_STR("datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\
4483\n\
4484The year, month and day arguments are required. tzinfo may be None, or an\n\
4485instance of a tzinfo subclass. The remaining arguments may be ints or longs.\n");
Tim Peters2a799bf2002-12-16 20:18:38 +00004486
Tim Petersa9bc1682003-01-11 03:39:11 +00004487static PyNumberMethods datetime_as_number = {
4488 datetime_add, /* nb_add */
4489 datetime_subtract, /* nb_subtract */
Tim Peters2a799bf2002-12-16 20:18:38 +00004490 0, /* nb_multiply */
Tim Peters2a799bf2002-12-16 20:18:38 +00004491 0, /* nb_remainder */
4492 0, /* nb_divmod */
4493 0, /* nb_power */
4494 0, /* nb_negative */
4495 0, /* nb_positive */
4496 0, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00004497 0, /* nb_bool */
Tim Peters2a799bf2002-12-16 20:18:38 +00004498};
4499
Neal Norwitz227b5332006-03-22 09:28:35 +00004500static PyTypeObject PyDateTime_DateTimeType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004501 PyVarObject_HEAD_INIT(NULL, 0)
Tim Peters0bf60bd2003-01-08 20:40:01 +00004502 "datetime.datetime", /* tp_name */
Tim Petersa9bc1682003-01-11 03:39:11 +00004503 sizeof(PyDateTime_DateTime), /* tp_basicsize */
Tim Peters2a799bf2002-12-16 20:18:38 +00004504 0, /* tp_itemsize */
Tim Petersa9bc1682003-01-11 03:39:11 +00004505 (destructor)datetime_dealloc, /* tp_dealloc */
Tim Peters2a799bf2002-12-16 20:18:38 +00004506 0, /* tp_print */
4507 0, /* tp_getattr */
4508 0, /* tp_setattr */
4509 0, /* tp_compare */
Tim Petersa9bc1682003-01-11 03:39:11 +00004510 (reprfunc)datetime_repr, /* tp_repr */
4511 &datetime_as_number, /* tp_as_number */
Tim Peters2a799bf2002-12-16 20:18:38 +00004512 0, /* tp_as_sequence */
4513 0, /* tp_as_mapping */
Tim Petersa9bc1682003-01-11 03:39:11 +00004514 (hashfunc)datetime_hash, /* tp_hash */
Tim Peters2a799bf2002-12-16 20:18:38 +00004515 0, /* tp_call */
Tim Petersa9bc1682003-01-11 03:39:11 +00004516 (reprfunc)datetime_str, /* tp_str */
Tim Peters2a799bf2002-12-16 20:18:38 +00004517 PyObject_GenericGetAttr, /* tp_getattro */
4518 0, /* tp_setattro */
4519 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00004520 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Petersa9bc1682003-01-11 03:39:11 +00004521 datetime_doc, /* tp_doc */
Tim Peters2a799bf2002-12-16 20:18:38 +00004522 0, /* tp_traverse */
4523 0, /* tp_clear */
Guido van Rossum19960592006-08-24 17:29:38 +00004524 datetime_richcompare, /* tp_richcompare */
Tim Peters2a799bf2002-12-16 20:18:38 +00004525 0, /* tp_weaklistoffset */
4526 0, /* tp_iter */
4527 0, /* tp_iternext */
Tim Petersa9bc1682003-01-11 03:39:11 +00004528 datetime_methods, /* tp_methods */
Tim Peters2a799bf2002-12-16 20:18:38 +00004529 0, /* tp_members */
Tim Petersa9bc1682003-01-11 03:39:11 +00004530 datetime_getset, /* tp_getset */
4531 &PyDateTime_DateType, /* tp_base */
Tim Peters2a799bf2002-12-16 20:18:38 +00004532 0, /* tp_dict */
4533 0, /* tp_descr_get */
4534 0, /* tp_descr_set */
4535 0, /* tp_dictoffset */
4536 0, /* tp_init */
Tim Petersa98924a2003-05-17 05:55:19 +00004537 datetime_alloc, /* tp_alloc */
Tim Petersa9bc1682003-01-11 03:39:11 +00004538 datetime_new, /* tp_new */
Tim Peters4c530132003-05-16 22:44:06 +00004539 0, /* tp_free */
Tim Peters2a799bf2002-12-16 20:18:38 +00004540};
4541
4542/* ---------------------------------------------------------------------------
4543 * Module methods and initialization.
4544 */
4545
4546static PyMethodDef module_methods[] = {
Tim Peters2a799bf2002-12-16 20:18:38 +00004547 {NULL, NULL}
4548};
4549
Tim Peters9ddf40b2004-06-20 22:41:32 +00004550/* C API. Clients get at this via PyDateTime_IMPORT, defined in
4551 * datetime.h.
4552 */
4553static PyDateTime_CAPI CAPI = {
4554 &PyDateTime_DateType,
4555 &PyDateTime_DateTimeType,
4556 &PyDateTime_TimeType,
4557 &PyDateTime_DeltaType,
4558 &PyDateTime_TZInfoType,
4559 new_date_ex,
4560 new_datetime_ex,
4561 new_time_ex,
4562 new_delta_ex,
4563 datetime_fromtimestamp,
4564 date_fromtimestamp
4565};
4566
4567
Tim Peters2a799bf2002-12-16 20:18:38 +00004568PyMODINIT_FUNC
4569initdatetime(void)
4570{
4571 PyObject *m; /* a module object */
4572 PyObject *d; /* its dict */
4573 PyObject *x;
4574
Tim Peters2a799bf2002-12-16 20:18:38 +00004575 m = Py_InitModule3("datetime", module_methods,
4576 "Fast implementation of the datetime type.");
Neal Norwitz1ac754f2006-01-19 06:09:39 +00004577 if (m == NULL)
4578 return;
Tim Peters2a799bf2002-12-16 20:18:38 +00004579
4580 if (PyType_Ready(&PyDateTime_DateType) < 0)
4581 return;
4582 if (PyType_Ready(&PyDateTime_DateTimeType) < 0)
4583 return;
4584 if (PyType_Ready(&PyDateTime_DeltaType) < 0)
4585 return;
4586 if (PyType_Ready(&PyDateTime_TimeType) < 0)
4587 return;
4588 if (PyType_Ready(&PyDateTime_TZInfoType) < 0)
4589 return;
Tim Peters2a799bf2002-12-16 20:18:38 +00004590
Tim Peters2a799bf2002-12-16 20:18:38 +00004591 /* timedelta values */
4592 d = PyDateTime_DeltaType.tp_dict;
4593
Tim Peters2a799bf2002-12-16 20:18:38 +00004594 x = new_delta(0, 0, 1, 0);
4595 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
4596 return;
4597 Py_DECREF(x);
4598
4599 x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0);
4600 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
4601 return;
4602 Py_DECREF(x);
4603
4604 x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0);
4605 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
4606 return;
4607 Py_DECREF(x);
4608
4609 /* date values */
4610 d = PyDateTime_DateType.tp_dict;
4611
4612 x = new_date(1, 1, 1);
4613 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
4614 return;
4615 Py_DECREF(x);
4616
4617 x = new_date(MAXYEAR, 12, 31);
4618 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
4619 return;
4620 Py_DECREF(x);
4621
4622 x = new_delta(1, 0, 0, 0);
4623 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
4624 return;
4625 Py_DECREF(x);
4626
Tim Peters37f39822003-01-10 03:49:02 +00004627 /* time values */
4628 d = PyDateTime_TimeType.tp_dict;
Tim Peters2a799bf2002-12-16 20:18:38 +00004629
Tim Peters37f39822003-01-10 03:49:02 +00004630 x = new_time(0, 0, 0, 0, Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00004631 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
4632 return;
4633 Py_DECREF(x);
4634
Tim Peters37f39822003-01-10 03:49:02 +00004635 x = new_time(23, 59, 59, 999999, Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00004636 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
4637 return;
4638 Py_DECREF(x);
4639
4640 x = new_delta(0, 0, 1, 0);
4641 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
4642 return;
4643 Py_DECREF(x);
4644
Tim Petersa9bc1682003-01-11 03:39:11 +00004645 /* datetime values */
4646 d = PyDateTime_DateTimeType.tp_dict;
Tim Peters2a799bf2002-12-16 20:18:38 +00004647
Tim Petersa9bc1682003-01-11 03:39:11 +00004648 x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00004649 if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
4650 return;
4651 Py_DECREF(x);
4652
Tim Petersa9bc1682003-01-11 03:39:11 +00004653 x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None);
Tim Peters2a799bf2002-12-16 20:18:38 +00004654 if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
4655 return;
4656 Py_DECREF(x);
4657
4658 x = new_delta(0, 0, 1, 0);
4659 if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
4660 return;
4661 Py_DECREF(x);
4662
Tim Peters2a799bf2002-12-16 20:18:38 +00004663 /* module initialization */
4664 PyModule_AddIntConstant(m, "MINYEAR", MINYEAR);
4665 PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR);
4666
4667 Py_INCREF(&PyDateTime_DateType);
4668 PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType);
4669
Tim Petersa9bc1682003-01-11 03:39:11 +00004670 Py_INCREF(&PyDateTime_DateTimeType);
4671 PyModule_AddObject(m, "datetime",
4672 (PyObject *)&PyDateTime_DateTimeType);
4673
4674 Py_INCREF(&PyDateTime_TimeType);
4675 PyModule_AddObject(m, "time", (PyObject *) &PyDateTime_TimeType);
4676
Tim Peters2a799bf2002-12-16 20:18:38 +00004677 Py_INCREF(&PyDateTime_DeltaType);
4678 PyModule_AddObject(m, "timedelta", (PyObject *) &PyDateTime_DeltaType);
4679
Tim Peters2a799bf2002-12-16 20:18:38 +00004680 Py_INCREF(&PyDateTime_TZInfoType);
4681 PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType);
4682
Tim Peters9ddf40b2004-06-20 22:41:32 +00004683 x = PyCObject_FromVoidPtrAndDesc(&CAPI, (void*) DATETIME_API_MAGIC,
4684 NULL);
4685 if (x == NULL)
4686 return;
4687 PyModule_AddObject(m, "datetime_CAPI", x);
4688
Tim Peters2a799bf2002-12-16 20:18:38 +00004689 /* A 4-year cycle has an extra leap day over what we'd get from
4690 * pasting together 4 single years.
4691 */
4692 assert(DI4Y == 4 * 365 + 1);
4693 assert(DI4Y == days_before_year(4+1));
4694
4695 /* Similarly, a 400-year cycle has an extra leap day over what we'd
4696 * get from pasting together 4 100-year cycles.
4697 */
4698 assert(DI400Y == 4 * DI100Y + 1);
4699 assert(DI400Y == days_before_year(400+1));
4700
4701 /* OTOH, a 100-year cycle has one fewer leap day than we'd get from
4702 * pasting together 25 4-year cycles.
4703 */
4704 assert(DI100Y == 25 * DI4Y - 1);
4705 assert(DI100Y == days_before_year(100+1));
4706
4707 us_per_us = PyInt_FromLong(1);
4708 us_per_ms = PyInt_FromLong(1000);
4709 us_per_second = PyInt_FromLong(1000000);
4710 us_per_minute = PyInt_FromLong(60000000);
4711 seconds_per_day = PyInt_FromLong(24 * 3600);
4712 if (us_per_us == NULL || us_per_ms == NULL || us_per_second == NULL ||
4713 us_per_minute == NULL || seconds_per_day == NULL)
4714 return;
4715
4716 /* The rest are too big for 32-bit ints, but even
4717 * us_per_week fits in 40 bits, so doubles should be exact.
4718 */
4719 us_per_hour = PyLong_FromDouble(3600000000.0);
4720 us_per_day = PyLong_FromDouble(86400000000.0);
4721 us_per_week = PyLong_FromDouble(604800000000.0);
4722 if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL)
4723 return;
4724}
Tim Petersf3615152003-01-01 21:51:37 +00004725
4726/* ---------------------------------------------------------------------------
Tim Petersa9bc1682003-01-11 03:39:11 +00004727Some time zone algebra. For a datetime x, let
Tim Petersf3615152003-01-01 21:51:37 +00004728 x.n = x stripped of its timezone -- its naive time.
4729 x.o = x.utcoffset(), and assuming that doesn't raise an exception or
4730 return None
4731 x.d = x.dst(), and assuming that doesn't raise an exception or
4732 return None
4733 x.s = x's standard offset, x.o - x.d
4734
4735Now some derived rules, where k is a duration (timedelta).
4736
47371. x.o = x.s + x.d
4738 This follows from the definition of x.s.
4739
Tim Petersc5dc4da2003-01-02 17:55:03 +000047402. If x and y have the same tzinfo member, x.s = y.s.
Tim Petersf3615152003-01-01 21:51:37 +00004741 This is actually a requirement, an assumption we need to make about
4742 sane tzinfo classes.
4743
47443. The naive UTC time corresponding to x is x.n - x.o.
4745 This is again a requirement for a sane tzinfo class.
4746
47474. (x+k).s = x.s
Tim Peters8bb5ad22003-01-24 02:44:45 +00004748 This follows from #2, and that datimetimetz+timedelta preserves tzinfo.
Tim Petersf3615152003-01-01 21:51:37 +00004749
Tim Petersc5dc4da2003-01-02 17:55:03 +000047505. (x+k).n = x.n + k
Tim Petersf3615152003-01-01 21:51:37 +00004751 Again follows from how arithmetic is defined.
4752
Tim Peters8bb5ad22003-01-24 02:44:45 +00004753Now we can explain tz.fromutc(x). Let's assume it's an interesting case
Tim Petersf3615152003-01-01 21:51:37 +00004754(meaning that the various tzinfo methods exist, and don't blow up or return
4755None when called).
4756
Tim Petersa9bc1682003-01-11 03:39:11 +00004757The function wants to return a datetime y with timezone tz, equivalent to x.
Tim Peters8bb5ad22003-01-24 02:44:45 +00004758x is already in UTC.
Tim Petersf3615152003-01-01 21:51:37 +00004759
4760By #3, we want
4761
Tim Peters8bb5ad22003-01-24 02:44:45 +00004762 y.n - y.o = x.n [1]
Tim Petersf3615152003-01-01 21:51:37 +00004763
4764The algorithm starts by attaching tz to x.n, and calling that y. So
4765x.n = y.n at the start. Then it wants to add a duration k to y, so that [1]
4766becomes true; in effect, we want to solve [2] for k:
4767
Tim Peters8bb5ad22003-01-24 02:44:45 +00004768 (y+k).n - (y+k).o = x.n [2]
Tim Petersf3615152003-01-01 21:51:37 +00004769
4770By #1, this is the same as
4771
Tim Peters8bb5ad22003-01-24 02:44:45 +00004772 (y+k).n - ((y+k).s + (y+k).d) = x.n [3]
Tim Petersf3615152003-01-01 21:51:37 +00004773
4774By #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.
4775Substituting that into [3],
4776
Tim Peters8bb5ad22003-01-24 02:44:45 +00004777 x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving
4778 k - (y+k).s - (y+k).d = 0; rearranging,
4779 k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so
4780 k = y.s - (y+k).d
Tim Petersf3615152003-01-01 21:51:37 +00004781
Tim Peters8bb5ad22003-01-24 02:44:45 +00004782On the RHS, (y+k).d can't be computed directly, but y.s can be, and we
4783approximate k by ignoring the (y+k).d term at first. Note that k can't be
4784very large, since all offset-returning methods return a duration of magnitude
4785less than 24 hours. For that reason, if y is firmly in std time, (y+k).d must
4786be 0, so ignoring it has no consequence then.
Tim Petersf3615152003-01-01 21:51:37 +00004787
4788In any case, the new value is
4789
Tim Peters8bb5ad22003-01-24 02:44:45 +00004790 z = y + y.s [4]
Tim Petersf3615152003-01-01 21:51:37 +00004791
Tim Peters8bb5ad22003-01-24 02:44:45 +00004792It's helpful to step back at look at [4] from a higher level: it's simply
4793mapping from UTC to tz's standard time.
Tim Petersc5dc4da2003-01-02 17:55:03 +00004794
4795At this point, if
4796
Tim Peters8bb5ad22003-01-24 02:44:45 +00004797 z.n - z.o = x.n [5]
Tim Petersc5dc4da2003-01-02 17:55:03 +00004798
4799we have an equivalent time, and are almost done. The insecurity here is
Tim Petersf3615152003-01-01 21:51:37 +00004800at the start of daylight time. Picture US Eastern for concreteness. The wall
4801time jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good
Tim Peters8bb5ad22003-01-24 02:44:45 +00004802sense then. The docs ask that an Eastern tzinfo class consider such a time to
4803be EDT (because it's "after 2"), which is a redundant spelling of 1:MM EST
4804on the day DST starts. We want to return the 1:MM EST spelling because that's
Tim Petersf3615152003-01-01 21:51:37 +00004805the only spelling that makes sense on the local wall clock.
4806
Tim Petersc5dc4da2003-01-02 17:55:03 +00004807In fact, if [5] holds at this point, we do have the standard-time spelling,
4808but that takes a bit of proof. We first prove a stronger result. What's the
4809difference between the LHS and RHS of [5]? Let
Tim Petersf3615152003-01-01 21:51:37 +00004810
Tim Peters8bb5ad22003-01-24 02:44:45 +00004811 diff = x.n - (z.n - z.o) [6]
Tim Petersf3615152003-01-01 21:51:37 +00004812
Tim Petersc5dc4da2003-01-02 17:55:03 +00004813Now
4814 z.n = by [4]
Tim Peters8bb5ad22003-01-24 02:44:45 +00004815 (y + y.s).n = by #5
4816 y.n + y.s = since y.n = x.n
4817 x.n + y.s = since z and y are have the same tzinfo member,
4818 y.s = z.s by #2
4819 x.n + z.s
Tim Petersf3615152003-01-01 21:51:37 +00004820
Tim Petersc5dc4da2003-01-02 17:55:03 +00004821Plugging that back into [6] gives
Tim Petersf3615152003-01-01 21:51:37 +00004822
Tim Petersc5dc4da2003-01-02 17:55:03 +00004823 diff =
Tim Peters8bb5ad22003-01-24 02:44:45 +00004824 x.n - ((x.n + z.s) - z.o) = expanding
4825 x.n - x.n - z.s + z.o = cancelling
4826 - z.s + z.o = by #2
Tim Petersc5dc4da2003-01-02 17:55:03 +00004827 z.d
Tim Petersf3615152003-01-01 21:51:37 +00004828
Tim Petersc5dc4da2003-01-02 17:55:03 +00004829So diff = z.d.
Tim Petersf3615152003-01-01 21:51:37 +00004830
Tim Petersc5dc4da2003-01-02 17:55:03 +00004831If [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time
Tim Peters8bb5ad22003-01-24 02:44:45 +00004832spelling we wanted in the endcase described above. We're done. Contrarily,
4833if z.d = 0, then we have a UTC equivalent, and are also done.
Tim Petersf3615152003-01-01 21:51:37 +00004834
Tim Petersc5dc4da2003-01-02 17:55:03 +00004835If [5] is not true now, diff = z.d != 0, and z.d is the offset we need to
4836add to z (in effect, z is in tz's standard time, and we need to shift the
Tim Peters8bb5ad22003-01-24 02:44:45 +00004837local clock into tz's daylight time).
Tim Petersf3615152003-01-01 21:51:37 +00004838
Tim Petersc5dc4da2003-01-02 17:55:03 +00004839Let
Tim Petersf3615152003-01-01 21:51:37 +00004840
Tim Peters4fede1a2003-01-04 00:26:59 +00004841 z' = z + z.d = z + diff [7]
Tim Petersc3bb26a2003-01-02 03:14:59 +00004842
Tim Peters4fede1a2003-01-04 00:26:59 +00004843and we can again ask whether
Tim Petersc3bb26a2003-01-02 03:14:59 +00004844
Tim Peters8bb5ad22003-01-24 02:44:45 +00004845 z'.n - z'.o = x.n [8]
Tim Petersc3bb26a2003-01-02 03:14:59 +00004846
Tim Peters8bb5ad22003-01-24 02:44:45 +00004847If so, we're done. If not, the tzinfo class is insane, according to the
4848assumptions we've made. This also requires a bit of proof. As before, let's
4849compute the difference between the LHS and RHS of [8] (and skipping some of
4850the justifications for the kinds of substitutions we've done several times
4851already):
Tim Peters4fede1a2003-01-04 00:26:59 +00004852
Tim Peters8bb5ad22003-01-24 02:44:45 +00004853 diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7]
4854 x.n - (z.n + diff - z'.o) = replacing diff via [6]
4855 x.n - (z.n + x.n - (z.n - z.o) - z'.o) =
4856 x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n
4857 - z.n + z.n - z.o + z'.o = cancel z.n
Tim Peters4fede1a2003-01-04 00:26:59 +00004858 - z.o + z'.o = #1 twice
4859 -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo
4860 z'.d - z.d
4861
4862So z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal,
Tim Peters8bb5ad22003-01-24 02:44:45 +00004863we've found the UTC-equivalent so are done. In fact, we stop with [7] and
4864return z', not bothering to compute z'.d.
Tim Peters4fede1a2003-01-04 00:26:59 +00004865
Tim Peters8bb5ad22003-01-24 02:44:45 +00004866How could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by
4867a dst() offset, and starting *from* a time already in DST (we know z.d != 0),
4868would have to change the result dst() returns: we start in DST, and moving
4869a little further into it takes us out of DST.
Tim Peters4fede1a2003-01-04 00:26:59 +00004870
Tim Peters8bb5ad22003-01-24 02:44:45 +00004871There isn't a sane case where this can happen. The closest it gets is at
4872the end of DST, where there's an hour in UTC with no spelling in a hybrid
4873tzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During
4874that hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM
4875UTC) because the docs insist on that, but 0:MM is taken as being in daylight
4876time (4:MM UTC). There is no local time mapping to 5:MM UTC. The local
4877clock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in
4878standard time. Since that's what the local clock *does*, we want to map both
4879UTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous
Tim Peters4fede1a2003-01-04 00:26:59 +00004880in local time, but so it goes -- it's the way the local clock works.
4881
Tim Peters8bb5ad22003-01-24 02:44:45 +00004882When x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,
4883so z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going.
4884z' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]
Tim Peters4fede1a2003-01-04 00:26:59 +00004885(correctly) concludes that z' is not UTC-equivalent to x.
4886
4887Because we know z.d said z was in daylight time (else [5] would have held and
4888we would have stopped then), and we know z.d != z'.d (else [8] would have held
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +00004889and we would have stopped then), and there are only 2 possible values dst() can
Tim Peters4fede1a2003-01-04 00:26:59 +00004890return in Eastern, it follows that z'.d must be 0 (which it is in the example,
4891but the reasoning doesn't depend on the example -- it depends on there being
4892two possible dst() outcomes, one zero and the other non-zero). Therefore
Tim Peters8bb5ad22003-01-24 02:44:45 +00004893z' must be in standard time, and is the spelling we want in this case.
4894
4895Note again that z' is not UTC-equivalent as far as the hybrid tzinfo class is
4896concerned (because it takes z' as being in standard time rather than the
4897daylight time we intend here), but returning it gives the real-life "local
4898clock repeats an hour" behavior when mapping the "unspellable" UTC hour into
4899tz.
4900
4901When the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with
4902the 1:MM standard time spelling we want.
4903
4904So how can this break? One of the assumptions must be violated. Two
4905possibilities:
4906
49071) [2] effectively says that y.s is invariant across all y belong to a given
4908 time zone. This isn't true if, for political reasons or continental drift,
4909 a region decides to change its base offset from UTC.
4910
49112) There may be versions of "double daylight" time where the tail end of
4912 the analysis gives up a step too early. I haven't thought about that
4913 enough to say.
4914
4915In any case, it's clear that the default fromutc() is strong enough to handle
4916"almost all" time zones: so long as the standard offset is invariant, it
4917doesn't matter if daylight time transition points change from year to year, or
4918if daylight time is skipped in some years; it doesn't matter how large or
4919small dst() may get within its bounds; and it doesn't even matter if some
4920perverse time zone returns a negative dst()). So a breaking case must be
4921pretty bizarre, and a tzinfo subclass can override fromutc() if it is.
Tim Petersf3615152003-01-01 21:51:37 +00004922--------------------------------------------------------------------------- */