Add minutes to time
Ik heb een variabele waarin een tijd staat: $tijd = '09:45:00';
Nou wil ik daar 25 minuten bij optellen. Ik kwam hiervoor de functie DateTime::add tegen waarvan ik neem ik aan gebruik kan maken.
Ik kwam er echter al snel achter dat een simpel iets als dit niet werkt:
Na wat klooien heb ik nu het volgende:
Code (php)
1
2
3
4
2
3
4
<? $tijd = '09:45:00';
$date = new DateTime($tijd, new DateTimeZone('Europe/Amsterdam'));
$date->add(new DateInterval('PT25M'));
echo $date->format('Y-m-d H:i:s'); ?>
$date = new DateTime($tijd, new DateTimeZone('Europe/Amsterdam'));
$date->add(new DateInterval('PT25M'));
echo $date->format('Y-m-d H:i:s'); ?>
Tot zoverre alles goed. Het probleem is nu, dat hij er ook de datum van vandaag en de tijdzone bij heeft gezet. Ik weet bijvoorbeeld niet hoe dit gaat reageren als de zomertijd weer ingaat, of wanneer de computer waarop het draait ineens in een andere tijdzone staat.
Ik wil er eigenlijk geen enkele datum of tijdzone bij hebben staan. Maar als ik de tijdzone weghaal zegt hij het volgende: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
Is er een manier om puur en alleen een tijd te hebben? En dus niets als een datum of tijdzone?
Gewijzigd op 23/11/2011 16:20:12 door Erwin H
Wat ik nodig heb is een tijd zoals bijvoorbeeld 09:05:00. Vervolgens wil ik uit een groot array alle waardes hebben die aan die tijd voldoen (oftewel, ik wil de rest van het array "unsetten").
Een UNIX timestamp lijkt me dus in mijn geval niet de beste optie. Of heb ik het mis?
Zelfs dan kan het nog met een UNIX timestamp, want dan maak je de tijd gewoon aan sinds het begin van de UNIX teller, zonder extra dagen. Klopt de totale datum weliswaar niet, maar daar ben je blijkbaar niet in geinteresseerd. Het wordt pas lastig als je mag verwachten dat je tijd voorbij de 24 uur zal gaan (hoewel ook dat oplosbaar is).
Code (php)
1
2
3
4
5
2
3
4
5
datum | tijd | koers
------------------------------
2005-06-28 | 09:01:00 | 385.70
2005-06-28 | 09:02:00 | 385.90
2005-06-28 | 09:03:00 | 385.85
------------------------------
2005-06-28 | 09:01:00 | 385.70
2005-06-28 | 09:02:00 | 385.90
2005-06-28 | 09:03:00 | 385.85
Wat ik wil berekenen is bijvoorbeeld de gemiddelde winst als je op alle dagen om 09:18:00 had gekocht, en om 13:07:00 had verkocht. Zoals gezegd gaat het dus absoluut niet om een specifiek moment in de geschiedenis, maar om "elke dag dezelfde tijd". Hierdoor vind ik het nogal omslachtig om het om te rekenen naar UNIX-timestamp. Het liefst verkrijg ik gewoon een string die ik gewoon kan instellen op iets als '09:18:00' en er dan een aantal minuten bij op kan tellen. Het zou dus wel erg fijn zijn als ik het zou kunnen doen met iets als DateTime::add.
Is er dus geen enkele manier om bijvoorbeeld iets als het volgende te doen?
$tijd = '09:18:00';
$tijd_plus_55_minuten = $tijd + (55 minutes);
Alle tips of hints zijn welkom!
Maar goed, als je de oplossing niet wilt horen....
Jouw oplossing had ik inderdaad ook al bedacht. Maar is het dan niet zo dat hij alleen maar de tijd weergeeft, maar dat de datum er nog wel ergens in zit verborgen? Dus als het dan zomertijd is, geeft hij dan een andere tijd weer? Of als ik de boel op een computer draai die in een andere tijdzone staat, veranderd hij de tijd dan niet om hem aan te passen aan die tijdzone (zoals PostgreSQL doet met het type 'Timestamp With Time Zone'?
@ Erwin
Ik wil de oplossing heel graag horen, maar ik heb inderdaad zo het idee dat omzetten naar UNIX timestamp heel erg omslachtig is. Als dat niet zo is, dan is dat natuurlijk helemaal top! Ik zal eens even wat gaan zoeken naar hoe je dat kan doen met unix-timestamps.
http://nl.php.net/manual/en/class.datetimezone.php
En je doet er verstandig aan gewoon vast te houden aan de moeglijkheden van de Date class functies.
En wat Ger van Steenderen doet is natuurlijk aan de boze, want dat gaat op den duur echt mank.
Gewijzigd op 23/11/2011 21:49:45 door Noppes Homeland
Niet verstandig om daar op te vertrouwen als je niet onder controle heb waar het script gaat draaien.
@Peter
Als je met de strtotime functie uit mijn 2de voorbeeld de volledige datum en tijd echoed krijg je 1 januari 1970 19:18:00
Uit een ander topic van je begrijp ik dat je straks een array hebt met een paar miljoen elementen, ik hoop dat je geen conversie hoeft uit te voeren op elk element in de array want dan krijg je geheid problemen;
Ik had dit pas namelijk met een array van ongeveer 100.000 records en de conversie koste me 50 seconden extra execution time
Is het misschien zinvoller om het hele probleem in SQL/query's op te lossen? De gegevens staan al in een tabel en SQL is veel handiger dan data processen met php
Inderdaad Aad, dit lijkt mij echts iets voor een stored procedure
Code (php)
1
2
3
4
5
2
3
4
5
<? $koop_tijdstip = '09:55:00';
$tijdspanne = 10;
$koop_tijdstip_als_tijdvariabele = new DateTime($koop_tijdstip, new DateTimeZone('Europe/Amsterdam'));
$verkoop_tijdstip_als_tijdvariabele = $koop_tijdstip_als_tijdvariabele->add(new DateInterval('PT'.$tijdspanne.'M'));
$verkoop_tijdstip = (string)$verkoop_tijdstip_als_tijdvariabele->format('H:i:s'); ?>
$tijdspanne = 10;
$koop_tijdstip_als_tijdvariabele = new DateTime($koop_tijdstip, new DateTimeZone('Europe/Amsterdam'));
$verkoop_tijdstip_als_tijdvariabele = $koop_tijdstip_als_tijdvariabele->add(new DateInterval('PT'.$tijdspanne.'M'));
$verkoop_tijdstip = (string)$verkoop_tijdstip_als_tijdvariabele->format('H:i:s'); ?>
Ik weet dat je dit ook mbv sql kan doen. Het probleem daarmee is echter dat ik dit een heel aantal keer moet loopen (aantal miljoen keer), en gezien het met (My/Postrge)SQL altijd tijd kost om een verbinding te maken, dacht ik dat het zo sneller is.
Quote:
Ik had dit pas namelijk met een array van ongeveer 100.000 records en de conversie koste me 50 seconden extra execution time
50 secondes is geen enkel probleem, een paar uur ook niet. Het zit allemaal niet in een website, dus geduld kan ik wel opbrengen. Ik had eerst een systeem waarin ik alles in PostgreSQL deed. Dat duurde echter een aantal dagen, vandaar dat ik het nu met arrays in het geheugen probeer te doen.
Ik begrijp dus dat dit waarschijnlijk tegen alle regels in is. Ik bereik echter precies wat ik wil. Hebben jullie een praktisch argument waarom ik het niet zo zou doen?
Maar als het niet voor een website is waarom gebruik je dan PHP, dat is niet de ideale programmeertaal voor niet web gebaseerde applicaties.
Eerst wil ik eens wat resultaten tevoorschijn toveren. Als dat succes heeft en het heeft zin om er meer mee bezig te zijn, dan ga ik met plezier python leren.. :-)
Quote:
De aller belangrijkste regel is dat je de performance optimaliseert, dus als jij door de data in een array te zetten een groot aantal queries uitspaart is dat juist de goede manier.
Daar ben ik inderdaad steeds meer van overtuigd. Het script wat ik nu heb geschreven doet in 15 secondes, waar ik met mijn query-scripts zo'n 25 minuten over deed. Ik ben dus vol met energie dat ik hier compleet op het juiste spoor zit! :-)
Heel erg bedankt voor alle antwoorden in ieder geval!