|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.99 2003/01/29 01:08:42 tgl Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.100 2003/02/19 03:48:10 momjian Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -587,66 +587,77 @@ static datetkn *deltacache[MAXDATEFIELDS] = {NULL};
|
587 | 587 | * since it is numerically accurate and computationally simple.
|
588 | 588 | * The algorithms here will accurately convert between Julian day
|
589 | 589 | * and calendar date for all non-negative Julian days
|
590 |
| - * (i.e. from Nov 23, -4713 on). |
591 |
| - * |
592 |
| - * Ref: Explanatory Supplement to the Astronomical Almanac, 1992. |
593 |
| - * University Science Books, 20 Edgehill Rd. Mill Valley CA 94941. |
594 |
| - * |
595 |
| - * Use the algorithm by Henry Fliegel, a former NASA/JPL colleague |
596 |
| - * now at Aerospace Corp. (hi, Henry!) |
| 590 | + * (i.e. from Nov 24, -4713 on). |
597 | 591 | *
|
598 | 592 | * These routines will be used by other date/time packages
|
599 | 593 | * - thomas 97/02/25
|
| 594 | + * |
| 595 | + * Rewritten to eliminate overflow problems. This now allows the |
| 596 | + * routines to work correctly for all Julian day counts from |
| 597 | + * 0 to 2147483647 (Nov 24, -4713 to Jun 3, 5874898) assuming |
| 598 | + * a 32-bit integer. Longer types should also work to the limits |
| 599 | + * of their precision. |
600 | 600 | */
|
601 | 601 |
|
602 | 602 | int
|
603 | 603 | date2j(int y, int m, int d)
|
604 | 604 | {
|
605 |
| - int m12 = (m - 14) / 12; |
| 605 | + int julian; |
| 606 | + int century; |
| 607 | + |
| 608 | + if (m > 2) { |
| 609 | + m += 1; |
| 610 | + y += 4800; |
| 611 | + } else { |
| 612 | + m += 13; |
| 613 | + y += 4799; |
| 614 | + } |
| 615 | + |
| 616 | + century = y/100; |
| 617 | + julian = y*365 - 32167; |
| 618 | + julian += y/4 - century + century/4; |
| 619 | + julian += 7834*m/256 + d; |
606 | 620 |
|
607 |
| - return ((1461 * (y + 4800 + m12)) / 4 |
608 |
| - + (367 * (m - 2 - 12 * (m12))) / 12 |
609 |
| - - (3 * ((y + 4900 + m12) / 100)) / 4 |
610 |
| - + d - 32075); |
| 621 | + return julian; |
611 | 622 | } /* date2j() */
|
612 | 623 |
|
613 | 624 | void
|
614 | 625 | j2date(int jd, int *year, int *month, int *day)
|
615 | 626 | {
|
616 |
| - int j, |
617 |
| - y, |
618 |
| - m, |
619 |
| - d; |
| 627 | + unsigned int julian; |
| 628 | + unsigned int quad; |
| 629 | + unsigned int extra; |
| 630 | + int y; |
| 631 | + |
| 632 | + julian = jd; |
| 633 | + julian += 32044; |
| 634 | + quad = julian/146097; |
| 635 | + extra = (julian - quad*146097)*4 + 3; |
| 636 | + julian += 60 + quad*3 + extra/146097; |
| 637 | + quad = julian/1461; |
| 638 | + julian -= quad*1461; |
| 639 | + y = julian * 4 / 1461; |
| 640 | + julian = ((y != 0) ? ((julian + 305) % 365) : ((julian + 306) % 366)) |
| 641 | + + 123; |
| 642 | + y += quad*4; |
| 643 | + *year = y - 4800; |
| 644 | + quad = julian * 2141 / 65536; |
| 645 | + *day = julian - 7834*quad/256; |
| 646 | + *month = (quad + 10) % 12 + 1; |
620 | 647 |
|
621 |
| - int i, |
622 |
| - l, |
623 |
| - n; |
624 |
| - |
625 |
| - l = jd + 68569; |
626 |
| - n = (4 * l) / 146097; |
627 |
| - l -= (146097 * n + 3) / 4; |
628 |
| - i = (4000 * (l + 1)) / 1461001; |
629 |
| - l += 31 - (1461 * i) / 4; |
630 |
| - j = (80 * l) / 2447; |
631 |
| - d = l - (2447 * j) / 80; |
632 |
| - l = j / 11; |
633 |
| - m = (j + 2) - (12 * l); |
634 |
| - y = 100 * (n - 49) + i + l; |
635 |
| - |
636 |
| - *year = y; |
637 |
| - *month = m; |
638 |
| - *day = d; |
639 | 648 | return;
|
640 | 649 | } /* j2date() */
|
641 | 650 |
|
642 | 651 | int
|
643 | 652 | j2day(int date)
|
644 | 653 | {
|
645 |
| - int day; |
| 654 | + unsigned int day; |
646 | 655 |
|
647 |
| - day = (date + 1) % 7; |
| 656 | + day = date; |
| 657 | + day += 1; |
| 658 | + day %= 7; |
648 | 659 |
|
649 |
| - return day; |
| 660 | + return (int) day; |
650 | 661 | } /* j2day() */
|
651 | 662 |
|
652 | 663 |
|
|
0 commit comments