converteren datum cel waarde naar "normale" datum

Status
Niet open voor verdere reacties.

nkamp

Gebruiker
Lid geworden
2 mrt 2007
Berichten
152
Hallo,

Ik lees met javascript de waarde van een excel uit. Dit is een datum.
Excel bevat de volgende waarde: 05/12/2007 5:00 waarbij de cel instelling "general is"

Wanneeer ik een alert van deze waarde doe krijg ik het volgende:
Wed May 12 05:00:00 UTC+100 2007 ipv. een normale datum zoals 05/12/2007 05:00:00. Indien ook getMonth doe krijg ik 4 ipv 11.

Heeft iemand een idee hoe je dit converteert naar een gebruikelijke normale manier. Moet je dan de waarde vanuit excel eerst in variabele opslaan en omzetten naar string. Ik heb dit geprobeerd maar het werkt niet.

Alvast bedankt.

Nico
 
Die datum klopt toch?

Sla eerst het datum object op in een variable, en stel vervolgens de string samen.

Hier een ongetest voorbeeld. timezoneOffset is in secondes. Niet gebruiken als je source datum al in de goede tijdzone staat.
Code:
function dateToString(var date, var timezoneOffset)
{
  var timestamp = date.UTC();
  if (timezoneOffset)
  {
    timestamp += (timezoneOffset*1000);
    date.setTime(timestamp);
  }
  return date.getUTCMonth()+"/"+date.getUTCDate()+" "+date.getUTCFullYear()+" "+date.getUTCHours()+":"+date.getUTCMinutes()+":"+date.getUTCSeconds();
}
 
Excel bevat de volgende waarde: 05/12/2007 5:00 waarbij de cel instelling "general is"

Wanneeer ik een alert van deze waarde doe krijg ik het volgende:
Wed May 12 05:00:00 UTC+100 2007 ipv. een normale datum zoals 05/12/2007 05:00:00. Indien ook getMonth doe krijg ik 4 ipv 11.
Het wordt als engelse datum-notatie verwerkt: maand/dag/jaar :)
PHP:
var st = '05/12/2007 5:00';
var dt = new Date(st);

document.writeln(dt + '<br>');
// Sat May 12 05:00:00 UTC+0200 2007

document.writeln(dt.toLocaleString() + '<br>');
// zaterdag 12 mei 2007 05:00:00

Als excel wel een nederlandse datum geeft dan moet je voor javascript eerst maand en dag omdraaien:
Code:
var st = '05/12/2007 5:00';
st = st.replace(/(\d\d)\/(\d\d)/,'$2/$1');
var dt = new Date(st);

document.writeln(dt + '<br>');
// Wed Dec 5 05:00:00 UTC+0100 2007

document.writeln(dt.toLocaleString() + '<br>');
// woensdag 5 december 2007 05:00:00
Dat is wel een woensdag! ;)


Vr.Gr. Egel.
 
Oeps, daar had ik aan moeten denken. Komt vast doordat ik alleen maar timestamps gebruik :confused:
 
Laatst bewerkt:
Hallo Egel,

Hartstikke bedankt. Ik begrijp nu dat javascript altijd met mm/dd/jjjj werkt en als je dus de datum op "onze" manier aanbied dd/mm/jjjj en je wilt van de functies getday, getmonth etc. gebruik maken, zul je eerst de dag en de maand om moeten omwisselen. Klopt toch?

Er bestaat blijkbaar niet zoiets om bij het instantieren van het date object een format kan worden meegegeven zodat javascript begrijpt dat het om dd/mm gaat, ipv. mm/dd.

Ik moet overigens eens naar het replace method kijken. Ik ken wel de simpele ", " ed vervangen maar dit soort ken ik niet echt (wel gezien).

Nogmaals hartstikke bedankt voor jullie hulp (ook Glest).

Mvg.,

Nico
 
Het probleem zit overigens nog anders in elkaar uiteindelijk. Ik kreeg deze excel aangeleverd:
Kolom Datum Kolom waarde
01/01/2006 6:00 xxx
01/01/2006 7:00 xxx
|
31/12/2006 23:00 xxx
01/01/2007 0:00 xxx

Kolom cel indeling is dd/mm/jjjj hh:mm. Dit waren 8760 rijen dit komt overeen met voor ieder uur een waarde. De datum in rij 1 was hard ingevoerd maar alle volgende datums waren berekend als volgt. Neem rij 2 ==> A1 + 1/24. Het probleem zit hem dan bv. bij de laatste rij 01/01/2007 0:00:00 kwam in javascript binnen als 31/12/2006 23:59:59!!!!! En dit komt niet bij 1 jan 2006 voor maar naarmate een aantal rijen verder komt het frequent voor. En bij het midden nachtelijke uur geeft dit problemen!

Ik weet niet of iemand hier een passend antwoord op heeft. Ik heb een workaround gemaakt aangezien het hier altijd om gehele uren gaat test ik op de minuten. Op het moment dat deze 59 is, rond ik kort gezegd het uur naar boven af. Anyway het klopt nu, maar ik zou graag een antwoordt op het probleem hebben.

Kort gezegd: De presentatie in excel is iets geheel anders dan javascript uitleest.

Nico
 
Laatst bewerkt:
tja, daarom werk ik in programmas altijd met timestamps en niet met andere manieren van datum/tijd opslaan. Timestamps kunnen niet verkeerd worden ingelezen. Je hoeft niet eens op tjidzones te letten want timestamps zijn per definitie in UTC/GMT.

Alleen wanneer je de datum weer laat zien moet je wel opletten welke tijdzone je hem in laat zien. Als je zelf je Excel bestandjes maakt zou ik je aanraden om timestamps te gebruiken. Als je ze aangeleverd krijgt zit je natuurlijk wel vast aan de notitie van Excel.
 
Maar wat bedoel jij met "daarom gebruik ik altijd een timestamp". Ik bedoel in excel staat ook een datum + tijd en dit is in principe een timestamp. Of zijn er mogelijkheden in excel en of javascript waarbij het altijd maar op één manier is uit te lezen??

Ik bedoel wat doe jij dat het een timestamp maakt waarbij het dus nooit fout gaat?

Nico
 
ik bedoel een UNIX timestamp. Het aantal secondes sinds 1 Januari 1970 0:00 in UTC/GMT.

Kan op geen enkele manier verkeerd gelezen worden. Kan wel verkeerd gerepresenteerd worden, amar das een ander verhaal.
 
Het probleem zit overigens nog anders in elkaar uiteindelijk. Ik kreeg deze excel aangeleverd:
Kolom Datum Kolom waarde
01/01/2006 6:00 xxx
01/01/2006 7:00 xxx
|
31/12/2006 23:00 xxx
01/01/2007 0:00 xxx

Kolom cel indeling is dd/mm/jjjj hh:mm. Dit waren 8760 rijen dit komt overeen met voor ieder uur een waarde. De datum in rij 1 was hard ingevoerd maar alle volgende datums waren berekend als volgt. Neem rij 2 ==> A1 + 1/24. Het probleem zit hem dan bv. bij de laatste rij 01/01/2007 0:00:00 kwam in javascript binnen als 31/12/2006 23:59:59!!!!! En dit komt niet bij 1 jan 2006 voor maar naarmate een aantal rijen verder komt het frequent voor. En bij het midden nachtelijke uur geeft dit problemen!
Helpt dit je nog wat verder?
Code:
<script>

function dutchDate(s) {
 // dag maand jaar uur minuut seconde
 s = s.split(/\D/);
 while(s.length < 7) s[s.length] = 0;
 return new Date(s[2],s[1],s[0],s[3],s[4],s[5],s[6]);
 };

var st = '05/12/2007 5:00';
var dt = dutchDate(st);

document.writeln(dt + '<br>');
// Wed Dec 5 05:00:00 UTC+0100 2007

document.writeln(dt.toLocaleString() + '<br>');
// woensdag 5 december 2007 05:00:00

</script>
De functie dutchDate() splitst de aangeleverde string op niet-getallen ( \D ) en maakt vervolgens een datum op de goede volgorde. :)

Wel raar dat je ergens 23:59:59 krijgt, een afrondingsfout misschien? :confused:

En wat gebeurt er met zomer/wintertijd?
zondag 26 maart 2006 01:00:00
zondag 26 maart 2006 03:00:00
........
zondag 29 oktober 2006 02:00:00
zondag 29 oktober 2006 02:00:00


Vr.Gr. Egel.
 
Hallo Egel,

Bedankt voor je verdere hulp. Maar het zit hem op de één of andere manier in dat "kl..." Excel. Vul maar 2x een datum tijd in, in Excel en ga vervolgens met kopieren via het "rechter hoek" van de cel principe. Dus naar beneden slepen. Na een aantal dagen begint het afrondings probleem. En dat komt omdat het geen text in de cel is maar een date (object?).
Bv.:
01/01/2006 6:00:00
01/01/2006 7:00:00

en vervolgens de cellen eronder vullen via het rechter hoekje van de cel, gaat Excel opeens na tig dagen
15/01/2006 12:59:59
15/01/2006 13:59:59

Waarbij ook nog de tijd bv.
01/07/2006 23:59:59 (ipv. 01/07/2006 00:00:00)
tot 30 juni gerekend wordt ipv. 1 juli.

Ik heb het inmiddels allemaal werkend maar ik snap er geen snars van.

In ieder geval nogmaals bedankt voor je hulp.

Mvg.,

Nico
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan