#43056 [Com]: unixtojd() behavior is ill-specified
| From: | vorlon at debian dot org | Date: | Mon, 27 Oct 2008 03:43:50 +0000 |
| Subject: | #43056 [Com]: unixtojd() behavior is ill-specified | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-130172@lists.php.net to get a copy of this message | ||
ID: 43056
Comment by: vorlon at debian dot org
Reported By: vorlon at debian dot org
Status: Feedback
Bug Type: Date/time related
Operating System: *
PHP Version: 5.2.4
New Comment:
No, I'm thankfully free of maintaining PHP packages now, I have no
intention of chasing CVS tarballs to check whether you've fixed the
code.
Previous Comments:
------------------------------------------------------------------------
[2008-10-26 23:47:00] jani@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://windows.php.net/snapshots/
------------------------------------------------------------------------
[2007-10-21 06:22:15] vorlon at debian dot org
Description:
------------
The calendar extension's unixtojd() function is described in the php
manual as simply:
unixtojd Convert Unix timestamp to Julian Day
No further explanation is given for how a Julian Day is defined in this
case. However, if we use the definition given at
<http://www.decimaltime.hynes.net/dates.html#jdn>
which appears to be
the normal astronomical meaning of a Julian Day, a Julian Day should be
measured from noon GMT (or UT).
The problem is that the unixtojd() function uses php_localtime_r() to
convert a given UNIX timestamp to a time_t struct - which means the base
Gregorian date used for the conversion is calculated in the local
timezone, not in GMT. This function should use php_gmtime_r() instead.
This problem was detected when running the PHP testsuite with TZ=UTC
set - the ext/calendar/tests/unixtojd.phpt test expects a value that is
only returned in a timezone west of GMT!
(Separately, I see nowhere that the 12h offset is taken into account,
so in practice all unixtojd() results are currently calculated from
midnight in the local timezone.)
Reproduce code:
---------------
<?php
setenv('TZ=America/Los_Angeles');
echo unixtojd(1000000000). "\n";
?>
Expected result:
----------------
2452162
Actual result:
--------------
2452161
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=43056&edit=1