Pagina 1 van 1

MOD[Summertime/Wintertime] Script correct?

Geplaatst: 29 okt 2004, 08:27
door djrandall
Is dit script wel in orde?

Code: Selecteer alles

function daytime() 
{ 

$n = date("n"); 
$y = date("Y")-2000; 

if($n >= 3 && $n <= 9) 
{ 
$season = 1; 
$season_math = 5; 
} 
else if ( $n >= 10 || $n < 3 ) 
{ 
$season = 0; 
$season_math = 2; 
} 

$day = 31 - ((((floor(5*$y/4)-floor($y/100)+floor($y/400))+$season_math)%7)+7)%7; 

switch ($season) 
{ 
case 0: 

if( mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")) > mktime (3,0,0,10,$day,date("Y")) ) 
{ 
$result = 0; 
} 
break; 

case 1: 

if( mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")) > mktime(3,0,0,3,$day,date("Y")) ) 
{ 
$result = 3600; 
} 

break; 


} 

return $result; 
} 

Code: Selecteer alles

return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz) + daytime()), $translate) : @gmdate($format, $gmepoch + (3600 * $tz) + daytime()); 
Bij mij sprong hij namelijk vorige maand ineens een uur verder. Terwijl hij dat volgensmij zaterdag op zondag nacht a.s. moet doen.
Ik heb dat toen ff snel opgelost door:

Code: Selecteer alles

if($n >= 3 && $n <= 9) 
{ 
$season = 1; 
$season_math = 5; 
} 
else if ( $n >= 10 || $n < 3 ) 
te vervangen door:

Code: Selecteer alles

if($n >= 3 && $n < 11) 
{ 
$season = 1; 
$season_math = 5; 
} 
else if ( $n >= 11 || $n < 3 ) 
Volgens mij voldoet de zomer/wintertijdregeling in Nederland aan rekenkundige regels, toch?

Geplaatst: 29 okt 2004, 08:32
door Luuk
De "regels" voor de zomertijd is:
In the European Union, Summer Time begins and ends at 1 am Universal Time (Greenwich Mean Time). It starts the last Sunday in March, and ends the last Sunday in October. In the EU, all time zones change at the same moment

Geplaatst: 29 okt 2004, 08:34
door djrandall
Begin zomertijd (vanaf 1981):

Zondag [31 – (f + 5) mod 7] maart (om 1h U.T.C.)

Einde zomertijd (van 1981 t/m 1995):

Zondag [30 – (f + 6) mod 7] september (om 1h U.T.C.)

Einde zomertijd (vanaf 1996):

Zondag [31 – (f + 2) mod 7] oktober (om 1h U.T.C.)

met: f = (floor((5 × jaar)/4) – floor (jaar/100) + floor(jaar/400)) mod 7

De functie floor(x) – ook bekend als de entier functie – is gedefinieerd als het grootste gehele getal kleiner of gelijk aan de inputwaarde. Dus floor(1.99) = floor(1.01) = 1, floor(0) = 0, floor(–1.01) = –2, etc.

De modulo functie (a mod b) is gedefinieerd als de (positieve) rest van de deling van het getal a door het getal b. Dus 5 mod 7 = 5, 13 mod 7 = 6, –3 mod 7 = 4, etc.

De bovenstaande algoritmen gelden zolang de huidige zomertijdregeling van kracht blijft.
Waarom ging mijn tijd dan op 2 sites vorige maand ineens klooien met dit script?

Geplaatst: 30 okt 2004, 11:07
door Luuk
probeer dit eens:

in includes/functions.php
zet achter

Code: Selecteer alles

	if ( empty($translate) && $board_config['default_lang'] != 'english' )
	{
		@reset($lang['datetime']);
		while ( list($match, $replace) = @each($lang['datetime']) )
		{
			$translate[$match] = $replace;
		}
	}

Code: Selecteer alles

	$month = date("m");
	$day_of_month = date("d");
	$hour = date("G");
	$year = date("Y");

	$date_march = (31-( floor($year * 5 / 4) + 4) % 7);
	$date_october =  (31-( floor($year * 5 / 4) + 1) % 7);

	$dst = false;

	if ( $month >= '04' && $month <= '09' )
	{
		$dst = true;
	}
	elseif ( $month == '03' && $day_of_month >= $date_march )
	{
		if ( $day_of_month == $date_march )
		{
			if ( $hour < 1 )
			{
				$dst = false;
			}
			else if ( $hour >= 1 )
			{
				$dst = true;
			}
		}
		elseif ( $day_of_month > $date_march )
		{
			$dst = true;
		}
	}
	elseif ( $month == '10' && $day_of_month <= $date_october )
	{
		if ( $day_of_month == $date_october )
		{
			if ( $hour < 1 )
			{
				$dst = true;
			}
			else if ( $hour >= 1 )
			{
				$dst = false;
			}
		}
		elseif ( $day_of_month < $date_october )
		{
			$dst = true;
		}
	}
	
	$add_dst = ( $dst ) ? '3600' : '0';
vervang dan

Code: Selecteer alles

return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz));
met

Code: Selecteer alles

return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz + $add_dst)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz + $add_dst));
de berekening klopt schijnbaar wel, ik heb hem gejat van deze site. dit is alleen geldig voor de EU

Geplaatst: 01 nov 2004, 10:28
door djrandall
Geweldig.
Het lijkt me dat hij werkt, maar daar komen we achter bij de volgende wisseling.
Staat er op die site ook een uitleg van het script.
De oplossing is natuurlijk geweldig, maar ik probeer het ook een beetje te snappen!
Misschien wil jij het me uitleggen?

Geplaatst: 01 nov 2004, 16:32
door Luuk
het script heb ik zelf gemaakt, maar ik leg het je uit; hopelijk dat je er wijs uit komt :twisted:
$month = date("m");
$day_of_month = date("d");
$hour = date("G");
$year = date("Y");

Hier worden alle gegevens uit gehaald van de datum, tijd, jaar etc.



$date_march = (31-( floor($year * 5 / 4) + 4) % 7);
$date_october = (31-( floor($year * 5 / 4) + 1) % 7);

Dit bepaalt de datum van de tijdwisseling, het script komt van die pagina


$dst = false;

Zomertijd is standaard 'niet waar', nu gaan we kijken wanneer dat het wel waar is


if ( $month >= '04' && $month <= '09' )

Als de maand tussen 4 en 9 zit (dus als later dan het april is of april en eerder dan september is of september)

{
$dst = true;

Zomertijd is 'waar'

}
elseif ( $month == '03' && $day_of_month >= $date_march )

Als de maand 3 is (maart) en de dag is gelijk aan de datum van maart waarop de tijd veranderd of het is later

{
if ( $day_of_month == $date_march )

Als de dag gelijk is aan de dag waarop de datum veranderd

{
if ( $hour < 1 )

En het uur van de dag is kleiner dan 1 (om 1 uur GMT gaat de klok vooruit)

{
$dst = false;

Zomertijd is 'niet waar'

}
else if ( $hour >= 1 )

Als het uur gelijk is aan 1 of groter

{
$dst = true;

Zomertijd is 'waar'

}
}
elseif ( $day_of_month > $date_march )

Anders als de dag groter is dan de dag waarop de tijd veranderd

{
$dst = true;

Zomertijd is 'waar'

}
}
elseif ( $month == '10' && $day_of_month <= $date_october )

Anders als de maand gelijk is aan 10 (oktober) en de dag is gelijk aan de dag waarop de tijd veranderd of kleiner

{
if ( $day_of_month == $date_october )

Als de dag gelijk is aan de dag waarop de tijd veranderd

{
if ( $hour < 1 )

Als het uur kleiner is dan 1

{
$dst = true;

Dan is de zomertijd nog 'waar'

}
else if ( $hour >= 1 )

Anders, als het uur gelijk is aan 1 of groter

{
$dst = false;

Zomertijd is 'niet waar'

}
}
elseif ( $day_of_month < $date_october )

Anders, als de dag kleiner is dan de dag waarop de tijd veranderd

{
$dst = true;

Zomertijd is 'waar'

}
}

$add_dst = ( $dst ) ? '3600' : '0';

Als de zomertijd 'waar' is, doe dan een uur erbij (1 uur = 3600 seconden), anders doe er 0 bij.