Seite 1 von 2

Formula 1 WebTip - Problem mit der Sommerzeit

Verfasst: 08.04.2007 04:34
von Dungeonwatcher
Moin! 8)

Seit der Zeitumstellung habe ich wieder ein massives Problem mit der angezeigten Zeit von Rennbeginn und Deadline. Alle Rennzeiten die vor der Zeitumstellung eingetragen wurden sind um 1h verschoben (anstelle 14:00 Uhr nun 15:00 Uhr etc.). :-?

Nächstes Problem betrifft die Änderung der Rennzeit am Renntag. Wenn ich diese ändern will steht im Editiermodus nicht die vorherige (falsche) Zeit, sondern sie fehlt ganz und muss kplt. neu eingetragen werden, allerdings dann die korrekte Zeit.

Ändere ich nun die anderen falschen Rennzeiten, dann muss ich dort wieder 1h abziehen, statt 14:00 muss ich 13:00 Uhr angeben.

Der Versuch in der admin_formel_racec.php diesen Code von

Code: Alles auswählen

	$racetime = mktime($b_hour, $b_minute, $b_second, $b_month, $b_day, $b_year, date("I"));
	//$racetime -= $board_config['board_timezone'] * 3600;
in

Code: Alles auswählen

	$racetime = mktime($b_hour, $b_minute, $b_second, $b_month, $b_day, $b_year, date("0"));
	$racetime -= $board_config['board_timezone'] * 3600;
zu ändern brachte nur einen Teilerfolg. Damit funktioniert zwar das Eintragen und die Anzeige der Rennzeiten, nur äuft die Deadline 1h zu früh ab.

Dieses Problem hatte ich schon im letzten Jahr und konnte es nicht lösen, darum nun ein erneuter Versuch die Lösung zu finden. Was läuft hier so vollkommen falsch?

Verfasst: 08.04.2007 20:42
von Miriam

Code: Alles auswählen

date("I")
ist 1, wenn die Sommerzeit aktuell ist ansonsten 0. Von daher ist

Code: Alles auswählen

date("0")
eigentlich unsinnig.
Dummerweise gilt

Code: Alles auswählen

date("I") == 1 
für alle Zeiten. Also auch für die Zeiten, die vor der Sommerzeit beginnen, da Dein Board wahrscheinlich schon die Zeitumstellung mitmacht und es somit evtl. eine doppelte Verschiebung der Zeit um eine Stunde gibt.

Du müsstest also eine Unterscheidung treffen, ab wann die Sommerzeit gilt und

Code: Alles auswählen

date("I")
wirken "darf".
Ansatz: Die Sommerzeit beginnt am letzten Sonntag im März und endet am letzten Sonntag im Oktober.

Verfasst: 09.04.2007 17:33
von Dungeonwatcher
Hi! 8)
Miriam hat geschrieben:...da Dein Board wahrscheinlich schon die Zeitumstellung mitmacht und es somit evtl. eine doppelte Verschiebung der Zeit um eine Stunde gibt.
Jupp, genauso ist es. Hier rödelt ein eigener lokaler Webserver unter meinem Schreibtisch im Wohnzimmer. Darauf tut OS/2 (Wer's noch kennt...:grin:) bestens als BS seinen Dienst. Die Systemzeit wird korrekterweise automatisch zum Beginn und zum Ende der Sommerzeit umgestellt. Nur wie bringe ich es dem F1 Mod bei, das dies bereits geschieht und er dies nicht selber umstellen braucht? PHP ist nicht wirklich meine Stärke. :oops:

Verfasst: 09.04.2007 18:36
von roger
Hi,

laut php-Manual heisst es bei mktime() u.a.:
is_dst kann bei Sommerzeit auf 1 gesetzt werden. 0 bedeutet Winter-/Normalzeit, -1 (Vorgabewert) heißt, dass nicht bekannt ist, ob Sommer- oder Winterzeit herrscht. Falls nicht bekannt ist, ob Sommer- oder Winterzeit herrscht, versucht PHP dies selbst herauszufinden. Das kann zu unerwarteten (aber dennoch korrekten) Ergebnissen führen.
Unter der Voraussetzung, dass du sowieso die Sommerzeit automatisch einstellst, war deine Idee gar nicht so schlecht:

Code: Alles auswählen

$racetime = mktime($b_hour, $b_minute, $b_second, $b_month, $b_day, $b_year, date("0")); 
Ich würde es aber mit

Code: Alles auswählen

$racetime = mktime($b_hour, $b_minute, $b_second, $b_month, $b_day, $b_year, 0); 
versuchen.

roger

Verfasst: 09.04.2007 18:41
von Miriam
OS/2 Warp? *ggg*

Wie wird denn die Deadline eingetragen... also wie sieht der Code aus?

Verfasst: 09.04.2007 18:53
von Dungeonwatcher
Miriam hat geschrieben:OS/2 Warp? *ggg*
Naja, mittlerweile heißt es ja eComStation. :wink:
Wie wird denn die Deadline eingetragen... also wie sieht der Code aus?
Der Verantwortliche Code dürfte in diesen beiden Dateien sein:

admin_formel_races.php
bzw.
formel.php

Verfasst: 09.04.2007 19:15
von easygo
Deadline = Differenz aus Rennbeginn und eingestelltem Wert für Deadline Offset (in Sekunden)
Dürfte also nicht das Problem sein. Vorausgesetzt, deine Zeit für Rennbeginn stimmt. easy

Formel 1 - Deadline 1h zu früh?

Verfasst: 01.07.2007 18:30
von Dungeonwatcher
'n Abend! 8)
easygo hat geschrieben:Deadline = Differenz aus Rennbeginn und eingestelltem Wert für Deadline Offset (in Sekunden)
Dürfte also nicht das Problem sein. Vorausgesetzt, deine Zeit für Rennbeginn stimmt.
Die eingetragenen und die angezeigten Zeiten stimmen.

Dies dürfte der verantwortliche Code sein:

Code: Alles auswählen

//
// Add/edit a tipp
//
if ( ($place_my_tipp || $edit_my_tipp) && $tipp_time > time() - $formel_config['deadline_offset'] ) 
{
	for ($i = 0; $i < 8; $i++) 
	{
		$value = $HTTP_POST_VARS['place'.($i+1)];
		if (checkarrayforvalue($value,$my_tipp_array)) 
		{
			$tipp_msg = sprintf($lang['formel_doublicate_values'], '<a href="javascript:history.back()" class="gen">', '</a>', '<a href="'.append_sid("index.$phpEx").'" class="gen">', '</a>');
			message_die(GENERAL_MESSAGE, $tipp_msg);
		}
		$my_tipp_array[$i] = $value;
	}
	$my_tipp_array[8] = $HTTP_POST_VARS['place9'];
	$my_tipp_array[9] = $HTTP_POST_VARS['place10'];
	$my_tipp = implode(",",$my_tipp_array);

	if ($place_my_tipp) 
	{
		$sql = "INSERT INTO " . FORMEL_TIPPS_TABLE . " 
				(tipp_id,tipp_user,tipp_race,tipp_result,tipp_points)
				VALUES 
				('',$user_id,$race_id,'$my_tipp',0)";
	}
	else 
	{
		$sql = "UPDATE " . FORMEL_TIPPS_TABLE . " SET tipp_result = '$my_tipp'
				WHERE tipp_user = $user_id 
				AND tipp_race = $race_id";
	}
	if (!$result = $db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Could not update database', '', __LINE__, __FILE__, $sql);
	}
	$tipp_msg = sprintf($lang['formel_accepted_tipp'], '<a href="'.append_sid("formel.$phpEx").'" class="gen">', '</a>', '<a href="'.append_sid("index.$phpEx").'" class="gen">', '</a>');
	message_die(GENERAL_MESSAGE, $tipp_msg);
}
Bye/2

Re: Formel 1 - Deadline 1h zu früh?

Verfasst: 03.07.2007 09:16
von Dungeonwatcher
Moin! 8)
Dungeonwatcher hat geschrieben:
easygo hat geschrieben:Deadline = Differenz aus Rennbeginn und eingestelltem Wert für Deadline Offset (in Sekunden)
Dürfte also nicht das Problem sein. Vorausgesetzt, deine Zeit für Rennbeginn stimmt.
Die eingetragenen und die angezeigten Zeiten stimmen.
Hier muss ich mich jetzt mal korrigieren. Es stimmen zwar die angezeigten Werte, aber in die Datenbank wird ein falscher Wert eingetragen:

1183442580 - wurde in die Tabelle gespeichert (08:03) <- falsch
1183446180 - aktuelle Zeit (09:03) <- korrekt

Wie unschwer zu sehen ist, werden hier 3600 Sekunden (= 1h) zu wenig berechnet und in die Datenbank eingetragen. Dafür dürfte dieser Codeschnipsel aus der admin_formel_races.php verantwortlich sein:

Code: Alles auswählen

//
// Add a new race
//
if( $button_add && $racename != '' )
{
	$racetime = mktime($b_hour, $b_minute, $b_second, $b_month, $b_day, $b_year, date("0"));
	$racetime -= $board_config['board_timezone'] * 3600;

echo $racetime.' - wurde in die Tabelle gespeichert<br />';
echo time().' - aktuelle Zeit<br />';

         if ( $race_id == 0 )
         {
             $sql = "INSERT INTO " . FORMEL_RACES_TABLE . " (race_id,race_name,race_img,race_time,race_length,race_laps,race_distance,race_debut) 
                     VALUES ('','$racename','$raceimg',$racetime,'$racelength',$racelaps,'$racedistance',$racedebut)";
         }
         else {
             if ( $formel_config['show_gfxr'] == 1 )
             {
             $sql = "UPDATE " . FORMEL_RACES_TABLE . " 
                     SET race_name = '$racename',race_img = '$raceimg',race_time = $racetime,race_length = '$racelength',race_laps = $racelaps,race_distance = '$racedistance',race_debut = $racedebut
                     WHERE race_id = $race_id";
             }
             else {
             $sql = "UPDATE " . FORMEL_RACES_TABLE . " 
                     SET race_name = '$racename',race_time = $racetime,race_length = '$racelength',race_laps = $racelaps,race_distance = '$racedistance',race_debut = $racedebut
                     WHERE race_id = $race_id";
             }
         }
         if (!$result = $db->sql_query($sql))
         {
	        message_die(GENERAL_ERROR, 'Could not update database', '', __LINE__, __FILE__, $sql);
         }
         $status =  str_replace('MESSAGE', $lang['formel_acp_racebd_updated'], $status_msg);
}
Bye/2

Verfasst: 03.07.2007 11:00
von Dr.Death
Das Problem mit der Winter/Sommerzeit tritt nur beim Eintragen der Rennen auf.

Die Zeit in der Tabelle muss zum Schluss reine UTC sein.

Da einige Rennen in der Winterzeit und der Rest in der Sommerzeit stattfinden kann ich nicht fest sagen:
Bei den ersten beiden Rennen UTC + Board-Timezone und der Rest UTC + Board-Timezone + Sommerzeit berechnen.
Zudem es nicht immer 2 Winterzeitrennen gibt/geben wird :o
Im phpbb3 F1 MOD hab ich es so gelöst, das man bei der Eingabe sein Profil zwischenzeitlich verstellen kann. ( Sommerzeit an oder aus )


P.S. Ich selbst trage alle Renntermine im "Winter" ein, und trage für die "Sommer Rennen" eine Stunde früher ein. ( Uhr wird ja vor-gestellt.... damit passt es dann wieder )