webForumDet fria alternativet

Date.format - enkel och flexibel utskrift av valfria datum

1 svar · 3 964 visningar · startad av spango

spangoMedlem sedan juni 20008 205 inlägg
#1

...

spangoMedlem sedan juni 20008 205 inlägg
#2

Re: Date.format - enkel och flexibel utskrift av valfria datum

[Diskutera scriptet]

Jäpp, här kommer ytterligare ett script som formaterar datum :)

(Om du är ointresserad av de tekniska detaljerna, gå neråt på sidan och titta på exemplen.)
De befintliga wFscript som formaterar datum har (enligt mig) en stor nackdel: De är väldigt statiska. Man kan bara visa ett datum på ett vis, eller liknande.
Sålunda bestämde jag mig för att skriva lite funktioner som på ett enkelt men smidigt vis kan skriva ut valfritt datum på valfritt vis. Jag arbetade med funktionen strftime (som många kan tänkas känna igen från språk som C, Python, php och så vidare) som förebild, men alla sekvenser fungerar inte likadant som i t.ex. C.

Scriptet lägger till en metod (egentligen två, men det är bara en som du kommer att använda) till klassen Date. Till denna metod skickar man en textsträng som kan innehålla vilken text som helst. Returvärdet är strängen "avkodad". Ett exempel:

Exempel 1 - skriv ut datum och klockslag

<script type="text/javascript"><!--
[i][red]... klistra in koden för format-metoden här...[/red][/i]
var nu = new Date();
var fmt = "<p>Dagens datum är <b>%Y-%m-%d</b> och klockan är %H:%M:%S.</p>";
document.write(nu.format(fmt));
// --></script>

Om detta script kördes exakt tjugo över två den 25:e augusti 2001, så skulle följande skrivas ut:
<p>Dagens datum är <b>2001-08-25</b> och klockan är 14:20:00.</p>
Teckensekvenser som börjar med procenttecken byts ut mot en del av datumet. Följande sekvenser finns:
%a "Kort" veckodag (t.ex. "lör" för lördag, "mån" för måndag")
%A "Lång" veckodag ("lördag" eller "måndag")
%b "Kort" månad (t.ex. "nov" eller "dec")
%B Hela månadsnamnet ("november")
%c Webbläsarens eget format. Detta är olika på olika datorer och i olika webbläsare men blir något i stil med "den 25 augusti 2001" eller "Saturday, August 25, 2001 14:35:33"
%d Tvåsiffrigt datum (01 - 31)
%H Tvåsiffrig timme (00 - 23)
%I Tvåsiffrig timme (01 - 12, observera att det är stort "i" och inte litet "L"!)
%m Månad som nummer (01 - 12)
%M Tvåsiffrig minut (00 - 59)
%p Beteckning för förmiddag/eftermiddag ("fm" eller "em" i grundutförandet)
%S Sekunder (00 - 59)
%w Veckodag som siffra (0 = söndag, 1 = måndag...)
%y År, tvåsiffrigt (t.ex., år 2001 blir detta 01)
%Y År, "alla" siffror (t.ex. 2001)
%% Vanligt procenttecken.
Teckensekvenser som inte stöds ersätts med en varning. T.ex. skulle '%Q' (som inte finns) ersättas med '[Otillåten modifierare: "Q"]'.

Om man vill skriva ut det datum som webbsidan scriptet körs på senast ändrades bör man ta i beaktning att vissa webbläsare plötsligt kan påstå att att en sida ändrad 2001 senast ändrades 1901. Detta är ett problem som uppstår eftersom det är webbserverns tidsangivelse som används, och de flesta servrar anger bara tvåsiffrigt årtal. Alltså är det upp till webbläsaren att avgöra vilket sekel detta år antas ligga i.
Vilket som är "rätt" kan man diskutera, men oavsett vad man kommer fram till i en sådan diskussion bör man endast skriva ut tvåsiffriga årtal om man använder sig av document.lastModified. Exempel:

Exempel 2 - skriv ut senaste datum för senaste ändring av webbsidan

<script type="text/javascript"><!--
[i][red]... klistra in koden för format-metoden här...[/red][/i]
var lastMod = new Date(Date.parse(document.lastModified));
var fmt = '<p>Sidan ändrades senast <b>%Aen den %d %B -%y</b></p>';
document.write(lastMod.format(fmt));
// --></script>

Detta skulle skriva ut något i stil med <p>Sidan ändrades senast lördagen den 25 augusti -01.</p>

Anpassning
Om man vill kan man ändra på namnen på månaderna, veckodagarna och beteckningen för förmiddag/eftermiddag.
Veckodagsnamnen lagras i två arrayer i Date, Date.WEEKDAYS_SHORT och Date.WEEKDAYS_LONG, som lagrar "korta" respektive "långa" namnen på veckodagarna. Dessa två arrayer har sju element vardera, som motsvarar veckodagsnamnen. Det första elementet i arrayen antas vara namnet på söndag, det andra antas vara namnet på måndag och så vidare.
Månadsnamnen lagras på liknande vis, i två arrayer som heter Date.MONTHS_LONG och Date.MONTHS_SHORT. Dessa är två arrayer med tolv element vardera, det första är namnet på januari, det andra namnet på februari och så vidare.
Till sist kan man även ändra på beteckningen för förmiddag och eftermiddag. Beteckningen för förmiddag lagras i en variabel som heter Date.AM och motsvarigheten för eftermiddag lagras i Date.PM.
Om vi skulle vilja göra en engelskspråkig variant skulle det kunna se ut så här:

Exempel 3 - utskrift i "engelsk" stil

<script type="text/javascript"><!--
[i][red]... klistra in koden för format-metoden här...[/red][/i]
Date.MONTHS_LONG = ['January', 'February', 'March', 'April', 'May',
'June', 'July', 'August', 'September', 'October', 'November', 'December'];
Date.WEEKDAYS_LONG = ['Sunday', 'Monday', 'Tuesday',
'Wednesday', 'Thursday', 'Friday', 'Saturday'];
Date.AM = 'AM';
Date.PM = 'PM';
var fmt = '<p>Today\'s date is %A, %B %d %Y and the time is %I:%M %p.</p>';
var now = new Date();
document.write(now.format(fmt));
// --></script>

Detta skulle skriva ut något i stil med "<p>Today's date is Saturday, August 25 2001 and the time is 03:18 PM.</p>";

Här är koden du ska klistra in i exemplen:

/* script.webforum.nu
 * sprid gärna detta script till släkt och vänner...
 * modifiera efter egen vilja...
 * men lämna kvar dessa kommentarer...
 */

// INSTÄLLNINGAR FÖR format()

Date.AM = "fm"; // Sträng beskrivandes "förmiddag"
Date.PM = "em"; // Sträng beskrivandes "eftermiddag"

// "Långa" namnen på veckodagarna
Date.WEEKDAYS_LONG = ["s\xF6ndag", "m\xE5ndag", "tisdag",
                      "onsdag", "torsdag", "fredag",
                      "l\xF6rdag"];
// "Korta" namnen på veckodagarna
Date.WEEKDAYS_SHORT = ["s\xF6n", "m\xE5n", "tis",
                       "ons", "tor", "fre", "l\xF6r"];
// "Långa" månader
Date.MONTHS_LONG = ["januari", "februari", "mars", "april",
                    "maj", "juni", "juli", "augusti",
                    "september", "oktober", "november", "december"];
// "Korta" månader
Date.MONTHS_SHORT = ["jan", "feb", "mar", "apr", "maj", "jun",
                     "jul", "aug", "sep", "okt", "nov", "dec"];
					 
Date.prototype.format = function (fmt) {
	var ret = ""; // Returvärde
	while(fmt != ""){
		if(fmt.indexOf("%") != -1){
			// Det finns minst ett %-tecken kvar i strängen
			if(fmt == "%") {
				fmt = "";
			} else {
				var percentIndex = fmt.indexOf("%");
				ret += fmt.substring(0, percentIndex);
				fmt = fmt.substring(percentIndex);
				ret += this.strftimeResolveChar(fmt.charAt(1));
				fmt = fmt.substring(2);
			} // else, fanns mer än bara % i fmt
		} else {
			// inga fler %-tecken, sätt ihop
			// resten av fmt med ret
			ret += fmt;
			fmt = "";
		} // else
	} // while
	return ret;
} // Date.format

Date.prototype.strftimeResolveChar = function (ch){
	switch(ch){
		case "a": // Kort veckodag
			return Date.WEEKDAYS_SHORT[this.getDay()];
		case "A": // Lång veckodag
			return Date.WEEKDAYS_LONG[this.getDay()];
		case "b": // Kort månad
			return Date.MONTHS_SHORT[this.getMonth()];
		case "B": // Lång månad
			return Date.MONTHS_LONG[this.getMonth()];
		case "c": // Lokalt format
			return this.toLocaleString();
		case "d": // Datum (01 - 31)
			return fillZeros(this.getDate());
		case "H": // Timme, 00 - 23
			return fillZeros(this.getHours());
		case "I": // Timme, 01 - 12 (stort "i")
			var hrs = this.getHours() % 12;
			if(hrs == 0)
				hrs = 12;
			return fillZeros(hrs);
		case "m": // Månad som nummer (01 - 12)
			return fillZeros(this.getMonth() + 1);
		case "M": // Minut (00 - 59)
			return fillZeros(this.getMinutes());
		case "p": // Beteckning för förmiddag/eftermiddag
			var hrs = this.getHours();
			if((hrs == (hrs % 12) &#0124;&#0124; hrs == 12) && hrs != 0)
			// Om timmar är mindre än tolv, undviker "less than"-tecken
				return Date.AM;
			else
				return Date.PM;
		case "S": // Sekunder (00 - 59)
			return fillZeros(this.getSeconds());
		case "w": // Veckodag, 0-6 (söndag = 0, måndag = 1...)
			return this.getDay().toString();
		case "y": // År, två siffror
			return fillZeros(this.getYear() % 100);
		case "Y": // År med sekel
			return this.getFullYear().toString();
		case "%": // Vanligt procenttecken
			return "%";
		default: // Tecken som inte stöds
			return "[Otill\xE5ten modifierare: \"" + ch + "\"]";
	} // switch
} // Date.strftimeResolveChar

function fillZeros(s){
	while((s += "").length != 2)
		s = "0" + s;
	return s;
} // fillZeros
132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)