|
205 | 205 | return date.date.day + days;
|
206 | 206 | }
|
207 | 207 |
|
| 208 | +/*********************************************************************** |
| 209 | +** |
| 210 | +*/ REBI64 Days_Of_Date(REBINT day, REBINT month, REBINT year ) |
| 211 | +/* |
| 212 | +** Return number of days from given date parts |
| 213 | +** |
| 214 | +***********************************************************************/ |
| 215 | +{ |
| 216 | + REBI64 m = (month + 9) % 12; |
| 217 | + REBI64 y = year - (m / 10); |
| 218 | + return (REBI64)(365 * y + (y / 4) - (y / 100) + (y / 400) + ((m * 306 + 5) / 10) + ((REBI64)day - 1)); |
| 219 | +} |
| 220 | + |
| 221 | +/*********************************************************************** |
| 222 | +** |
| 223 | +*/ void Date_Of_Days(REBI64 days, REBDAT *date) |
| 224 | +/* |
| 225 | +** Return number of days from given date parts |
| 226 | +** |
| 227 | +***********************************************************************/ |
| 228 | +{ |
| 229 | + REBI64 dd, y, mi; |
| 230 | + |
| 231 | + y = ((10000 * days) + 14780) / 3652425; |
| 232 | + dd = days - (365 * y + (y / 4) - (y / 100) + (y / 400)); |
| 233 | + mi = (100 * dd + 52) / 3060; |
| 234 | + date->date.month = (mi + 2) % 12 + 1; |
| 235 | + date->date.year = y + ((mi + 2) / 12); |
| 236 | + date->date.day = dd - ((mi * 306 + 5) / 10) + 1; |
| 237 | +} |
| 238 | + |
| 239 | + |
| 240 | +/*********************************************************************** |
| 241 | +** |
| 242 | +*/ static REBI64 Days_Of_Jan_1st(REBINT year) |
| 243 | +/* |
| 244 | +** Return number of days for 1st January of given year |
| 245 | +** |
| 246 | +***********************************************************************/ |
| 247 | +{ |
| 248 | + return Days_Of_Date(1, 1, year); |
| 249 | +} |
| 250 | + |
208 | 251 |
|
209 | 252 | /***********************************************************************
|
210 | 253 | **
|
|
633 | 676 |
|
634 | 677 | if (IS_INTEGER(val) || IS_DECIMAL(val)) {
|
635 | 678 | // allow negative time zone
|
636 |
| - n = (sym == SYM_ZONE) ? Int32(val) : Int32s(val, 0); |
| 679 | + n = (sym == SYM_ZONE || sym == SYM_YEARDAY) ? Int32(val) : Int32s(val, 0); |
637 | 680 | }
|
638 | 681 | else if (IS_NONE(val)) n = 0;
|
639 | 682 | else if (IS_TIME(val) && (sym == SYM_TIME || sym == SYM_ZONE));
|
640 |
| - else if (IS_DATE(val) && (sym == SYM_TIME || sym == SYM_DATE)); |
| 683 | + else if (IS_DATE(val) && (sym == SYM_TIME || sym == SYM_DATE || sym == SYM_UTC)); |
641 | 684 | else return PE_BAD_SET_TYPE;
|
642 | 685 |
|
643 | 686 | if (secs == NO_TIME && ((sym >= SYM_HOUR && sym <= SYM_SECOND) || sym == SYM_TIME || sym == SYM_ZONE)) {
|
|
704 | 747 | }
|
705 | 748 | secs = Join_Time(&time);
|
706 | 749 | break;
|
| 750 | + case SYM_UTC: |
| 751 | + if (!IS_DATE(val)) return PE_BAD_SET_TYPE; |
| 752 | + data = pvs->value; |
| 753 | + *data = *val; |
| 754 | + VAL_ZONE(data) = 0; |
| 755 | + return PE_USE; |
| 756 | + case SYM_YEARDAY: |
| 757 | + case SYM_JULIAN: |
| 758 | + if (!IS_INTEGER(val)) return PE_BAD_SET_TYPE; |
| 759 | + Date_Of_Days( Days_Of_Jan_1st(year) + n - 1, &date); |
| 760 | + day = date.date.day - 1; |
| 761 | + month = date.date.month - 1; |
| 762 | + year = date.date.year; |
| 763 | + break; |
707 | 764 |
|
708 | 765 | default:
|
709 | 766 | return PE_BAD_SET;
|
|
0 commit comments