[prev in list] [next in list] [prev in thread] [next in thread] 

List:       phpdoc
Subject:    Re: [PHP-DOC] negative timestamp FUD
From:       Rasmus Lerdorf <rasmus () php ! net>
Date:       2004-03-31 17:57:45
Message-ID: Pine.LNX.4.58.0403310955270.1475 () thinkpad ! lerdorf ! com
[Download RAW message or body]

Yes, the note on the strftime() page doesn't match the code, you are 
right.  We will fix that.  What determines whether an OS supports negative 
timestamps or not is the libc implementation.  Most UNIX operating systems 
support it and Windows doesn't.  In fact some functions on Windows will 
crash if you pass them a negative timestamp.

We'll fix strftime() to allow negative timestamps on non-Windows to match 
the documentation and work on getting a note added to each page that takes 
a timestamp that warns the user that this is a platform-dependant feature.

-Rasmus

On Tue, 30 Mar 2004, Ross P. Davis wrote:

> Good day,
> 
> I would like to bring up a few issues regarding negative timestamps.
> Firstly, I think it would be good to compose a document that discusses
> UNIX timestamps and the support or lack thereof regarding negative
> timestamps on various systems. For example, what is it about a system
> that gives it negative timestamp support as opposed to not? This
> document needs to be very clear because there is a lot of FUD floating
> around on the web about this. Once such a document has been composed,
> every PHP date function should have the following note:
> 
> "WARNING: the range of dates that the PHP date functions can handle are
> dependent on your system's implementation of UNIX timestamps. Please
> click here [link to timestamp document] for more information."
> 
> You can then remove all the little notes that are scattered through the
> function docs regarding windows timestamp support and pre-1970 and so
> on.
> 
> Now I would like to discuss the documentation for strftime. In the docs,
> I see this:
> 
> "Additionally, not all platforms support negative timestamps, therefore
> your date range may be limited to no earlier than the Unix epoch. This
> means that e.g. %e, %T, %R and %D (there might be more) and dates prior
> to Jan 1, 1970 will not work on Windows, some Linux distributions, and a
> few other operating systems."
> 
> This statement is somewhat misleading because as far as I can tell, negative
> timestamps are not supported AT ALL for strftime. Looking inside the
> function definition for strftime in php-4.3.5/ext/standard/datetime.c, I
> see this code following the extraction of the function arguments:
> 
>      843         if (timestamp < 0) {
>      844                 RETURN_FALSE;
>      845         }
> 
> Unless I am missing something, this means that strftime always returns
> false when working with negative timestamps. As a brief aside, I
> commented out line 844, recompiled, and tried calling strftime with a
> negative timestamp - it returned the correct result. I am assuming there
> is a reason to disallow negative timestamps in this function, but there
> are no comments in the code to suggest why. As another documentation
> item, it would be nice to have something like:
> 
>      843         // disallow negative timestamp b/c [INSERT REASON HERE]
> 844         if (timestamp < 0) {
>      845                 RETURN_FALSE;
>      846         }
> 
> Back to the strftime docs, I see a user comment:
> 
> "Note that on Linux kernels before 2.4.* the date functions in PHP will
> happily accept a date before 01-01-1970 as stated at the top of this man
> page, post kernel 2.4.* the date functions *do not* work with dates
> before 1970.
> 
> If you've existing scripts doing date validation on dates before 1970,
> check them before you upgrade your kernel!"
> 
> Is this for real? And looking on a site that offers a date function
> package: http://php.weblogs.com/adodb_date_time_library I see this:
> "Since RedHat 7.3, negative timestamps are not supported in glibc. So
> the latest versions of this library will take over negative timestamp
> calculations on all platforms."
> 
> So where does the problem lie? Is it in the kernel, glibc, or both?
> Another thing that needs to be documented is which functions support
> negative timestamps and which do not. strftime obviously does not. This
> appears to work on my Redhat 8 system:
> 
> date("d/m/Y", -1735281789)
> 
> and yet the following returns -1:
> 
> strtotime("-50 years");
> 
> Though it works on older versions of Redhat. So if my system does not
> support negative timestamps, why does date() operate correctly with a
> negative timestamp? And why can I correctly run a C program that uses a
> negative timestamp:
> 
> #include <time.h>
> #include <stdio.h>
> 
> main() {
>   time_t t = -1735281789;
>   printf("%s\n",ctime(&t));
>   char s[80];
>   const struct tm *nowstruct;
>   nowstruct = localtime(&t);
>   strftime(s, 80, "%m/%d/%Y", nowstruct);
>   printf("%s\n",s);
> }
> 
> Produces output:
> 
> Tue Jan  5 12:16:51 1915
> 
> 01/05/1915
> 
> My sysadmins want to upgrade the production servers, but we have a massive
> amount of legacy PHP code that uses the date functions all over the place.
> Without more in-depth documentation of the PHP functions with regards to
> these timestamp issues, I cannot know what code is safe to leave alone and
> what code must be changed. Due to the nature of this code, the less I
> touch it, the better.
> 
> I would happy to contribute in any way possible with regards to this matter.
> 
> Thanks,
> Ross
> 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic