datetime string converteren met pregreplace
Ik probeer een string te converteren naar de gewenste notitie voor een timestamp.
De oorspronkelijke notitie (string) is: "11-1-12 10:46:53" (let ook op dubbele spatie)
De gewenste notie is: "jjjj-mm-dd hh:mm:ss" (1 spatie ertussen), dus in onderstaand voorbeeld wil als resultaat: "2012-01-11 10:46:53", maar ben hier nu kompleet de weg kwijt, onderstaande geeft een onjuist resultaat:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$datatimestamp = "11-1-12 10:46:53";
echo $datatimestamp."<br>"; // resultaat: "11-1-12 10:46:53"
$newdate = preg_replace(
"/(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2})/i",
"$3-$2-$1 $4:$5:$6",
$datatimestamp
);
echo $newdate."<br>"; // resultaat: "11-1-12 10:46:53"
?>
$datatimestamp = "11-1-12 10:46:53";
echo $datatimestamp."<br>"; // resultaat: "11-1-12 10:46:53"
$newdate = preg_replace(
"/(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2})/i",
"$3-$2-$1 $4:$5:$6",
$datatimestamp
);
echo $newdate."<br>"; // resultaat: "11-1-12 10:46:53"
?>
Heeft iemand een idee waar de fout zit en/of hoe het anders kan?
date("Y-m-d H:i:s', time());
@ Gunther, je voorbeeld gaat alleen op voor huidige systeemtijd die je als juiste (default) waarde verkrijgt uit php, maar als ik de timestamp uit mijn voorbeeld gebruik komt ook hier een onjuist resultaat omdat ik geen juiste tijd kan formuleren uit de originele timestamp string. Dit laatste is ook de bron van mijn probleem, het format van de originele timestamp moet eerst worden gewijzigd.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Voor zover ik zie werkt mijn code ook, dit is toch een stuk makkelijker?
Wouter, je hebt gelijk... jouw oplossing werkt en is inderdaad eenvoudiger! Dank je!
Resultaat Wouter 2012-06-01 09:42:00
is niet hetzelfde als
Resultaat Marco 2012-01-06 09:42:00
Gewijzigd op 12/01/2012 19:00:16 door - SanThe -
Ik ga via een foreach loop door een array, maar het resultaat is soms onjuist! Hieronder een voorbeeld van de functie van Wouter en Smur F, zoek de verschillen! :-)
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
33
34
35
36
37
38
39
40
41
42
43
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
33
34
35
36
37
38
39
40
41
42
43
<?php
$data[23] = '13/01/12 12:32';
$data[24] = '11/01/12 12:33';
foreach ($data as $id => $value){
$newTime = date("Y-m-d H:i:s", strtotime($value));
$datatimestamp = $newTime.PHP_EOL;
/* debugging: print original and converted header and date */
echo "input string = ".$value."<br>";
echo "output string = ".$datatimestamp."<br>";
}
/* resultaat:
input string = 13/01/12 12:32
output string = 1970-01-01 00:00:00
input string = 11/01/12 12:33
output string = 2012-11-01 12:33:00
*/
foreach ($data as $id => $value){
$date = date_create_from_format('d/m/y H:i', $value);
$datatimestamp = date_format($date, 'Y-m-d H:i:s');
/* debugging: print original and converted header and date */
echo "input string = ".$value."<br>";
echo "output string = ".$datatimestamp."<br>";
}
/* resultaat:
input string = 13/01/12 12:32
output string = 2012-01-13 12:32:00
input string = 11/01/12 12:33
output string = 2012-01-11 12:33:00
*/
?>
$data[23] = '13/01/12 12:32';
$data[24] = '11/01/12 12:33';
foreach ($data as $id => $value){
$newTime = date("Y-m-d H:i:s", strtotime($value));
$datatimestamp = $newTime.PHP_EOL;
/* debugging: print original and converted header and date */
echo "input string = ".$value."<br>";
echo "output string = ".$datatimestamp."<br>";
}
/* resultaat:
input string = 13/01/12 12:32
output string = 1970-01-01 00:00:00
input string = 11/01/12 12:33
output string = 2012-11-01 12:33:00
*/
foreach ($data as $id => $value){
$date = date_create_from_format('d/m/y H:i', $value);
$datatimestamp = date_format($date, 'Y-m-d H:i:s');
/* debugging: print original and converted header and date */
echo "input string = ".$value."<br>";
echo "output string = ".$datatimestamp."<br>";
}
/* resultaat:
input string = 13/01/12 12:32
output string = 2012-01-13 12:32:00
input string = 11/01/12 12:33
output string = 2012-01-11 12:33:00
*/
?>
Gewijzigd op 13/01/2012 15:10:03 door Marco V
Op zich is strtotime() een leuke functie, maar deze maakt zelf een interpretatie van de datum. Door de vele verschillende datum formaten kan die nog wel eens verkeerd gaan.
Als je een datetime hebt, moet je ook een timezone mee opslaan; anders is de tijd niet ondubbelzinnig.
Test maar eens uit op momenten rond de wissel van winteruur/zomeruur. Als je dan enkel de datetime hebt opgeslagen, en niet de timezone, weet je niet met welk van de twee je te maken hebt.
De meeste zelfgeschreven functies (over tijd/datum; timers; tijd tot bepaald moment) falen trouwens omwille van timezones.
Met unix seconden (als je ze goed gebruikt) zal je dat probleem niet hebben.
Gewijzigd op 13/01/2012 16:30:22 door Kris Peeters