webForumDet fria alternativet

Hjälp med felsökning

PHP

4 svar · 572 visningar · startad av Jester73

Medlem sedan mars 2012121 inlägg
Frågan#1

Hej

Denna PHP kod skall ju spotta ut ex "Augusti - 2012"

function periodFormat($dag){
	$dag=strtotime($dag);
	$strMan=date("m",$dag);
	$strY=date("Y",$dag);
	switch ($strMan){
		case 01:
			echo "Januari - ".$strY;
			break;
		case 02:
			echo "Februari - ".$strY;
			break;
		case 03:
			echo "Mars - ".$strY;
			break;
		case 04:
			echo "April - ".$strY;
			break;
		case 05:
			echo "Maj - ".$strY;
			break;
		case 06:
			echo "Juni - ".$strY;
			break;
		case 07:
			echo "Juli - ".$strY;
			break;
		case 08:
			echo "Augusti - ".$strY;
			break;
		case 09:
			echo "September - ".$strY;
			break;	
		case 10:
			echo "Oktober - ".$strY;
			break;
		case 11:
			echo "November - ".$strY;
			break;
		case 12:
			echo "December - ".$strY;
			break;
	}
	
	
}

Det fungerar alldeles utmärkt för alla månader förutom Augusti och September.
Jag har kollat så att $strMan & $strY innehåller ex 09 och 2012

Någon som har en ide om felet eller ett bättre sätt att göra funktionen.
Ingångsvärdet är ett datum i format ÅÅÅÅ-MM-DD

Tack på förhand

Medlem sedan jan. 2005953 inlägg
#2

Alternativ 1:
Hantera månadsnumren som strängar. Den inledande 0:an gör att talen tolkas som oktala tal, och 08 och 09 kan inte existera i det oktala talsystemet.
case '01' osv

Alternativ 2:
Strunta i inledande 0:an i månadsnumret.
$strMan = date('n', $dag);

Tillägg:
Du kan använda set_locale() och strftime() för att få svenska månadsnamn, så slipper du skriva en egen funktion för det.

Medlem sedan mars 2012121 inlägg
#3

Tack för svaret.
Varför är just 08 och 09 diskriminerade i oktala talsystemet? :)

Provade

setlocale(LC_ALL, "sv");

Men den vägrade ställa om till svenska, servern som nekar?
Får inte ens FALSE tillbaka om jag skriver echo framför

Medlem sedan aug. 20039 340 inlägg
#4

Det oktala systemet är ett talsystem som istället för 10 st siffror (0-9) använder sig av 8 st siffror (0-7). I det vanliga, så kallade decimala, talsystemet Så börjar man ju så att säga om efter 9, och skriver 10, 11, osv upp till 19, när man "börjar om" igen, och skriver 20.

Det oktala talsystemet har inte symbolerna 8 och 9, utan börjar om efter 7.
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12. 10 motsvarar alltså 8. 11 motsvarar 9 osv.

Det behöver du egentligen inte veta något alls om, men i PHP tolkas ett nummer som börjar med 0 som oktalt, vilket kan leda till allehanda problem om man inte känner till att det ligger till så. Mitt tips är att helt enkelt inte påbörja tal med 0. Du kan istället peta in ett extra mellanslag om du tycker att det är viktigt att entalssiffrorna ligger i samma kolumn.

... när jag tittar närmare på saker inser jag att du använder formateringssträngen m för att få ut månaden, vilket ger en inledande nolla. Eftersom det som skickas tillbaka är en sträng skulle du kunna köra case '08': eller liknande. Eller så...

... använder du inte alls en switch-sats där. Använd en array istället. Notera ändringen till date("n",$dag) som returnerar månaden utan inledande nolla.

function periodFormat($dag){ 
    // Resten av månaderna får du fylla i själv...
    $manader=Array("Januari", "Februari", "Mars", "April");
    $dag=strtotime($dag); 
    $strMan=date("n",$dag); 
    $strY=date("Y",$dag); 

    // -1 behövs eftersom arrayens index börjar räknas från 0, inte 1
    echo $manader[$strMan-1] . " - " . $strY;
    
}

// Test
periodFormat("2012-02-21");
Medlem sedan mars 2012121 inlägg
#5

Då har jag lärt mig något nytt idag, tack :)

Formaterade om datumet med ett n istället för m, nu funkar det.

Tack Tack!

252 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)