I did some digging around in the code and came up with the solution that you
suggested.  I put the fix in unixtime2tm.c, letting php_date.c remain the
nice abstraction layer between the system-dependent code of getting the time
and actually formatting it for display.  The patch is attached.

Thanks for the back and forth thus far :)

Ilia

On Sat, Sep 27, 2008 at 3:21 AM, Alexey Zakhlestin <[EMAIL PROTECTED]>wrote:

> On Sat, Sep 27, 2008 at 12:26 PM, Ilia Cheishvili
> <[EMAIL PROTECTED]> wrote:
> > Ah, I see.  I like that even better :)
> > And I attached yet another patch that incorporates your idea.
>
> thanks.
> I did some more code-digging, and it looks, like proper point for
> fixing is not here, anyway.
>
> It should be in timelib_unixtime2gmt() and timelib_unixtime2local()
> funcitons of ext/date/lib/unixtime2tm.c
> "->f" member of structure is not set there, which results in zero's in
> output.
>
> date() function is an abstraction and should not deal with such details
> itself.
>
> >
> > On Sat, Sep 27, 2008 at 2:20 AM, Alexey Zakhlestin <[EMAIL PROTECTED]>
> > wrote:
> >>
> >> On Sat, Sep 27, 2008 at 12:04 PM, Ilia Cheishvili
> >> <[EMAIL PROTECTED]> wrote:
> >> > It definitely would be, and that's actually the way I would have
> >> > preferred
> >> > to do it.  I didn't want to impact too much code, if that makes sense
> in
> >> > this case, but I'm glad that someone agrees :)
> >> > I have attached a patch to do exactly this.
> >>
> >> I was thinking other in another direction..
> >>
> >> case 'u':
> >> #ifdef HAVE_GETTIMEOFDAY
> >>    gettimeofday(&tp, &tz);
> >>    length = slprintf(buffer, 32, "%06d", (int) tp.tv_usec);
> >> #else
> >>    length = slprintf(buffer, 32, "%06d", (int) floor(t->f * 1000000));
> >> #endif
> >>    break;
> >>
> >>
> >> >
> >> > On Sat, Sep 27, 2008 at 1:40 AM, Alexey Zakhlestin <
> [EMAIL PROTECTED]>
> >> > wrote:
> >> >>
> >> >> On Sat, Sep 27, 2008 at 11:04 AM, Ilia Cheishvili
> >> >> <[EMAIL PROTECTED]> wrote:
> >> >> > Hi all,
> >> >> > This patch addresses the issue with the date() function.  When
> >> >> > passing
> >> >> > in a
> >> >> > 'u', the date() function simply outputs six zeros.  To fix this, I
> >> >> > added
> >> >> > a
> >> >> > gettimeofday() call that figures out what to display for
> >> >> > microseconds.
> >> >> >  I am
> >> >> > including the headers and using the function with pre-processor
> >> >> > safeguards
> >> >> > as well.
> >> >> > Take a look :)
> >> >>
> >> >> Wouldn't it be better, to make gettimeofday() call only in case of
> 'u'?
> >> >>
> >> >>
> >> >> --
> >> >> Alexey Zakhlestin
> >> >> http://blog.milkfarmsoft.com/
> >> >
> >> >
> >>
> >>
> >>
> >> --
> >> Alexey Zakhlestin
> >> http://blog.milkfarmsoft.com/
> >
> >
>
>
>
> --
> Alexey Zakhlestin
> http://blog.milkfarmsoft.com/
>
Index: php_date.c
===================================================================
RCS file: /repository/php-src/ext/date/php_date.c,v
retrieving revision 1.43.2.45.2.51.2.54
diff -u -b -r1.43.2.45.2.51.2.54 php_date.c
--- php_date.c  8 Aug 2008 22:07:07 -0000       1.43.2.45.2.51.2.54
+++ php_date.c  27 Sep 2008 21:00:49 -0000
@@ -1150,7 +1150,7 @@
                        case 'H': length = slprintf(buffer, 32, "%02d", (int) 
t->h); break;
                        case 'i': length = slprintf(buffer, 32, "%02d", (int) 
t->i); break;
                        case 's': length = slprintf(buffer, 32, "%02d", (int) 
t->s); break;
-                       case 'u': length = slprintf(buffer, 32, "%06d", (int) 
floor(t->f * 1000000)); break;
+                       case 'u': length = slprintf(buffer, 32, "%06d", (int) 
t->f); break;
 
                        /* timezone */
                        case 'I': length = slprintf(buffer, 32, "%d", localtime 
? offset->is_dst : 0); break;
Index: lib/unixtime2tm.c
===================================================================
RCS file: /repository/php-src/ext/date/lib/unixtime2tm.c,v
retrieving revision 1.12.2.4.2.3.2.2
diff -u -b -r1.12.2.4.2.3.2.2 unixtime2tm.c
--- lib/unixtime2tm.c   7 Apr 2008 17:44:03 -0000       1.12.2.4.2.3.2.2
+++ lib/unixtime2tm.c   27 Sep 2008 21:00:49 -0000
@@ -32,6 +32,15 @@
 #include <strings.h>
 #endif
 
+#ifdef PHP_WIN32
+#include "win32/time.h"
+#elif defined(NETWARE)
+#include <sys/timeval.h>
+#include <sys/time.h>
+#else
+#include <sys/time.h>
+#endif
+
 static int month_tab_leap[12] = { -1, 30, 59, 90, 120, 151, 181, 212, 243, 
273, 304, 334 };
 static int month_tab[12] =      { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 
304, 334 };
 
@@ -44,6 +53,8 @@
        timelib_sll i;
        timelib_sll hours, minutes, seconds;
        int *months;
+       struct timeval tp = {0};
+       struct timezone tz = {0};
 
        days = ts / SECS_PER_DAY;
        remainder = ts - (days * SECS_PER_DAY);
@@ -126,6 +137,11 @@
        tm->sse_uptodate = 1;
        tm->tim_uptodate = 1;
        tm->is_localtime = 0;
+ 
+#ifdef HAVE_GETTIMEOFDAY
+       gettimeofday(&tp, &tz);
+       tm->f = tp.tv_usec;
+#endif
 }
 
 void timelib_update_from_sse(timelib_time *tm)
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to