datetime string converteren met pregreplace

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marco V

Marco V

12/01/2012 11:52:43
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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"
?>


Heeft iemand een idee waar de fout zit en/of hoe het anders kan?
 
PHP hulp

PHP hulp

24/11/2024 17:16:20
 
Jelle -

Jelle -

12/01/2012 11:59:38
Quote Anchor link
Ik denk dat het wel wat makkelijker kan:
http://www.php.net/manual/en/datetime.createfromformat.php
 
G P

G P

12/01/2012 11:59:59
Quote Anchor link
date("Y-m-d H:i:s', time());
 
Marco V

Marco V

12/01/2012 13:18:21
Quote Anchor link
@ Smur f :-) dat is precies waar ik naar heb gezocht, maar niet kon vinden! Ik ga hier even verder mee puzzelen, dank je!

@ 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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$newdate
= "11-1-12  10:46:53";
$newtime = strtotime($newdate);
$newdate = date("Y-m-d H:i:s", time($newtime));
echo $newdate."<br>"; // resultaat: "2012-01-12 11:11:44"
?>
 
Wouter J

Wouter J

12/01/2012 13:27:46
Quote Anchor link
Gewoon met strtotime en date werkt toch?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$time
= '11-1-12  10:46:53';
$newTime = date("Y-m-d H:i:s", strtotime($time));
echo $newTime.PHP_EOL;
?>
 
Marco V

Marco V

12/01/2012 13:41:25
Quote Anchor link
Hierbij de oplossing, met dank aan grote smur f :-)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$newdate
= "06/01/12  09:42";
echo "origineel: ".$newdate."<br>"; // resultaat: "origineel: 06/01/12 09:42"

$date = date_create_from_format('d/m/y  H:i', $newdate);
$newdate = date_format($date, 'Y-m-d H:i:s');

echo "aangepast: ".$newdate."<br>"; // resultaat: "aangepast: 2012-01-06 09:42:00"
?>
 
Wouter J

Wouter J

12/01/2012 17:42:18
Quote Anchor link
Voor zover ik zie werkt mijn code ook, dit is toch een stuk makkelijker?
 
Marco V

Marco V

12/01/2012 18:04:06
Quote Anchor link
Wouter, je hebt gelijk... jouw oplossing werkt en is inderdaad eenvoudiger! Dank je!
 
- SanThe -

- SanThe -

12/01/2012 18:58:41
Quote Anchor link
Datum 06/01/12 09:42

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 -
 
Marco V

Marco V

13/01/2012 13:33:25
Quote Anchor link
Sterker nog... ik ervaar alsnog problemen nu ik dit tracht te implementeren.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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

*/

?>
Gewijzigd op 13/01/2012 15:10:03 door Marco V
 
Jelle -

Jelle -

13/01/2012 14:27:45
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

13/01/2012 16:28:58
Quote Anchor link
Ze mogen hier zeggen wat ze willen, maar als je een unix time hebt, heb je een moment in de geschiedenis (of toekomst) dat ondubbelzinnig is.

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.