FIX Timezone problems

Conflicts:
	htdocs/core/lib/date.lib.php
	test/phpunit/DateLibTest.php
This commit is contained in:
Laurent Destailleur 2021-02-28 22:44:11 +01:00
parent 5406de13ee
commit 490faec547
2 changed files with 49 additions and 83 deletions

View File

@ -620,7 +620,7 @@ function dol_get_first_day_week($day, $month, $year, $gm = false)
*/ */
function getGMTEasterDatetime($year) function getGMTEasterDatetime($year)
{ {
$base = new DateTime("$year-03-21"); $base = new DateTime("$year-03-21", new DateTimeZone("UTC"));
$days = easter_days($year); // Return number of days between 21 march and easter day. $days = easter_days($year); // Return number of days between 21 march and easter day.
$tmp = $base->add(new DateInterval("P{$days}D")); $tmp = $base->add(new DateInterval("P{$days}D"));
return $tmp->getTimestamp(); return $tmp->getTimestamp();
@ -628,11 +628,11 @@ function getGMTEasterDatetime($year)
/** /**
* Return the number of non working days including saturday and sunday (or not) between 2 dates in timestamp. * Return the number of non working days including saturday and sunday (or not) between 2 dates in timestamp.
* Dates must be UTC with hour, day, min to 0. * Dates must be UTC with hour, min, sec to 0.
* Called by function num_open_day() * Called by function num_open_day()
* *
* @param int $timestampStart Timestamp de debut * @param int $timestampStart Timestamp start (UTC with hour, min, sec = 0)
* @param int $timestampEnd Timestamp de fin * @param int $timestampEnd Timestamp end (UTC with hour, min, sec = 0)
* @param string $country_code Country code * @param string $country_code Country code
* @param int $lastday Last day is included, 0: no, 1:yes * @param int $lastday Last day is included, 0: no, 1:yes
* @param int $includesaturday Include saturday as non working day (-1=use setup, 0=no, 1=yes) * @param int $includesaturday Include saturday as non working day (-1=use setup, 0=no, 1=yes)
@ -721,32 +721,20 @@ function num_public_holiday($timestampStart, $timestampEnd, $country_code = '',
{ {
// Calculation for the monday of easter date // Calculation for the monday of easter date
$date_paques = getGMTEasterDatetime($annee); $date_paques = getGMTEasterDatetime($annee);
$date_lundi_paques = mktime( //print 'PPP'.$date_paques.' '.dol_print_date($date_paques, 'dayhour', 'gmt')." ";
gmdate("H", $date_paques), $date_lundi_paques = $date_paques + (3600 * 24);
gmdate("i", $date_paques),
gmdate("s", $date_paques),
gmdate("m", $date_paques),
gmdate("d", $date_paques) + 1,
gmdate("Y", $date_paques)
);
$jour_lundi_paques = gmdate("d", $date_lundi_paques); $jour_lundi_paques = gmdate("d", $date_lundi_paques);
$mois_lundi_paques = gmdate("m", $date_lundi_paques); $mois_lundi_paques = gmdate("m", $date_lundi_paques);
if ($jour_lundi_paques == $jour && $mois_lundi_paques == $mois) $ferie = true; if ($jour_lundi_paques == $jour && $mois_lundi_paques == $mois) $ferie = true;
// Easter (monday) // Easter (monday)
//print 'annee='.$annee.' $jour='.$jour.' $mois='.$mois.' $jour_lundi_paques='.$jour_lundi_paques.' $mois_lundi_paques='.$mois_lundi_paques."\n";
} }
if (in_array('ascension', $specialdayrule)) if (in_array('ascension', $specialdayrule))
{ {
// Calcul du jour de l'ascension (39 days after easter day) // Calcul du jour de l'ascension (39 days after easter day)
$date_paques = getGMTEasterDatetime($annee); $date_paques = getGMTEasterDatetime($annee);
$date_ascension = mktime( $date_ascension = $date_paques + (3600 * 24 * 39);
gmdate("H", $date_paques),
gmdate("i", $date_paques),
gmdate("s", $date_paques),
gmdate("m", $date_paques),
gmdate("d", $date_paques) + 39,
gmdate("Y", $date_paques)
);
$jour_ascension = gmdate("d", $date_ascension); $jour_ascension = gmdate("d", $date_ascension);
$mois_ascension = gmdate("m", $date_ascension); $mois_ascension = gmdate("m", $date_ascension);
if ($jour_ascension == $jour && $mois_ascension == $mois) $ferie = true; if ($jour_ascension == $jour && $mois_ascension == $mois) $ferie = true;
@ -757,14 +745,7 @@ function num_public_holiday($timestampStart, $timestampEnd, $country_code = '',
{ {
// Calculation of "Pentecote" (49 days after easter day) // Calculation of "Pentecote" (49 days after easter day)
$date_paques = getGMTEasterDatetime($annee); $date_paques = getGMTEasterDatetime($annee);
$date_pentecote = mktime( $date_pentecote = $date_paques + (3600 * 24 * 49);
gmdate("H", $date_paques),
gmdate("i", $date_paques),
gmdate("s", $date_paques),
gmdate("m", $date_paques),
gmdate("d", $date_paques) + 49,
gmdate("Y", $date_paques)
);
$jour_pentecote = gmdate("d", $date_pentecote); $jour_pentecote = gmdate("d", $date_pentecote);
$mois_pentecote = gmdate("m", $date_pentecote); $mois_pentecote = gmdate("m", $date_pentecote);
if ($jour_pentecote == $jour && $mois_pentecote == $mois) $ferie = true; if ($jour_pentecote == $jour && $mois_pentecote == $mois) $ferie = true;
@ -774,14 +755,7 @@ function num_public_holiday($timestampStart, $timestampEnd, $country_code = '',
{ {
// Calculation of "Pentecote" (49 days after easter day) // Calculation of "Pentecote" (49 days after easter day)
$date_paques = getGMTEasterDatetime($annee); $date_paques = getGMTEasterDatetime($annee);
$date_pentecote = mktime( $date_pentecote = $date_paques + (3600 * 24 * 50);
gmdate("H", $date_paques),
gmdate("i", $date_paques),
gmdate("s", $date_paques),
gmdate("m", $date_paques),
gmdate("d", $date_paques) + 50,
gmdate("Y", $date_paques)
);
$jour_pentecote = gmdate("d", $date_pentecote); $jour_pentecote = gmdate("d", $date_pentecote);
$mois_pentecote = gmdate("m", $date_pentecote); $mois_pentecote = gmdate("m", $date_pentecote);
if ($jour_pentecote == $jour && $mois_pentecote == $mois) $ferie = true; if ($jour_pentecote == $jour && $mois_pentecote == $mois) $ferie = true;
@ -792,14 +766,7 @@ function num_public_holiday($timestampStart, $timestampEnd, $country_code = '',
{ {
// Viernes Santo // Viernes Santo
$date_paques = getGMTEasterDatetime($annee); $date_paques = getGMTEasterDatetime($annee);
$date_viernes = mktime( $date_viernes = $date_paques - (3600 * 24 * 2);
gmdate("H", $date_paques),
gmdate("i", $date_paques),
gmdate("s", $date_paques),
gmdate("m", $date_paques),
gmdate("d", $date_paques) - 2,
gmdate("Y", $date_paques)
);
$jour_viernes = gmdate("d", $date_viernes); $jour_viernes = gmdate("d", $date_viernes);
$mois_viernes = gmdate("m", $date_viernes); $mois_viernes = gmdate("m", $date_viernes);
if ($jour_viernes == $jour && $mois_viernes == $mois) $ferie = true; if ($jour_viernes == $jour && $mois_viernes == $mois) $ferie = true;
@ -810,14 +777,7 @@ function num_public_holiday($timestampStart, $timestampEnd, $country_code = '',
{ {
// Fronleichnam (60 days after easter sunday) // Fronleichnam (60 days after easter sunday)
$date_paques = getGMTEasterDatetime($annee); $date_paques = getGMTEasterDatetime($annee);
$date_fronleichnam = mktime( $date_fronleichnam = $date_paques + (3600 * 24 * 60);
gmdate("H", $date_paques),
gmdate("i", $date_paques),
gmdate("s", $date_paques),
gmdate("m", $date_paques),
gmdate("d", $date_paques) + 60,
gmdate("Y", $date_paques)
);
$jour_fronleichnam = gmdate("d", $date_fronleichnam); $jour_fronleichnam = gmdate("d", $date_fronleichnam);
$mois_fronleichnam = gmdate("m", $date_fronleichnam); $mois_fronleichnam = gmdate("m", $date_fronleichnam);
if ($jour_fronleichnam == $jour && $mois_fronleichnam == $mois) $ferie = true; if ($jour_fronleichnam == $jour && $mois_fronleichnam == $mois) $ferie = true;

View File

@ -69,7 +69,13 @@ class DateLibTest extends PHPUnit\Framework\TestCase
$this->savlangs=$langs; $this->savlangs=$langs;
$this->savdb=$db; $this->savdb=$db;
$langs->load("admin");
print __METHOD__." db->type=".$db->type." user->id=".$user->id; print __METHOD__." db->type=".$db->type." user->id=".$user->id;
print "\n".$langs->trans("CurrentTimeZone").' : '.getServerTimeZoneString();
print "\n".$langs->trans("CurrentHour").' : '.dol_print_date(dol_now('gmt'), 'dayhour', 'tzserver');
//print " - db ".$db->db; //print " - db ".$db->db;
print "\n"; print "\n";
} }
@ -139,8 +145,8 @@ class DateLibTest extends PHPUnit\Framework\TestCase
$db=$this->savdb; $db=$this->savdb;
// With same hours // With same hours
$date1=dol_mktime(0, 0, 0, 1, 1, 2012); $date1=dol_mktime(0, 0, 0, 1, 1, 2012, 'gmt');
$date2=dol_mktime(0, 0, 0, 1, 2, 2012); $date2=dol_mktime(0, 0, 0, 1, 2, 2012, 'gmt');
$result=num_between_day($date1, $date2, 1); $result=num_between_day($date1, $date2, 1);
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
@ -151,8 +157,8 @@ class DateLibTest extends PHPUnit\Framework\TestCase
$this->assertEquals(1, $result); $this->assertEquals(1, $result);
// With different hours // With different hours
$date1=dol_mktime(0, 0, 0, 1, 1, 2012); $date1=dol_mktime(0, 0, 0, 1, 1, 2012, 'gmt');
$date2=dol_mktime(12, 0, 0, 1, 2, 2012); $date2=dol_mktime(12, 0, 0, 1, 2, 2012, 'gmt');
$result=num_between_day($date1, $date2, 1); $result=num_between_day($date1, $date2, 1);
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
@ -190,26 +196,27 @@ class DateLibTest extends PHPUnit\Framework\TestCase
$langs=$this->savlangs; $langs=$this->savlangs;
$db=$this->savdb; $db=$this->savdb;
// With same hours - Tuesday/Wednesday jan 2013 // With same hours - Tuesday/Wednesday jan 2013
$date1=dol_mktime(0, 0, 0, 1, 1, 2013); $date1=dol_mktime(0, 0, 0, 1, 1, 2013, 'gmt');
$date2=dol_mktime(0, 0, 0, 1, 2, 2013); $date2=dol_mktime(0, 0, 0, 1, 2, 2013, 'gmt');
$date3=dol_mktime(0, 0, 0, 1, 3, 2013); $date3=dol_mktime(0, 0, 0, 1, 3, 2013, 'gmt');
$result=num_public_holiday($date1, $date2, 'FR', 1); $result=num_public_holiday($date1, $date2, 'FR', 1);
print __METHOD__." result=".$result."\n"; print __METHOD__." for Tuesday 1 - Wednesday 2 jan 2013 for FR result=".$result."\n";
$this->assertEquals(1, $result, 'NumPublicHoliday for Tuesday 1 - Wednesday 2 jan 2013 for FR'); // 1 closed days (country france) $this->assertEquals(1, $result, 'NumPublicHoliday for Tuesday 1 - Wednesday 2 jan 2013 for FR'); // 1 closed days (country france)
$result=num_public_holiday($date1, $date2, 'XX', 1); $result=num_public_holiday($date1, $date2, 'XX', 1);
print __METHOD__." result=".$result."\n"; print __METHOD__." for Tuesday 1 - Wednesday 2 jan 2013 for XX result=".$result."\n";
$this->assertEquals(1, $result, 'NumPublicHoliday for Tuesday 1 - Wednesday 2 jan 2013 for XX'); // 1 closed days (country unknown) $this->assertEquals(1, $result, 'NumPublicHoliday for Tuesday 1 - Wednesday 2 jan 2013 for XX'); // 1 closed days (country unknown)
$result=num_public_holiday($date2, $date3, 'FR', 1); print '----'."\n";
print __METHOD__." result=".$result."\n"; $result=num_public_holiday($date2, $date3, 'FR', 1);
$this->assertEquals(0, $result, 'NumPublicHoliday for Wednesday 2 - Thursday 3 jan 2013 for FR'); // no closed days print __METHOD__." for Wednesday 2 - Thursday 3 jan 2013 for FR result=".$result."\n";
$this->assertEquals(0, $result, 'NumPublicHoliday for Wednesday 2 - Thursday 3 jan 2013 for FR'); // no closed days
// Check with easter monday // Check with easter monday
$date1=dol_mktime(0, 0, 0, 4, 21, 2019); $date1=dol_mktime(0, 0, 0, 4, 21, 2019, 'gmt');
$date2=dol_mktime(0, 0, 0, 4, 23, 2019); $date2=dol_mktime(0, 0, 0, 4, 23, 2019, 'gmt');
$result=num_public_holiday($date1, $date2, 'XX', 1); $result=num_public_holiday($date1, $date2, 'XX', 1);
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
@ -219,9 +226,9 @@ class DateLibTest extends PHPUnit\Framework\TestCase
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
$this->assertEquals(2, $result, 'NumPublicHoliday including eastermonday for FR'); // 1 opened day, 2 closed days (sunday + easter monday) $this->assertEquals(2, $result, 'NumPublicHoliday including eastermonday for FR'); // 1 opened day, 2 closed days (sunday + easter monday)
// Check for sunday/saturday - Friday 4 - Sunday 6 jan 2013 // Check for sunday/saturday - Friday 4 - Sunday 6 jan 2013
$date1=dol_mktime(0, 0, 0, 1, 4, 2013); $date1=dol_mktime(0, 0, 0, 1, 4, 2013, 'gmt');
$date2=dol_mktime(0, 0, 0, 1, 6, 2013); $date2=dol_mktime(0, 0, 0, 1, 6, 2013, 'gmt');
$result=num_public_holiday($date1, $date2, 'FR', 1); $result=num_public_holiday($date1, $date2, 'FR', 1);
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
@ -257,10 +264,10 @@ class DateLibTest extends PHPUnit\Framework\TestCase
$langs=$this->savlangs; $langs=$this->savlangs;
$db=$this->savdb; $db=$this->savdb;
// With same hours - Tuesday/Wednesday jan 2013 // With same hours - Tuesday/Wednesday jan 2013
$date1=dol_mktime(0, 0, 0, 1, 1, 2013); $date1=dol_mktime(0, 0, 0, 1, 1, 2013, 'gmt');
$date2=dol_mktime(0, 0, 0, 1, 2, 2013); $date2=dol_mktime(0, 0, 0, 1, 2, 2013, 'gmt');
$date3=dol_mktime(0, 0, 0, 1, 3, 2013); $date3=dol_mktime(0, 0, 0, 1, 3, 2013, 'gmt');
$result=num_open_day($date1, $date2, 0, 1, 0, 'FR'); $result=num_open_day($date1, $date2, 0, 1, 0, 'FR');
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
@ -274,9 +281,9 @@ class DateLibTest extends PHPUnit\Framework\TestCase
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
$this->assertEquals(2, $result, 'NumOpenDay Wednesday 2 - Thursday 3 jan 2013 for FR'); // 2 opened days $this->assertEquals(2, $result, 'NumOpenDay Wednesday 2 - Thursday 3 jan 2013 for FR'); // 2 opened days
// With same hours - Friday/Sunday jan 2013 // With same hours - Friday/Sunday jan 2013
$date1=dol_mktime(0, 0, 0, 1, 4, 2013); $date1=dol_mktime(0, 0, 0, 1, 4, 2013, 'gmt');
$date2=dol_mktime(0, 0, 0, 1, 6, 2013); $date2=dol_mktime(0, 0, 0, 1, 6, 2013, 'gmt');
$result=num_open_day($date1, $date2, 0, 1, 0, 'FR'); $result=num_open_day($date1, $date2, 0, 1, 0, 'FR');
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
@ -328,7 +335,6 @@ class DateLibTest extends PHPUnit\Framework\TestCase
print __METHOD__." result=".$result."\n"; print __METHOD__." result=".$result."\n";
$this->assertSame('1 '.$langs->trans("Day"), $result); $this->assertSame('1 '.$langs->trans("Day"), $result);
return $result; return $result;
} }