Hoe kan ik deze timestamp krijgen met PHP?
Ik heb een lange array waar twee waardes in staan.
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
[payload] => Array
(
[1] => Array
(
[van] => 2020-07-22T00:15:00+02:00
[tot] => 2020-07-22T00:30:00+02:00
[informatie] = testwaarde1
)
[2] => Array
(
[van] => 2020-07-22T00:30:00+02:00
[tot] => 2020-07-22T00:45:00+02:00
[informatie] = testwaarde2
)
)
)
(
[payload] => Array
(
[1] => Array
(
[van] => 2020-07-22T00:15:00+02:00
[tot] => 2020-07-22T00:30:00+02:00
[informatie] = testwaarde1
)
[2] => Array
(
[van] => 2020-07-22T00:30:00+02:00
[tot] => 2020-07-22T00:45:00+02:00
[informatie] = testwaarde2
)
)
)
In deze hele array moet ik de key vinden waar van en tot binnen de huidige tijd vallen. Dus as het 00:18 is moet hij de waardes uit de 1e key pakken.
Hoe kan ik dat het beste aanpakken? Ik dacht om de huidige tijd in een soortgelijk formaat te gieten en dan te kijken of die binnen van en tot valt via datetime (als dit werkt). Is er een betere manier?
Gewijzigd op 22/07/2020 13:38:40 door Snelle Jaap
strtotime(); ?
Vervolgens zou je een soortgelijk formaat kunnen gebruiken om vergelijkingen te doen om na te gaan in welk interval de "huidge tijd" valt. Hierbij moet je wel opletten dat je in eenzelfde tijdszone rekent, want "nu" (de tijd) voor ons betekent iets anders als "nu" voor iemand uit New York.
Je zou dus zoiets kunnen doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$in = array(
'payload' => array(
1 => array('van' => '2020-07-22T00:15:00+02:00', 'tot' => '2020-07-22T00:30:00+02:00', 'informatie' => 'testwaarde1'),
2 => array('van' => '2020-07-22T00:30:00+02:00', 'tot' => '2020-07-22T00:45:00+02:00', 'informatie' => 'testwaarde2'),
),
);
$tz = new DateTimeZone('Europe/Amsterdam');
$format = 'Y-m-d H:i:s';
$now = new DateTime('2020-07-22 00:18', $tz); // normaal gesproken zou dit de waarde 'now' (huidige datum+tijd) hebben
$index = false;
foreach ($in['payload'] as $k => $v) {
$start = new DateTime($v['van']); // indien de timestamp een ingebouwde timezone heeft wordt het tweede argument genegeerd
$end = new DateTime($v['tot']);
// van en met $start, tot en zonder $end, want deze intervallen overlappen
if ($start <= $now && $now < $end) {
$index = $k;
break;
}
}
if ($index === false) {
echo 'interval not found';
} else {
echo 'interval found on index '.$index.'<br>';
echo 'current time: '.$now->format($format).'<br>';
echo 'this is between '.$in['payload'][$index]['van'].' and '.$in['payload'][$index]['tot'].'<br>';
}
?>[end]
$in = array(
'payload' => array(
1 => array('van' => '2020-07-22T00:15:00+02:00', 'tot' => '2020-07-22T00:30:00+02:00', 'informatie' => 'testwaarde1'),
2 => array('van' => '2020-07-22T00:30:00+02:00', 'tot' => '2020-07-22T00:45:00+02:00', 'informatie' => 'testwaarde2'),
),
);
$tz = new DateTimeZone('Europe/Amsterdam');
$format = 'Y-m-d H:i:s';
$now = new DateTime('2020-07-22 00:18', $tz); // normaal gesproken zou dit de waarde 'now' (huidige datum+tijd) hebben
$index = false;
foreach ($in['payload'] as $k => $v) {
$start = new DateTime($v['van']); // indien de timestamp een ingebouwde timezone heeft wordt het tweede argument genegeerd
$end = new DateTime($v['tot']);
// van en met $start, tot en zonder $end, want deze intervallen overlappen
if ($start <= $now && $now < $end) {
$index = $k;
break;
}
}
if ($index === false) {
echo 'interval not found';
} else {
echo 'interval found on index '.$index.'<br>';
echo 'current time: '.$now->format($format).'<br>';
echo 'this is between '.$in['payload'][$index]['van'].' and '.$in['payload'][$index]['tot'].'<br>';
}
?>[end]
edit: vereenvoudiging na de tip van @Ward
Gewijzigd op 23/07/2020 14:15:40 door Thomas van den Heuvel
Als de "van"-DateTime > de gezochte DateTime, kun je dat tijdvak overslaan (en hoef je de "tot"-DateTime niet eens meer te converteren en controleren).
Als die array met DateTime-tijdvakken afkomstig is uit een database, dan zou ik overigens overwegen om het zoeken van een geschikt tijdvak te verplaatsen naar een query.
En mogelijk kun je dit alles (deels) omdraaien. Indien het allemaal intervallen van een kwartier betreft (of als dit op een of andere manier vastligt), dan zou je ook van tevoren kunnen bepalen binnen welk tijdvak een tijd valt, en dan zou je specifiek naar dit tijdvak kunnen zoeken. Dit is waarschijnlijk ook waar je naartoe wilt als je hier een query voor bakt.