webForumDet fria alternativet

Göra om textsträng till datum

7 svar · 269 visningar · startad av i-or

i-orMedlem sedan nov. 2001294 inlägg
#1

Jag har en textsträng som ser ut så här:

Sep 16, 2002 23:47

Först och främst vill jag göra om denna textsträng till datumformat och sedan vill jag kunna addera/subtrahera ett visst antal timmar och minuter från detta datum.

Hur gör jag detta (det kanske är omöjligt)?

JojoxxMedlem sedan juni 20004 308 inlägg
#2
var monthNr=new Object;
monthNr['jan']=0;monthNr['feb']=1;
monthNr['mar']=2;monthNr['apr']=3;
monthNr['maj']=4;monthNr['jun']=5;
monthNr['jul']=6;monthNr['aug']=7;
monthNr['sep']=8;monthNr['okt']=9;
monthNr['nov']=10;monthNr['dec']=11;
function getDateObjOfLameTextString(str){
	if(!str.match(/^(\w{3}) (\d{1,2}), (\d{4}) (\d{1,2}):(\d{2})$/)){ return false; }
	return new Date(RegExp.$3,monthNr[RegExp.$1.toLowerCase()],RegExp.$2,RegExp.$4,RegExp.$5);
}

d=getDateObjOfLameTextString("Sep 16, 2002 23:47")-0;
d+=1000;
d=new Date(d);
alert(d);

Förklaring:

Funktionen getDateObjOfLameTextString() returnerar ett datum-objekt baserat på text-strängen som du skickar med (i det format som du skrev). Sedan gör vi en fuling och subtraherar med 0 så får vi resultatet i ms istället för ett datum-objekt. Detta sparar vi i variabeln d. På nästa rad adderar vi 1000 ms (=1 sek). JavaScript räknar gärna med ms. På nästa rad gör vi ett nytt datum-objekt baserat på ms-värdet och på raden efter det skriver vi ut resultatet. När du har datumet som ett objekt kan du använda sedvanliga funktioner som getDate, GetYear osv.

i-orMedlem sedan nov. 2001294 inlägg
#3

Tack så hemskt mycket. Efter ganska mycket klurande med koden (ditt exempel var utmärkt, men för en icke javascriptskunnig blev varenda liten korrigering till ett världsproblem :) ) fick jag det att fungera.

Men desvärre måste jag ha hjälp med det sista också.

Om jag t ex skriver:

hours = d.getHours() + 5;

får jag 28:47 i tid (använder exemplet igen). Finns det någon funktion som adderar/subtraherar ett datum när timmarna blir mindre än 0 eller större än 23 samt adderar/subtraherar timmarna när minuterna blir mindre än 0 eller större än 59?

i-orMedlem sedan nov. 2001294 inlägg
#4

Jag tog bort:

...-0;
d+=1000;
d=new Date(d);

och det blev ingen förändring.

Vad har dessa saker för funktion? Det känns onekligen onödigt att hålla på med millisekunder och addera en sekund osv.

JojoxxMedlem sedan juni 20004 308 inlägg
#5

Nej, det är faktiskt rättså enkelt att använda ms, just av den anledningen att du kan addera x timmar (eller veckor för den delen) och inte behöva fundera på om det blev en ny dag, månad eller år. Varför? För att;

Du kan enkelt göra om ett datum-objekt i JavaScript till millisekunder (att subtrahera med 0 är enklast, detta förklarar -0). Antalet millisekuner då får är antalet millisekunder efter den 1 Januari 1970 01:00. För att sedan lägga till ex. 1 dygn adderar du det antal ms. (exeplet adderar 1 sek=1000ms). men ett dygn blir alltså;

d+=1000*60*60*24;

1000=antalet ms på 1 sek
60=antalet sek på 1 min.
60=antalet min på 1 timme.
24=... :)

Sedan gör vi om allt till ett datum-objekt igen;

d=new Date(d);

Tittar du nu på d (alert(d)) så ser du att det är exakt 1 dygn mer än det datum du hade till att börja med, och du behöver inte bekymra dig om hurvida det blivit en ny månad eller år.

i-orMedlem sedan nov. 2001294 inlägg
#6

Jasså, då fick millisekunderna sin förklaring samtidigt som det löste datumformateringen. Två flugor i en smäll. Lysande!

i-orMedlem sedan nov. 2001294 inlägg
#7

Jojoox, det blev ett litet problem med ditt script.

Tiden skrivs 9:03 och inte 09:03. Alla tider innan 10:00 blir alltså fel. Det skulle vara jätteschysst om du kunde korrigera det.

JojoxxMedlem sedan juni 20004 308 inlägg
#8

Sorry, en miss, nu är det redigerat.

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)