Hi,
I usually have to work with dates and i miss a date format character
wich returns year of the week. I'm not a C developer, i could just play
with it in datetime.c, but i send the patch file, please check this and
if you are interest in it, use in the future.
About the working:
in case 01/01/2003 returns 2003
in case 31/12/2003 returns 2004
the format character is X.
thanks
zsolt banyai [bazso]
kirowski rt.
hungary
--- datetime.c.old 2003-12-16 23:52:47.000000000 +0100
+++ datetime.c 2003-12-23 14:25:36.000000000 +0100
@@ -361,6 +361,9 @@
case 'Y': /* year, numeric, 4 digits */
size += 4;
break;
+ case 'X':
+ size += 4; /* Year of The Weeek, numeric, 4 digits */
+ break;
case 'M': /* month, textual, 3 letters */
case 'D': /* day, textual, 3 letters */
case 'z': /* day of the year, 1 to 366 */
@@ -428,6 +431,31 @@
sprintf(tmp_buff, "%d", ta->tm_year + YEAR_BASE); /* SAFE */
strcat(Z_STRVAL_P(return_value), tmp_buff);
break;
+ case 'X':
+ 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;
+ sprintf(tmp_buff, "%d", ta->tm_year + YEAR_BASE - 1 ); /* SAFE */
+ }
+ /* week is a next year week (1) */
+ else if (isleap((ta->tm_year+YEAR_BASE)) + 365 - yd < 3 - wd){
+ wk = 1;
+ sprintf(tmp_buff, "%d", ta->tm_year + YEAR_BASE + 1); /* SAFE */
+ }
+ /* normal week */
+ else {
+ wk = (yd + 6 - wd + fd) / 7 - (fd > 3);
+ 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;
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php