Add minutes to time

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Peter Sanders

Peter Sanders

23/11/2011 16:13:14
Quote Anchor link
Hallo,


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? $tijd_plus_25min = add($tijd + 25 minutes); ?>


Na wat klooien heb ik nu het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'); ?>


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?
 
PHP hulp

PHP hulp

22/12/2024 11:00:45
 
Erwin H

Erwin H

23/11/2011 16:19:41
Quote Anchor link
Kan je niet met een Unix timestamp werken? Dus de string tijd converteren naar een Unix timestamp en er dan gewoon 25*60 seconden bij optellen (integer optelling) en het naar een string converteren als je het naar de pagina moet schrijven. Heb je ook meteen complete controle over hoe het weggeschreven wordt.
Gewijzigd op 23/11/2011 16:20:12 door Erwin H
 
Peter Sanders

Peter Sanders

23/11/2011 17:16:48
Quote Anchor link
Maar een UNIX-timestamp refereerd toch ook naar een specifieke seconde in de geschiedenis?

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?
 
Erwin H

Erwin H

23/11/2011 17:26:21
Quote Anchor link
Bedoel je dat je tijd (09:05:00) ongeacht datum is? De tijd sinds een bepaald moment, of de duur van een film bijvoorbeeld?
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).
 
Peter Sanders

Peter Sanders

23/11/2011 20:30:26
Quote Anchor link
Het punt is dat ik alle koersen van de aex per minuut in een table heb staan. Dit is al in het volgende formaat:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/11/2011 21:12:55
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $date -> format('H:i:s');
?>
 
Erwin H

Erwin H

23/11/2011 21:13:28
Quote Anchor link
Tuurlijk kan dat, maar denk zelf eens hoe je een integer bij een string gaat optellen? Juist, door van die string eerst een integer te maken. Dat is precies wat je met een UNIX timestamp doet. Een andere manier is er echt niet. Ik begrijp wel dat je denkt dat het omslachtiger is (want je hebt de tijd al), maar bedenk wel dat je als je bijvoorbeeld een tijd hebt van 10:58 en daar 4 minuten bij op wilt tellen, je niet zomaar 58+4 kunt doen. 62 minuten kennen we niet....

Maar goed, als je de oplossing niet wilt horen....
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/11/2011 21:23:55
Quote Anchor link
PHP versie safe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$time
= strtotime('19:18:00');
$time += 55 * 60;
echo strftime('%H:%i%s');
?>
 
Peter Sanders

Peter Sanders

23/11/2011 21:25:59
Quote Anchor link
@ Ger van Steenderen
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.
 
Noppes Homeland

Noppes Homeland

23/11/2011 21:38:33
Quote Anchor link
Tja, als jij niet kan lezen hoe je de tijdzone doorgeeft aan DateTimeZone kan je uiteraard zoeken en lezen totdat je een ons weegt.

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/11/2011 22:25:41
Quote Anchor link
DateTime class en zijn afgeleiden zijn alleen beschikbaar in PHP 5.3+
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
 
Aad B

Aad B

23/11/2011 22:31:48
Quote Anchor link
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/11/2011 22:43:11
Quote Anchor link
Inderdaad Aad, dit lijkt mij echts iets voor een stored procedure
 
Peter Sanders

Peter Sanders

24/11/2011 10:12:56
Quote Anchor link
Ok. Ik heb een oplossing gevonden, maar ik ben bang dat jullie hem vies, vuil en smerig vinden. Wat ik simpelweg doe, is de string omzetten naar een DateTime (dat wordt dan automatisch de datum van creatie, i.e. "vandaag"). Vervolgens tel ik er een aantal minuten bij op, en vervolgens zet ik de DateTime weer om naar een string. Op die manier hoop ik dat het al zijn informatie verliest wat betreft, datum, locatie en tijdzone. Ik heb het als volgt gedaan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'); ?>

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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/11/2011 11:35:00
Quote Anchor link
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.
Maar als het niet voor een website is waarom gebruik je dan PHP, dat is niet de ideale programmeertaal voor niet web gebaseerde applicaties.
 
Peter Sanders

Peter Sanders

24/11/2011 14:17:00
Quote Anchor link
Je hebt gelijk dat php misschien niet de beste taal is voor mijn project. Python zou denk ik bijvoorbeeld beter zijn. Het is meer dat ik aan het roeien ben met de riemen die ik heb. Php beheers ik (redelijk) terwijl python een hele nieuwe taal zou zijn.

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!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.