Hallo,

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?


$date_raw = '1638346790';
$date = strtotime(date("Y-m-d", intval($date_raw)));


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
String to time doe je nu. Een string naar een timestamp zetten.
Het omgekeerde dus van wat je nu wilt.


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:


<?php
$date = new DateTime();

$date->setTimestamp(1638346790);
echo $date->format('H:i');
?>


Had ook met [php]strftime[/php] gekund, maar die is vanaf PHP 8.1 deprecated. De standaard DateTime class is veel uitgebreider.
Hoi,

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
Of je het in MySQL als INT of VARCHAR opslaat, dat boeit PHP helaas niet echt.
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.
Hoi,

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:

setTime( 0, 0, 0, 0)


Maar heb te weinig kennis om dit te combineren met jouw voorbeeld.

Guido
Hoe moet het er dan uitzien? Geef eens een voorbeeld?
Hoi,

Denk dat ik het heb:


$date = new DateTime();
$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.
[/edit]

Je code is trouwens in te korten tot:

<?php
$date = new DateTime();
$date->setTimestamp(1638346790);
$date->setTime(0, 0, 0, 0);
echo $date->getTimestamp();
?>

of

<?php
$date = DateTime::createFromFormat('U', 1638346790);
$date->setTime(0, 0, 0, 0);
echo $date->getTimestamp();
?>
Dank voor je reactie Ivo!

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:


<?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();  
?>


Guido
Je bent één stap verwijderd van je editor en je browser. Ga dus het avontuur aan en meld je bevindingen ;-)
Ja dat kan: daarom staat er ook "new" bij.

"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

Reageren