Tijd van timestamp halen
Ik wil graag de tijd van een timestamp halen, die als string in de database staat.
Ik vraag me af of dit de (of een) juiste manier is?
Het resultaat moet dus een timestamp met tijd 00:00 worden.
In mijn geval haal ik timestamp als string uit database, maar in het voorbeeld dus een vaste gebruikt (1638346790).
Guido
Gewijzigd op 06/12/2021 11:56:02 door Guido -
Het omgekeerde dus van wat je nu wilt.
Quote:
In mijn geval haal ik timestamp als string uit database
Nee, een timestamp is een integer, en geen string.
Gebruik bij voorkeur de DateTime class van PHP:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$date = new DateTime();
$date->setTimestamp(1638346790);
echo $date->format('H:i');
?>
$date = new DateTime();
$date->setTimestamp(1638346790);
echo $date->format('H:i');
?>
Had ook met strftime gekund, maar die is vanaf PHP 8.1 deprecated. De standaard DateTime class is veel uitgebreider.
Gewijzigd op 06/12/2021 12:24:28 door - Ariën -
Dank voor je reactie.
Ik ging ervan uit dat er een verschil is tussen opslaan als integer en opslaan als string? Of ligt dat aan de value-type (timestamp is alleen cijfers, dus integer)?
Ik wil het resultaat overigens niet als datum aan de voorkant weergeven, dus hoeft geen "leesbare datum" te worden. Gewoon een timestamp met tijd 00:00 uur.
Guido
Gewijzigd op 06/12/2021 12:35:48 door Guido -
Maar behandel in PHP wel de datatypes wel zoals wat ze werkelijk zijn.
En probeer mijn voorbeeld eens. Daar zie ik geen datum in.
Het is een kwestie van de juiste datetime-modifiers in je format() te gebruiken. Zo kan je elke formattering gebruiken die je maar wenst.
Met jouw voorbeeld wordt $date met "leesbaar" formaat getoond (08:19), maar ik wil de (Unix) timestamp blijven gebruiken. Jaar/maand/dag en dus met tijd 00:00. Hoe bereik ik dat dan?
Ik weet dat ik de tijd kan instellen:
Maar heb te weinig kennis om dit te combineren met jouw voorbeeld.
Guido
Hoe moet het er dan uitzien? Geef eens een voorbeeld?
Denk dat ik het heb:
Code (php)
1
2
3
4
5
2
3
4
5
$date = new DateTime();
$date->setTimestamp(1638346790);
$time = $date->setTime(0, 0, 0, 0);
$datum_met_midnight_time = $time->getTimestamp();
echo $datum_met_midnight_time;
$date->setTimestamp(1638346790);
$time = $date->setTime(0, 0, 0, 0);
$datum_met_midnight_time = $time->getTimestamp();
echo $datum_met_midnight_time;
Resultaat is: 1638316800
Is dit de juiste manier?
Guido
Edit:
timestamp is wel juist. Maar let ook op de timezone waar je in werkt. Mogelijk staat dat al centraal in je config of in php.ini, maar als niet, dan kun je zo maar zitten te werken op een Amerikaans, Engelse of Russische tijd.
timestamp is wel juist. Maar let ook op de timezone waar je in werkt. Mogelijk staat dat al centraal in je config of in php.ini, maar als niet, dan kun je zo maar zitten te werken op een Amerikaans, Engelse of Russische tijd.
Je code is trouwens in te korten tot:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$date = new DateTime();
$date->setTimestamp(1638346790);
$date->setTime(0, 0, 0, 0);
echo $date->getTimestamp();
?>
$date = new DateTime();
$date->setTimestamp(1638346790);
$date->setTime(0, 0, 0, 0);
echo $date->getTimestamp();
?>
of
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$date = DateTime::createFromFormat('U', 1638346790);
$date->setTime(0, 0, 0, 0);
echo $date->getTimestamp();
?>
$date = DateTime::createFromFormat('U', 1638346790);
$date->setTime(0, 0, 0, 0);
echo $date->getTimestamp();
?>
Gewijzigd op 07/12/2021 11:01:40 door Ivo P
Ja, ik houd ergens anders al rekening met UTC.
Vraagje, kan ik new DateTime meerdere keren in hetzelfde script aanroepen/gebruiken?
Ik wil het namelijk voor een begin- en eindtijd gebruiken.
Dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$date = new DateTime();
$date->setTimestamp(1638346790);
$date->setTime(0, 0, 0, 0);
$begin_tijd = $date->getTimestamp();
$date_end = new DateTime();
$date_end->setTimestamp(1638346790);
$date_end->setTime(0, 0, 0, 0);
$eind_tijd = $date_end->getTimestamp();
?>
$date = new DateTime();
$date->setTimestamp(1638346790);
$date->setTime(0, 0, 0, 0);
$begin_tijd = $date->getTimestamp();
$date_end = new DateTime();
$date_end->setTimestamp(1638346790);
$date_end->setTime(0, 0, 0, 0);
$eind_tijd = $date_end->getTimestamp();
?>
Guido
Gewijzigd op 07/12/2021 11:22:06 door - Ariën -
"maak een nieuw object van het type Datetime"
Maar is er een reden om alle tijdstippen uit te rekenen obv het aantal seconden sinds 1970?
Ja: tutorials van een jaar of 10 oud doen dat, omdat toen datetime nog niet bestond.
En ook databases als MySQL kennen kolommen van het type DateTime.
Ook daar kun je veel gemakkelijker mee werken.
Stel je wilt alle records die op een dinsdag zijn ingevoerd:
SELECT * FROM Tabel WHERE DAYOFWEEK(datumtijdkolom) = 3
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_dayofweek
Dat is schier onmogelijk met een epoch timestamp
In mijn voorbeeld gebruik ik een "vast" timestamp, maar dat verschilt natuurlijk per evenement.
Guido