diff options
Diffstat (limited to 'ext/standard/datetime.c')
-rw-r--r-- | ext/standard/datetime.c | 410 |
1 files changed, 0 insertions, 410 deletions
diff --git a/ext/standard/datetime.c b/ext/standard/datetime.c index 9280e33662..9f1a9ce543 100644 --- a/ext/standard/datetime.c +++ b/ext/standard/datetime.c @@ -281,416 +281,6 @@ PHP_FUNCTION(gmmktime) } /* }}} */ -/* {{{ php_date - */ -static void php_date(INTERNAL_FUNCTION_PARAMETERS, int gm) -{ - pval **format, **timestamp; - time_t the_time; - struct tm *ta, tmbuf; - int i, size = 0, length, h, beat, fd, wd, yd, wk; - char tmp_buff[32]; -#if !HAVE_TM_GMTOFF - long tzone; - char *tname[2]= {"GMT Standard Time", "BST"}; -#endif - - switch(ZEND_NUM_ARGS()) { - case 1: - if (zend_get_parameters_ex(1, &format) == FAILURE) { - WRONG_PARAM_COUNT; - } - the_time = time(NULL); - break; - case 2: - if (zend_get_parameters_ex(2, &format, ×tamp) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(timestamp); - the_time = Z_LVAL_PP(timestamp); -#ifdef PHP_WIN32 - if (the_time < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Windows does not support dates prior to midnight (00:00:00), January 1, 1970"); - RETURN_FALSE; - } -#endif - break; - default: - WRONG_PARAM_COUNT; - } - convert_to_string_ex(format); - - if (gm) { - ta = php_gmtime_r(&the_time, &tmbuf); -#if !HAVE_TM_GMTOFF - tzone = 0; -#endif - } else { - ta = php_localtime_r(&the_time, &tmbuf); -#if !HAVE_TM_GMTOFF -#ifdef __CYGWIN__ - tzone = _timezone; -#else - tzone = timezone; -#endif - if (tzname[0] != NULL) { - tname[0] = tzname[0]; - } else { - tname[0] = "???"; - } - - if (tzname[1] != NULL) { - tname[1] = tzname[1]; - } -#endif - } - - if (!ta) { /* that really shouldn't happen... */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected error"); - RETURN_FALSE; - } - for (i = 0; i < Z_STRLEN_PP(format); i++) { - switch (Z_STRVAL_PP(format)[i]) { - case 'r': /* rfc822 format */ - size += 31; - break; - case 'c': /* iso8601 date (Dublin Core Date) */ - size += 25; - break; - case 'U': /* seconds since the epoch */ - size += 10; - break; - case 'F': /* month, textual, full */ - case 'l': /* day (of the week), textual */ - size += 28; - break; - case 'T': /* timezone name */ -#if HAVE_TM_ZONE - size += strlen(ta->tm_zone); -#elif HAVE_TZNAME - if (ta->tm_isdst > 0 ) { - size += strlen(tname[1]); - } else { - size += strlen(tname[0]); - } -#endif - break; - case 'Z': /* timezone offset in seconds */ - size += 6; - break; - case 'O': /* GMT offset in [+-]HHMM format */ - size += 5; - break; - case 'Y': /* year, numeric, 4 digits */ - size += 4; - break; - case 'M': /* month, textual, 3 letters */ - case 'D': /* day, textual, 3 letters */ - case 'z': /* day of the year, 1 to 366 */ - case 'B': /* Swatch Beat, 3 digits */ - size += 3; - break; - case 'y': /* year, numeric, 2 digits */ - case 'm': /* month, numeric */ - case 'n': /* month, numeric, no leading zeroes */ - case 'd': /* day of the month, numeric */ - case 'j': /* day of the month, numeric, no leading zeros */ - case 'H': /* hour, numeric, 24 hour format */ - case 'h': /* hour, numeric, 12 hour format */ - case 'G': /* hour, numeric, 24 hour format, no leading zeroes */ - case 'g': /* hour, numeric, 12 hour format, no leading zeroes */ - case 'i': /* minutes, numeric */ - case 's': /* seconds, numeric */ - case 'A': /* AM/PM */ - case 'a': /* am/pm */ - case 'S': /* standard english suffix for the day of the month (e.g. 3rd, 2nd, etc) */ - case 't': /* days in current month */ - case 'W': /* ISO-8601 week number of year, weeks starting on Monday */ - size += 2; - break; - case '\\': - if (i < Z_STRLEN_PP(format) - 1) { - i++; - } - size ++; - break; - case 'L': /* boolean for leap year */ - case 'w': /* day of the week, numeric */ - case 'I': /* DST? */ - default: - size++; - break; - } - } - - Z_STRVAL_P(return_value) = (char *) emalloc(size + 1); - Z_STRVAL_P(return_value)[0] = '\0'; - - for (i = 0; i < Z_STRLEN_PP(format); i++) { - switch (Z_STRVAL_PP(format)[i]) { - case '\\': - if (i < Z_STRLEN_PP(format) - 1) { - char ch[2]; - ch[0]=Z_STRVAL_PP(format)[i + 1]; - ch[1]='\0'; - strcat(Z_STRVAL_P(return_value), ch); - i++; - } - break; - case 'U': /* seconds since the epoch */ - sprintf(tmp_buff, "%ld", (long)the_time); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'F': /* month, textual, full */ - strcat(Z_STRVAL_P(return_value), mon_full_names[ta->tm_mon]); - break; - case 'l': /* day (of the week), textual, full */ - strcat(Z_STRVAL_P(return_value), day_full_names[ta->tm_wday]); - break; - case 'Y': /* year, numeric, 4 digits */ - sprintf(tmp_buff, "%d", ta->tm_year + YEAR_BASE); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'M': /* month, textual, 3 letters */ - strcat(Z_STRVAL_P(return_value), mon_short_names[ta->tm_mon]); - break; - case 'D': /* day (of the week), textual, 3 letters */ - strcat(Z_STRVAL_P(return_value), day_short_names[ta->tm_wday]); - break; - case 'z': /* day (of the year) */ - sprintf(tmp_buff, "%d", ta->tm_yday); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'y': /* year, numeric, 2 digits */ - sprintf(tmp_buff, "%02d", ((ta->tm_year)%100)); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'm': /* month, numeric */ - sprintf(tmp_buff, "%02d", ta->tm_mon + 1); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'n': /* month, numeric, no leading zeros */ - sprintf(tmp_buff, "%d", ta->tm_mon + 1); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'd': /* day of the month, numeric */ - sprintf(tmp_buff, "%02d", ta->tm_mday); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'j': - sprintf(tmp_buff, "%d", ta->tm_mday); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'H': /* hour, numeric, 24 hour format */ - sprintf(tmp_buff, "%02d", ta->tm_hour); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'h': /* hour, numeric, 12 hour format */ - h = ta->tm_hour % 12; if (h==0) h = 12; - sprintf(tmp_buff, "%02d", h); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'G': /* hour, numeric, 24 hour format, no leading zeros */ - sprintf(tmp_buff, "%d", ta->tm_hour); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'g': /* hour, numeric, 12 hour format, no leading zeros */ - h = ta->tm_hour % 12; if (h==0) h = 12; - sprintf(tmp_buff, "%d", h); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'i': /* minutes, numeric */ - sprintf(tmp_buff, "%02d", ta->tm_min); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 's': /* seconds, numeric */ - sprintf(tmp_buff, "%02d", ta->tm_sec); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'A': /* AM/PM */ - strcat(Z_STRVAL_P(return_value), (ta->tm_hour >= 12 ? "PM" : "AM")); - break; - case 'a': /* am/pm */ - strcat(Z_STRVAL_P(return_value), (ta->tm_hour >= 12 ? "pm" : "am")); - break; - case 'S': /* standard english suffix, e.g. 2nd/3rd for the day of the month */ - if (ta->tm_mday >= 10 && ta->tm_mday <= 19) { - strcat(Z_STRVAL_P(return_value), "th"); - } else { - switch (ta->tm_mday % 10) { - case 1: - strcat(Z_STRVAL_P(return_value), "st"); - break; - case 2: - strcat(Z_STRVAL_P(return_value), "nd"); - break; - case 3: - strcat(Z_STRVAL_P(return_value), "rd"); - break; - default: - strcat(Z_STRVAL_P(return_value), "th"); - break; - } - } - break; - case 't': /* days in current month */ - sprintf(tmp_buff, "%2d", phpday_tab[isleap((ta->tm_year+YEAR_BASE))][ta->tm_mon] ); - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'w': /* day of the week, numeric EXTENSION */ - sprintf(tmp_buff, "%01d", ta->tm_wday); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'O': /* GMT offset in [+-]HHMM format */ -#if HAVE_TM_GMTOFF - sprintf(tmp_buff, "%c%02d%02d", (ta->tm_gmtoff < 0) ? '-' : '+', abs(ta->tm_gmtoff / 3600), abs( (ta->tm_gmtoff % 3600) / 60 )); -#else - sprintf(tmp_buff, "%c%02d%02d", ((ta->tm_isdst ? tzone - 3600:tzone)>0)?'-':'+', abs((ta->tm_isdst ? tzone - 3600 : tzone) / 3600), abs(((ta->tm_isdst ? tzone - 3600 : tzone) % 3600) / 60)); -#endif - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'Z': /* timezone offset in seconds */ -#if HAVE_TM_GMTOFF - sprintf(tmp_buff, "%ld", ta->tm_gmtoff); -#else - sprintf(tmp_buff, "%ld", ta->tm_isdst ? -(tzone- 3600) : -tzone); -#endif - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'L': /* boolean for leapyear */ - sprintf(tmp_buff, "%d", (isleap((ta->tm_year+YEAR_BASE)) ? 1 : 0 ) ); - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'T': /* timezone name */ -#if HAVE_TM_ZONE - strcat(Z_STRVAL_P(return_value), ta->tm_zone); -#elif HAVE_TZNAME - strcat(Z_STRVAL_P(return_value), ta->tm_isdst ? tname[1] : tname[0]); -#endif - break; - case 'B': /* Swatch Beat a.k.a. Internet Time */ - beat = (((((long)the_time)-(((long)the_time) - - ((((long)the_time) % 86400) + 3600))) * 10) / 864); - while (beat < 0) { - beat += 1000; - } - beat = beat % 1000; - sprintf(tmp_buff, "%03d", beat); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'I': - sprintf(tmp_buff, "%d", ta->tm_isdst); - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'r': -#if HAVE_TM_GMTOFF - sprintf(tmp_buff, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d", - day_short_names[ta->tm_wday], - ta->tm_mday, - mon_short_names[ta->tm_mon], - ta->tm_year + YEAR_BASE, - ta->tm_hour, - ta->tm_min, - ta->tm_sec, - (ta->tm_gmtoff < 0) ? '-' : '+', - abs(ta->tm_gmtoff / 3600), - abs( (ta->tm_gmtoff % 3600) / 60 ) - ); -#else - sprintf(tmp_buff, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d", - day_short_names[ta->tm_wday], - ta->tm_mday, - mon_short_names[ta->tm_mon], - ta->tm_year + YEAR_BASE, - ta->tm_hour, - ta->tm_min, - ta->tm_sec, - ((ta->tm_isdst ? tzone - 3600 : tzone) > 0) ? '-' : '+', - abs((ta->tm_isdst ? tzone - 3600 : tzone) / 3600), - abs( ((ta->tm_isdst ? tzone - 3600 : tzone) % 3600) / 60 ) - ); -#endif - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'c': -#if HAVE_TM_GMTOFF - sprintf(tmp_buff, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", - ta->tm_year + YEAR_BASE, - ta->tm_mon + 1, - ta->tm_mday, - ta->tm_hour, - ta->tm_min, - ta->tm_sec, - (ta->tm_gmtoff < 0) ? '-' : '+', - abs(ta->tm_gmtoff / 3600), - abs( (ta->tm_gmtoff % 3600) / 60 ) - ); -#else - sprintf(tmp_buff, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", - ta->tm_year + YEAR_BASE, - ta->tm_mon + 1, - ta->tm_mday, - ta->tm_hour, - ta->tm_min, - ta->tm_sec, - ((ta->tm_isdst ? tzone - 3600 : tzone) > 0) ? '-' : '+', - abs((ta->tm_isdst ? tzone - 3600 : tzone) / 3600), - abs( ((ta->tm_isdst ? tzone - 3600 : tzone) % 3600) / 60 ) - ); -#endif - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - case 'W': /* ISO-8601 week number of year, weeks starting on Monday */ - wd = ta->tm_wday == 0 ? 6 : ta->tm_wday - 1; /* weekday */ - yd = ta->tm_yday + 1; /* days since January 1st */ - - fd = (7 + wd - yd % 7+ 1) % 7; /* weekday (1st January) */ - - /* week is a last year week (52 or 53) */ - if ((yd <= 7 - fd) && fd > 3){ - wk = (fd == 4 || (fd == 5 && isleap((ta->tm_year + YEAR_BASE - 1)))) ? 53 : 52; - } - /* week is a next year week (1) */ - else if (isleap((ta->tm_year+YEAR_BASE)) + 365 - yd < 3 - wd){ - wk = 1; - } - /* normal week */ - else { - wk = (yd + 6 - wd + fd) / 7 - (fd > 3); - } - - sprintf(tmp_buff, "%d", wk); /* SAFE */ - strcat(Z_STRVAL_P(return_value), tmp_buff); - break; - - default: - length = strlen(Z_STRVAL_P(return_value)); - Z_STRVAL_P(return_value)[length] = Z_STRVAL_PP(format)[i]; - Z_STRVAL_P(return_value)[length + 1] = '\0'; - break; - } - } - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; -} -/* }}} */ - -/* {{{ proto string date(string format [, int timestamp]) - Format a local time/date */ -PHP_FUNCTION(date) -{ - php_date(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} -/* }}} */ - -/* {{{ proto string gmdate(string format [, int timestamp]) - Format a GMT/UTC date/time */ -PHP_FUNCTION(gmdate) -{ - php_date(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -/* }}} */ - /* {{{ php_idate */ PHPAPI int php_idate(char format, int timestamp, int gm) |