ďťż
 
problem roku 2038 (mktime) + adodb_date_library ďťż
 
problem roku 2038 (mktime) + adodb_date_library
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

problem roku 2038 (mktime) + adodb_date_library



w_w_w - 31-01-2008 10:37
problem roku 2038 (mktime) + adodb_date_library
  Natknąłem się na taki problem, funkcje wbudowane w php mktime, date mają ograniczenie poprawnego działania 1970-2038. Aby ten problem pokonać użyłem bibliteki adodb_date_library (http://phplens.com/lens/dl/adodb-time.zip).
Jednak są pewne rozbieżności, a nawet chyba błędy w działaniu tej funkcji.

Napisałem taki prościutki teścik:
<?php
require_once("adodb-time.inc.php");

$cd='2007-12-01'; #data startowa - tylko tu wystarczy ją zmienić dla innych dat
$year=substr($cd,0,4);
$month=substr($cd,5,2);
$day=substr($cd,8,2);

for ($m=1;$m<=36;$m++)
{
define('ADODB_TEST_DATES',0);
$d1=adodb_date("d-m-Y",adodb_mktime(0,0,0,($month+$m),$day,$year)); #podstawienie daty z funkcji adodb
$d2=date("d-m-Y",mktime(0,0,0,($month+$m),$day,$year)); #podstawienie daty z funkcji php
if ($m>9) $mm=$m; else $mm='0'.$m;
if ($d1<>$d2) {$b='<b style="color:#FF0000">'; $ok="#";} else {$b='<b style="color:#000000">'; $ok="=";}
echo "<br>define('ADODB_TEST_DATES',0) - start=".$cd.' + month='.$mm.' => adodb_date='.$b.$d1.'</b> date='.$b.$d2.'</b> '.$ok;

define('ADODB_TEST_DATES',1);
$d1=adodb_date("d-m-Y",adodb_mktime(0,0,0,($month+$m),$day,$year));
$d2=date("d-m-Y",mktime(0,0,0,($month+$m),$day,$year));
if ($d1<>$d2) {$b='<b style="color:#FF0000">'; $ok="#";} else {$b='<b style="color:#000000">'; $ok="=";}
echo "<br>define('ADODB_TEST_DATES',1) - start=".$cd.' + month='.$mm.' => adodb_date='.$b.$d1.'</b> date='.$b.$d2.'</b> '.$ok;

echo '<br>--------------------------------------------------------------------------------------------------------------------------------------------------';
}
echo '<br>--------------------------------------------------------------------------------------------------------------------------------------------------';
define('ADODB_TEST_DATES',0);
$d1=adodb_date("d-m-Y",adodb_mktime(0,0,0,($month+600),$day,$year)) ;
$d2=date("d-m-Y",mktime(0,0,0,($month+600),$day,$year));
$mm=600;
if ($d1<>$d2) {$b='<b style="color:#FF0000">'; $ok="#";} else {$b='<b style="color:#000000">'; $ok="=";}
echo "<br>define('ADODB_TEST_DATES',0) - start=".$cd.' + month='.$mm.' => adodb_date='.$b.$d1.'</b> date='.$b.$d2.'</b> '.$ok;

define('ADODB_TEST_DATES',1);
$d1=adodb_date("d-m-Y",adodb_mktime(0,0,0,($month+600),$day,$year)) ;
$d2=date("d-m-Y",mktime(0,0,0,($month+600),$day,$year));
if ($d1<>$d2) {$b='<b style="color:#FF0000">'; $ok="#";} else {$b='<b style="color:#000000">'; $ok="=";}
echo "<br>define('ADODB_TEST_DATES',1) - start=".$cd.' + month='.$mm.' => adodb_date='.$b.$d1.'</b> date='.$b.$d2.'</b> '.$ok;
?>

którego efektem jest wydruk, a w szczególności różnice w obliczaniu dat w przyszłości - szczególnie data startowa+12 (24) miesięcy daje dziwny wynik:
define('ADODB_TEST_DATES',0) - start=2007-12-01 + month=12 => adodb_date=01-01-2009 date=01-12-2008 #
define('ADODB_TEST_DATES',1) - start=2007-12-01 + month=12 => adodb_date=01-01-2009 date=01-12-2008 #

i po 2 latach:
define('ADODB_TEST_DATES',0) - start=2007-12-01 + month=24 => adodb_date=01-01-2010 date=01-12-2009 #
define('ADODB_TEST_DATES',1) - start=2007-12-01 + month=24 => adodb_date=01-01-2010 date=01-12-2009 #

o miesiąc "większy" niż standardowa funkcja mktime i date.

na końcu wydruk za 600 miesięcy:
define('ADODB_TEST_DATES',0) - start=2007-12-01 + month=600 => adodb_date=31-12-2057 date=01-01-1970 #
define('ADODB_TEST_DATES',1) - start=2007-12-01 + month=600 => adodb_date=31-12-2057 date=01-01-1970 #

Czy ktoś zetknął się z tym problemem? I co więcej ma na to jakiś patent?




w_w_w - 31-01-2008 13:11
znaleźliśmy błąd w bibliotece odpowiedzialny za powyższe zachowanie:
jest:

if ($mon > 12) {
$y = floor($mon / 12);
$year += $y;
$mon -= $y*12;
} else if ($mon < 1) {
$y = ceil((1-$mon) / 12);
$year -= $y;
$mon += $y*12;
}

powinno być:
if ($mon > 12) {
$y = floor(($mon-1) / 12);
$year += $y;
$mon -= $y*12;
} else if ($mon < 1) {
$y = ceil((1-$mon) / 12);
$year -= $y;
$mon += $y*12;
}
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?= mysql i mysql-front, problem String line; if (line=="cos"){...}....problem Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?= [postgres] Problem z =?ISO-8859-2?Q?zmian=B1_struktury_i_z?==?ISO-8859-2?Q?ale=BFno=B6ciami=2E?= [oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?= Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ] [PGSQL] czy ktos mial problemy z initdb pgsql 8.1 ? [MySQL] Problem z zapisem danych w bazie danych Problem z mysql - can't connect to MySQL/nietypowo...
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • dirtyboys.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com