anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Sa 24 Aug, 2019 23:42

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo 31 Aug, 2009 12:47 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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 :D
"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");


Zuletzt geändert von Welv am Mo 31 Aug, 2009 16:59, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo 31 Aug, 2009 14:01 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3922
Wohnort: Basel
Geschlecht: Männlich
Schonmal was von sprintf gehört?
$this->bbcode_second_pass_code('', '$seconds_formatted = sprintf('%02d', $seconds);')
Führt automatisch zu 00, 01, 02, [...], 10, 11 [...]. Damit sparst du dir deinen Check, ob $seconds < 10.

Warum fallen zwei Wochentage weg?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo 31 Aug, 2009 14:28 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Eliwood hat geschrieben:
Schonmal was von sprintf gehört?
$this->bbcode_second_pass_code('', '$seconds_formatted = sprintf('%02d', $seconds);')
Führt automatisch zu 00, 01, 02, [...], 10, 11 [...]. Damit sparst du dir deinen Check, ob $seconds < 10.


Gehört schon, nur noch nix über die Funktionsweise. Aber gut zu wissen.

Eliwood hat geschrieben:
Warum fallen zwei Wochentage weg?


Das liegt an dem systematischen Kalender den ich verwende.
Zitat der Webseite hat geschrieben:
Das Jahr hat 365 Tage. Die Zahl 365 läßt sich zerlegen in 5*73
(aber nicht weiter, denn 5 und 73 sind Primzahlen). Das legt es
nahe, als kleinste Gruppierung ("Woche") 5 Tage zu nehmen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum