Ich hab mir für meine 0.9.7 ne eigene date() Funktion geschrieben, die sich nach der Spielzeit richtet. Hierfür hab ich jedoch einen systematischen Kalender von
hier verwendet.
Grob beschrieben unterteilt dieser das Jahr in:
365 Tage
5 Tage pro Woche (Do. und Sa. fallen weg)
30 Tage pro Monat
12 Monate plus eine Restwoche
In logd_date() sind fast alle Platzhalter wie in der normalen date() Funktion enthalten.
Somemrzeit, Schaltjahre und Zeitzohnen sind nicht miteinberechnet weshalb "
L" und "
I" immer
0 sowie "
O" (GMT) immer
+0000 zurückgibt
Da ich ne andere date() Beschreibung verwendet habe, liefter "
B" die Tage bis Jahresende statt der Swatchzeit zurück. Finde ich aber persönlich sinnvoller
"
T" und "
Z" sind nicht definiert.
getsetting("starttime","2009-01-01 00:00:00") legt die Startzeit des Servers und somit den Beginn der Zeitrechnung fest.
getsetting("daysperday",4) wird als Multiplikator für den Zeitunterschied von Spielzeit zu Realzeit verwendet. 1 wäre Realzeit, 4 wäre 4x so schnell (also 4 Tage pro Tag). Theoretisch sind auch Dezimalstellen verwendbar, sofern man aber die originalen Zeitfunktionen nicht zerhauen will, sollte man diese nicht bei daysperday verwenden
Zeitangabe auf der Indexseite könnte so aussehen:
PHP:
output("`@Wir schreiben den `%".logd_date("j.n.Y")."`@.`0`n");
output("`@Die gegenwärtige Zeit im Dorf ist `%".logd_date("g:i a")."`@.`0`n");
Und hier die Funktion
$this->bbcode_second_pass_code('', '<?php
// logd_date() by ibeg18@sms.at - Anpera: Welv
function logd_date($format,$gettime=false){
// Systematischer Kalender von http://www.ieao.de/kalender.htm#Kalender
//////////////////////////////////////////////////////////////////////////////
if(is_int($gettime)){
$time=(int)$gettime;
$gettime=true;
}else{
$starttime=strtotime(getsetting("starttime","2009-01-01 00:00:00"));
$time=time()-$starttime;
$gettime=false;
}
$temptime=$time;
$logd_tage=array("Sonntag","Montag","Dienstag","Mittwoch","Freitag");
$logd_monate=array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember","Restwoche");
//////////////////////////////////////////////////////////////////////////////
$daysperday=getsetting("daysperday",4);
if($daysperday<0) $daysperday=1;
$yearlen=(31536000/$daysperday);
$daylen=($yearlen/365);
$weeklen=($daylen*5);
$monthlen=($daylen*30);
$hourlen=($daylen/24);
$minutelen=(($daylen/24)/60);
$secondlen=((($daylen/24)/60)/60);
//////////////////////////////////////////////////////////////////////////////
if($time>=$yearlen){
$year=floor($time/$yearlen);
$time-=($year*$yearlen);
}else $year=0;
if($time>=$monthlen){
$month=floor($time/$monthlen);
$time-=($month*$monthlen);
}else $month=0;
if($time>=$weeklen){
$week=floor($time/$weeklen);
$time-=($week*$weeklen);
}else $week=0;
if($time>=$daylen){
$day=floor($time/$daylen);
$time-=($day*$daylen);
}else $day=0;
if($time>=$hourlen){
$hour=floor($time/$hourlen);
$time-=($hour*$hourlen);
}else $hour=0;
if($time>=$minutelen){
$minute=floor($time/$minutelen);
$time-=($minute*$minutelen);
}else $minute=0;
if($time>=$secondlen){
$second=floor($time/$secondlen);
$time-=($second*$secondlen);
}else $second=0;
//////////////////////////////////////////////////////////////////////////////
$formatarr=array();
/*****************************
• a - "am" oder "pm"
• A - "AM" oder "PM"
*/
if($hour>12 || ($hour==12 && $second>0)){
$formatarr['a']="pm";
$formatarr['A']="PM";
}else{
$formatarr['a']="am";
$formatarr['A']="AM";
}
/******************************
• s - Sekunden *(00–59)*/
$formatarr['s']=sprintf('%02d', $second);
/******************************
• i - Minuten *(00-59)*/
$formatarr['i']=sprintf('%02d', $minute);
/******************************
• g - Stunde im 12-Stunden-Format (1-12)*/
$formatarr['g']=$hour;
if($hour>12) $formatarr['g']-=12;
/******************************
• G - Stunde im 24-Stunden-Format (0-23)*/
$formatarr['G']=$hour;
/******************************
• h - Stunde im 12-Stunden-Format *(01-12)*/
$formatarr['h']=sprintf('%02d', $formatarr['g']);
/******************************
• H - Stunde im 24-Stunden-Format *(00-23)*/
$formatarr['H']=sprintf('%02d', $formatarr['G']);
/******************************
• n - Monat (1-12 od 13:Restwoche)*/
$formatarr['n']=($month+1);
/******************************
• m - Monat *(01-12 od 13:Restwoche)*/
$formatarr['m']=sprintf('%02d', $formatarr['n']);
/******************************
• Y - Jahreszahl, vierstellig (2001)*/
$formatarr['Y']=sprintf('%04d', ($year+1));
/******************************
• y - Jahreszahl, zweistellig (01)*/
$formatarr['y']=substr($formatarr['Y'],-2);
/******************************
• z - Tag des Jahres (z.B. 148)*/
$formatarr['z']=ceil($temptime/$daylen);
/******************************
• W - Wochennummer des Jahres (z.B.: 28)*/
$formatarr['W']=ceil($formatarr['z']/5);
/******************************
• B - Tage bis Jahresende */
$formatarr['B']=(365 - $formatarr['z']);
/******************************
• j - Tag des Monats (1-30)*/
$formatarr['j']=($week*5)+($day+1);
/******************************
• d - Tag des Monats *( 01 – 30 )*/
$formatarr['d']=sprintf('%02d', $formatarr['j']);
/******************************
• w - Wochentag (0(Sonntag) bis 5(Freitag))*/
$formatarr['w']=($day+1);
if($formatarr['w']==5) $formatarr['w']=0;
/******************************
• l - (kleines L) ausgeschriebener Wochentag (Montag)*/
$formatarr['l']=$logd_tage[$formatarr['w']];
/******************************
• D - Tag der Woche ( Mon – 3stellig)*/
$formatarr['D']=substr($formatarr['l'],0,3);
/******************************
• F - Monatsangabe (Dezember – ganzes Wort)*/
$formatarr['F']=$logd_monate[$month];
/******************************
• M - Monatsangabe (Dez – 3stellig)*/
$formatarr['M']=substr($formatarr['F'],0,3);
/******************************
• t - Anzahl der Tage des Monats (30 od 7)*/
if($formatarr['W']==73) $formatarr['t']=7;
else $formatarr['t']=30;
/******************************
• I - (großes i) 1 bei Sommerzeit, 0 bei Winterzeit*/
$formatarr['I']=0;
/******************************
• L - Schaltjahr = 1, kein Schaltjahr = 0*/
$formatarr['L']=0;
/******************************
• O - Zeitunterschied gegenüber Greenwich (GMT) in Stunden (z.B.: +0100)*/
$formatarr['O']="+0000";
/******************************
• U - Spielsekunden seit Serverstartzeit*/
if($gettime) $formatarr['U']=$temptime;
else $formatarr['U']=round($temptime*$daysperday);
/******************************
• S - Englische Aufzählung (z.B: "jS" für 22nd)*/
$engl=array("th","st","nd","rd","th","th","th","th","th","th");
if($formatarr['j']<10 || $formatarr['j']>20) $formatarr['S']=$engl[(int)substr($formatarr['j'],-1)];
else $formatarr['S']="th";
/******************************
• T - Zeitzoneneinstellung des Rechners (z.B. CEST)*/
/******************************
• Z - Offset der Zeitzone gegenüber GTM (-43200 – 43200) in Minuten*/
/******************************
• r - Formatiertes Datum (z.B.: Tue, 6 Jul 2004 22:58:15 +0200)*/
$formatarr['r']=$formatarr['D'].", ".$formatarr['j']." ".$formatarr['M']." ".$formatarr['Y']." ".$formatarr['H'].":".$formatarr['i'].":".$formatarr['s']." ".$formatarr['O'];
/******************************
• x - Zeit bis nächsten Tag in Spielsekunden*/
$formatarr['x']=round(86400 - (($hour*60*60)+($minute*60)+($second)));
/******************************
• X - Zeit bis nächsten Tag in Realsekunden*/
$formatarr['X']=round($formatarr['x']/$daysperday);
//////////////////////////////////////////////////////////////////////////////
$x=strlen($format);
$y="";
for($i=0;$i<$x;$i++){
$key=substr($format,$i,1);
if(isset($formatarr[$key])) $y.=$formatarr[$key];
else $y.=$key;
}
return $y;
}
?>')
Verbesserungsvorschläge werden gerne angenommen
[Changelog]
. Eliwoods sprintf() Vorschlag umgesetzt
. Zeit bis zum nächsten Tag hinzugefügt:
PHP:
/******************************
• x - Zeit bis nächsten Tag in Spielsekunden*/
$formatarr['x']=round(86400 - (($hour*60*60)+($minute*60)+($second)));
/******************************
• X - Zeit bis nächsten Tag in Realsekunden*/
$formatarr['X']=round($formatarr['x']/$daysperday);
Neuer Tag Anzeige z.B.:
$tomorrow=str_replace(array("{1}","{2}","{3}"), array(" Stunden, "," Minuten, "," Sekunden "), date("h{1}i{2}s {3}",logd_date("X")));
output("`@Nächster neuer Tag in: `3 ".$tomorrow."`0`n`n");