[PHP] Datums vergelijken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
Ik heb in mijn database een veld datum met als type timestamp en de standaardwaarde is CURRENT_TIMESTAMP. Dit geeft als resultaat bijvoorbeeld: 2010-06-05 19:20:00.

Daarnaast heb ik in mijn site een date functie:
PHP:
1
$tijd = date("Y-m-d H:i:s");


Ik wil nu dat als de datum uit de database 2 dagen ouder is dat de huidige datum ($tijd) er iets gebeurt, bijvoorbeeld $verschil_2dagen = "ja";

Wat ik zelf denk, is dat ik het beste beide datums kan omschrijven naar de timestamp seconden, maar ik weet niet hoe ik de database datum kan omschrijven? En daarna dan een berekening doen:
PHP:
1
2
3
$verschil = $site_tijd-$db_tijd;
if ($verschil > 172800) {
$verschil_2dagen = "ja"; }


Om $tijd in seconden te krijgen kan ik
PHP:
1
$tijd = date("U");

gebruiken, toch?

Maar hoe schrijf ik de gegevens uit de database (2010-06-05 19:20:00) om naar seconden?

Alvast bedankt!

[ Voor 5% gewijzigd door WingsOfFury op 05-06-2010 19:42 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
In je SQL query kun je'm opvragen met "UNIX_TIMESTAMP(`datum`)", net wat efficienter dan het eerst te laten converten door MySQL naar een datetime en daarna met PHP weer terug naar een timestamp.

Om te vergelijken kun je trouwens ook het DateTime object gebruiken:
PHP:
1
2
3
4
$date = new DateTime("time string (niet timestamp!) uit database");
$now  = new DateTime(); // Huidige datum.
$now -> modify('-2 days');
$verschil_2dagen = $now > $date;


Of alternatief kun je de vergelijking doen met DateTime::diff, daar weer een DateInterval uit krijgen en die met een format controleren, maar dit werkt in mijn ervaring net even wat handiger :+

Aangezien je een timestamp field hebt met een CURRENT_TIMESTAMP ga ik er maar vanuit dat je MySQL gebruikt trouwens.

[ Voor 26% gewijzigd door FragFrog op 05-06-2010 20:00 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
Thanks, hij werkt! Ik heb nu:
PHP:
1
2
3
4
5
6
7
8
$db_tijd = $w['datum'];
$db_tijd = strtotime("$db_tijd");
$site_tijd = date("U");
$verschil = $site_tijd-$db_tijd;
if ($verschil > 172800) {
$verschil_2dagen = "ja"; }
else {
$verschil_2dagen = "nee"; }


En zo werkt hij :) Die functie staat alleen niet in mijn PHP boek of in my MySQL boek, en ook via Google kwam ik veel ingewikkeldere scripts tegen. Dus bedankt voor de tip!

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

WingsOfFury schreef op zaterdag 05 juni 2010 @ 21:17:
PHP:
1
$db_tijd = strtotime("$db_tijd");
Waarom zet je die var in een string?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
MueR schreef op zaterdag 05 juni 2010 @ 21:30:
[...]

Waarom zet je die var in een string?
Omdat
PHP:
1
$db_tijd = strtotime("$w['datum']");

Niet werkte, of doe ik iets fout?

Acties:
  • 0 Henk 'm!

  • jeroenikke
  • Registratie: Augustus 2003
  • Laatst online: 21:26
MueR bedoelt volgens mij
PHP:
1
2
3
<?php
$db_tijd = strtotime($db_tijd);
?>


Dus zonder quotes, en dan kan je inderdaad
PHP:
1
2
3
<?php
$db_tijd = strtotime($w['datum']);
?>


gebruiken

quotes zijn voor strings...

[ Voor 6% gewijzigd door jeroenikke op 06-06-2010 00:16 ]


Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 00:21
WingsOfFury schreef op zondag 06 juni 2010 @ 00:12:
[...]

Omdat
PHP:
1
$db_tijd = strtotime("$w['datum']");

Niet werkte, of doe ik iets fout?
Hij vroeg niet waarom je de datum in een var zet, hij vroeg waarom je die var in een string zet. ;)

De aanhalingstekens zijn overbodig.

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 19-09 10:42

Kwastie

Awesomeness

Als je toevallig beschikt over PHP 5.3 dan kun je mooi gebruik maken van de DateTime class. http://www.php.net/manual/en/datetime.diff.php :)

[ Voor 13% gewijzigd door Kwastie op 06-06-2010 01:59 ]

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Kwastie schreef op zondag 06 juni 2010 @ 01:51:
Als je toevallig beschikt over PHP 5.3 dan kun je mooi gebruik maken van de DateTime class. http://www.php.net/manual/en/datetime.diff.php :)
Unix timestamps vergelijken lijkt me toch echt wat makkelijker gaan dan eerst een nieuwe class te initialiseren. :)

*Het verschil tussen die 2 is ook zo uit te rekenen. (Nu - unix_timestamp = verschil in seconden)

[ Voor 12% gewijzigd door Manuel op 06-06-2010 13:44 ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Manuel schreef op zondag 06 juni 2010 @ 13:43:
[...]

Unix timestamps vergelijken lijkt me toch echt wat makkelijker gaan dan eerst een nieuwe class te initialiseren. :)

*Het verschil tussen die 2 is ook zo uit te rekenen. (Nu - unix_timestamp = verschil in seconden)
Tot je te maken krijgt met een DB server in een andere tijdzone dan je webserver, of zomer / wintertijd. Er zijn legio problemen die kunnen optreden wanneer je enkel naar het verschil in seconden kijkt, deels zijn die eenvoudig op te lossen (je kan bijvoorbeeld de huidige unix timestamp opvragen in je query, dan heb je geen gezeur met tijdzones), anderen leveren meer problemen op. Als het allemaal niet zo precies hoeft is dat geen probleem, maar als het wel nauwkeurig moet is de DateTime class een vrij goed alternatief :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Unix timestamps zijn altijd in UTC, dus daarmee heb je per definitie geen problemen met tijdzones.
Die problemen kun je alleen hebben als je bijvoorbeeld wilt dat iets ouder dan 2 kalenderdagen niet meer zichtbaar is. Als het je gaat om "ongeveer 2 dagen" dan kun je prima met het aantal seconden verschil tussen twee timestamps rekenen.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Dit kun je ook prima door MySQL zelf laten doen;
SQL:
1
SELECT *, DATE_DIFF(datum, CURDATE()) AS aantalDagen FROM ...

Heb je in je $w['aantalDagen'] het aantal dagen verschil.

Als het je altijd alleen om 2 dagen gaat kun je uiteraard ook een 0/1 value setten.

Acties:
  • 0 Henk 'm!

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
Xander schreef op zondag 06 juni 2010 @ 00:16:
[...]

Hij vroeg niet waarom je de datum in een var zet, hij vroeg waarom je die var in een string zet. ;)

De aanhalingstekens zijn overbodig.
Oh... :D Weer wat geleerd, bedankt!
FragFrog schreef op zondag 06 juni 2010 @ 14:04:
[...]

Tot je te maken krijgt met een DB server in een andere tijdzone dan je webserver, of zomer / wintertijd. Er zijn legio problemen die kunnen optreden wanneer je enkel naar het verschil in seconden kijkt, deels zijn die eenvoudig op te lossen (je kan bijvoorbeeld de huidige unix timestamp opvragen in je query, dan heb je geen gezeur met tijdzones), anderen leveren meer problemen op. Als het allemaal niet zo precies hoeft is dat geen probleem, maar als het wel nauwkeurig moet is de DateTime class een vrij goed alternatief :)
Verwijderd schreef op zondag 06 juni 2010 @ 14:11:
Unix timestamps zijn altijd in UTC, dus daarmee heb je per definitie geen problemen met tijdzones.
Die problemen kun je alleen hebben als je bijvoorbeeld wilt dat iets ouder dan 2 kalenderdagen niet meer zichtbaar is. Als het je gaat om "ongeveer 2 dagen" dan kun je prima met het aantal seconden verschil tussen twee timestamps rekenen.
Op bovenstaande quaotes: Ik weet niet of dit ook unix timestamps zijn:
WingsOfFury schreef op zaterdag 05 juni 2010 @ 19:41:
Ik heb in mijn database een veld datum met als type timestamp en de standaardwaarde is CURRENT_TIMESTAMP. Dit geeft als resultaat bijvoorbeeld: 2010-06-05 19:20:00.

Daarnaast heb ik in mijn site een date functie:
PHP:
1
$tijd = date("Y-m-d H:i:s");
Maar beiden veranderen gewoon mee met de zomer/winter tijd...
frickY schreef op zondag 06 juni 2010 @ 14:36:
Dit kun je ook prima door MySQL zelf laten doen;
SQL:
1
SELECT *, DATE_DIFF(datum, CURDATE()) AS aantalDagen FROM ...

Heb je in je $w['aantalDagen'] het aantal dagen verschil.

Als het je altijd alleen om 2 dagen gaat kun je uiteraard ook een 0/1 value setten.
Ik haal ook dingen uit de db die niet onder deze regel vallen, vandaar dat ik het vergelijk door php wilde laten uitvoeren ipv door MySQL.

Acties:
  • 0 Henk 'm!

  • G33rt
  • Registratie: Februari 2002
  • Laatst online: 22-06-2022
Nee, CURRENT_TIMESTAMP is een synoniem voor NOW() - wat een datum in een leesbaar formaat teruggeeft. MySQL kent ook een functie om wel de seconden sinds epoch te terug te geven; niet heel origineel heet die UNIX_TIMESTAMP() :)

Wel is het zo dat omdat je kolom in TIMESTAMP-formaat is, er intern allerlei conversies van of naar timestamps gedaan kunnen worden als je de verschillende datetime functies gebruikt. Dat staat ook in het relevante stuk van de manual wel uitgelegd.

PHP's date() geeft overigens de lokale tijd terug; de huidige unix timestamp krijg je door de goede modifier (U) te gebruiken. Dat ze keurig mee veranderen met de winter- en zomertijd klopt dus.

[ Voor 12% gewijzigd door G33rt op 08-06-2010 11:58 ]


Acties:
  • 0 Henk 'm!

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
Wow, echt super bedankt voor deze heldere uitleg! _/-\o_ Dit topic staat alleen al vanwege G33rts berichtje in mijn favorieten _/-\o_
Pagina: 1