[php] Vreemd datum formaat omzetten

Pagina: 1
Acties:
  • 183 views sinds 30-01-2008
  • Reageer

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb een datum formaat die ik met PHP wil omzetten naar een beter (eigen) formaat.
Het gaat hier om:
Thu, 30 Aug 2001 13:01:14 +0200
Dit wil ik omzetten naar bijvoorbeeld:
30-08-2001 13:01:14

Het zou helemaal mooi zijn om die +0200 gelijk mee te nemen in de berekening. Dat is in dit voorbeeld goed gedaan, omdat we in Nederland in de +0200 timezone leven. Maar als het bijvoorbeeld +0300 dat er dan 1 uur bij wordt geteld.

Ik hoop dat iemand een simpele (snelle?) PHP oplossing heeft. Alvast bedankt. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

mktime() functie
date functie
en als je d'r ondersteuning voor hebt, strftime()

Vooral die laatste vind ik persoonlijk errug handig.
Dan kan je meteen naar lokale tijden en notaties (talen) omzetten.
(Met bijvoorbeeld: setlocale("LC_TIME","nl_NL.ISO_8859-1"); voor nederlandse notatie)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Uuhmm, ik snap het nog niet echt. Of is het te ingewikkeld wat ik wil zoals hierboven staat beschreven?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Wacky
  • Registratie: Januari 2000
  • Laatst online: 17-05 19:58

Wacky

Dr. Lektroluv \o/

Op vrijdag 31 augustus 2001 14:19 schreef jelmervos het volgende:
zou helemaal mooi zijn om die +0200 gelijk mee te nemen in de berekening. Dat is in dit voorbeeld goed gedaan, omdat we in Nederland in de +0200 timezone leven. Maar als het bijvoorbeeld +0300 dat er dan 1 uur bij wordt geteld.
Nederland is +0100 :)

Nu ook met Flickr account


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Nederland is +0100 :)
Niet tijdens DST - Daylight Savings Time. Dan is het +0200.

[ specs ] [ Tweaker gallery ]


  • Yo-L
  • Registratie: December 2000
  • Niet online
Ik heb 'n klein (nja, groter dan 'k eerst had gedacht) scriptje gebrouwd om dit voor elkaar te krijgen.. Er zitten verscheidene checks in, waarbij gelet wordt op de +0200 tijd dus, en daarna ook op het feit of er een nieuwe dag hoort te komen (bij meer dan 24 uur enzo). Hetzelfde voor een nieuwe maand en jaar..

Dit werkt volgens mij allemaal goed nu, op het feit na dat ik geen schrikkeljaar heb ingebouwd, maar dat is 1 dag in de 4 jaar dat het 'n fout geeft, dus daar had ik geen zin meer in..

Hopelijk heb je dr nog wat aan (fouten voorbehouden natuurlijk wel) :)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?
    $d1 = "Thu, 30 Aug 2001 13:01:14 +0200";


    $months = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    $monthdays = array(31,28,31,30,31,30,31,31,30,31,30,31);

    $regexd1 = "([a-zA-Z]{3}), ([0-9]{2}) ([a-zA-Z]{3}) ([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([-\+])([0-9]{2})([0-9]{2})";
    
    $d3 = ereg($regexd1, $d1, $d2);

    list($fulldate, $wkday, $day, $month, $year, $hour, $minute, $second, $sign, $signhour, $signminute) = $d2;

    for ($i = 0; $i < 12; $i++)
    {
        if ($months[$i] == $month)
        {
            $monthnr = ($i+1);
        }
    }
    
    if ($sign == "-")
    {
        $hour = ($hour - $signhour);
        $minute = ($minute - $signminute);
    }
    elseif ($sign == "+")
    {
        $hour = ($hour + $signhour);
        $minute = ($minute + $signminute);
    }

    if ($hour >= 24)
    {
        $hour = ($hour - 24);
        $day++;
    }
    elseif ($hour < 0)
    {
        $hour = (24 + $hour);
        $day--;
    }
    
    if ($day > $monthdays[($monthnr-1)])
    {
        $monthnr++;
        
        if ($monthnr > 12)
        {
            $monthnr = 1;
            $year++;
        }
        
        $day = "01";
    }
    elseif ($day < 1)
    {
        $monthnr--;
        
        if ($monthnr < 1)
        {
            $monthnr = 12;
            $year--;
        }
        
        $day = $monthdays[($monthnr-1)];
    }
        
    if ($monthnr < 10)
        $monthnr = "0".$monthnr;
    if ($hour < 10)
        $hour = "0".$hour;
    if ($minute < 10)
        $minute = "0".$minute;
    
    echo "<b>$d1</b> (input)<br>";            
    echo "<b>$day-$monthnr-$year $hour:$minute:$second</b> (output)";
        
?>

Veel plezier!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Thanks voor de reactie. Zal deze code zeker gebruiken!

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Yo-L
  • Registratie: December 2000
  • Niet online
Nog even wat veranderd wat ik me bedacht.. Had de minuten nog niet erbij geteld bij de +0200, nu wil +0230 en +0245 (hoe vaak komt dat nou voor, maar goed) er wel goed bij..

ziehier:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?
    $d1 = "Thu, 30 Aug 2001 13:01:14 -0245";

    $months = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    $monthdays = array(31,28,31,30,31,30,31,31,30,31,30,31);

    $regexd1 = "([a-zA-Z]{3}), ([0-9]{2}) ([a-zA-Z]{3}) ([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([-\+])([0-9]{4})";
    
    $d3 = ereg($regexd1, $d1, $d2);

    list($fulldate, $wkday, $day, $month, $year, $hour, $minute, $second, $sign, $signtime) = $d2;
    $signhour = substr($signtime, 0, 2);
    $signminute = substr($signtime, 2, 3);

    for ($i = 0; $i < 12; $i++)
    {
        if ($months[$i] == $month)
        {
            $monthnr = ($i+1);
        }
    }
    
    $hour = ($hour + ($sign.$signhour));
    $minute = ($minute + ($sign.$signminute));
    
    if ($minute >= 60)
    {
        $minute = ($minute - 60);
        $hour++;
    }
    elseif ($minute < 0)
    {
        $minute = ($minute + 60);
        $hour--;
    }

    if ($hour >= 24)
    {
        $hour = ($hour - 24);
        $day++;
    }
    elseif ($hour < 0)
    {
        $hour = (24 + $hour);
        $day--;
    }
    
    if ($day > $monthdays[($monthnr-1)])
    {
        $monthnr++;
        
        if ($monthnr > 12)
        {
            $monthnr = 1;
            $year++;
        }
        
        $day = "01";
    }
    elseif ($day < 1)
    {
        $monthnr--;
        
        if ($monthnr < 1)
        {
            $monthnr = 12;
            $year--;
        }
        
        $day = $monthdays[($monthnr-1)];
    }
        
    if ($monthnr < 10)
        $monthnr = "0".$monthnr;
    if ($hour < 10)
        $hour = "0".$hour;
    if ($minute < 10)
        $minute = "0".$minute;
    
    echo "<b>$d1</b> (input)<br>";            
    echo "<b>$day-$monthnr-$year $hour:$minute:$second</b> (output)";
        
?>

Verwijderd

Ietsje korter en 100% werkend:
PHP:
1
2
3
4
<?
$blaat = strtotime("Thu, 30 Aug 2001 13:01:14 +0200");
echo date("j-n-Y G:i:s",$blaat);
?>

Houdt meteen rekening met je schrikkeljaar etc.
Suc6!

  • Yo-L
  • Registratie: December 2000
  • Niet online
Op zaterdag 01 september 2001 10:08 schreef Exodus het volgende:
Ietsje korter en 100% werkend:
PHP:
1
2
3
4
<?
$blaat = strtotime("Thu, 30 Aug 2001 13:01:14 +0200");
echo date("j-n-Y G:i:s",$blaat);
?>

Houdt meteen rekening met je schrikkeljaar etc.
Suc6!
Ligt't aan mij of doet die +0200 daar gek als je dr wat anders van maakt?

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:36
Op zaterdag 01 september 2001 10:10 schreef Yo-L het volgende:
Ligt't aan mij of doet die +0200 daar gek als je dr wat anders van maakt?
Wát anders :?

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
<?
$t = "Thu, 30 Aug 2001 13:01:14 +0200";
$blaat = strtotime($t);
$hours = explode(" ",$t);
$todo = substr($hours[5],0,1);
$todo_rest = ((substr($hours[5],1,strlen($hours[5])) / 100) * 3600);
$blaat = $blaat + $todo_rest;
echo date("j-n-Y G:i:s",$blaat);
?>

Let even niet op variabelnaampjes enzo :)
of dit kan, of je splits de timestamp op en doet iets als
PHP:
1
2
3
<?
mktime (($aantaluren + 2),$minuten,$seconden,$maan,$dag,$jaar));
?>

Oh en die +0200 negeert 'ie hier gewoon.
Ik gok dat hij het beschouwd als "Dit is een timezone" niet "Dit is iets wat ik ermee moet doen"

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Bedankt voor de reacties!
Ik heb even een paar tests gedaan met verschillende timezone's en het bleek dat deze functie voldoet:
PHP:
1
2
3
4
5
6
7
8
9
10
<?
$time = "Thu, 30 Aug 2001 13:01:14 +0200";
echo date("d-m-Y H:i:s", strtotime($time)) . "<br>";
$time = "Thu, 30 Aug 2001 13:01:14 +0100";
echo date("d-m-Y H:i:s", strtotime($time)) . "<br>";
$time = "Thu, 30 Aug 2001 13:01:14 +0000";
echo date("d-m-Y H:i:s", strtotime($time)) . "<br>";
$time = "Thu, 30 Aug 2001 13:01:14 -0100";
echo date("d-m-Y H:i:s", strtotime($time)) . "<br>";
?>

Geeft mij:
30-08-2001 13:01:14
30-08-2001 14:01:14
30-08-2001 15:01:14
30-08-2001 16:01:14

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Allereerst sorry dat ik dit oude topic oprakel maar ik heb een vraag hierover.

Het omzetten van een dode tijdsaanduiding snap ik, maar ik krijg het niet voor elkaar een <pubdate> uit een RSS stream om te zetten naar bijvoorbeeld 21/10 22:03.

Ik ben geen PHP-guru, maar wat ik probeer is het volgende :

$date1 = '$pubDate';
$date = date("d/m Y H:i", strtotime($date1));

Ik krijg hierdoor steeds op alles als uitkomst : 01/01 1970 00:59.

Ik hoop dat iemand mij kan uitleggen hoe ik wel de juiste omgezette pubdate kan krijgen.

Edit... aantal dingen toegevoegd om het duidelijker te maken.

[ Voor 37% gewijzigd door Verwijderd op 21-10-2004 23:43 ]


  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 11:05
Wanneer je
PHP:
1
2
$date1 = '$pubDate';
$date = date("d/m Y H:i", strtotime($date1));

Gebruikt, komt de inhoud van $pubDate eigenlijk helemaal niet bij strtotime(), want je gebruikt er enkele haakjes omheen.

En eerst in een andere variabele zetten in eigenlijk vrij nutteloos, probeer het eens zo:
PHP:
1
$date = date("d/m Y H:i", strtotime($pubDate));

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Verwijderd

Okee, dank je voor je reaktie. Ik heb het geprobeerd, maar werkt nog niet.

Ik krijg nu op alles 22/10 2004 00:00. Toch zou het zou niet zo moeilijk moeten zijn lijkt me. Dode tekst met Thu, 21 Oct 2004 12:01:40 GMT omzetten werkt wel.

Misschien op een of andere manier de waarde van de pubdate inlezen en als tekst aanbieden zodat die het om kan zetten. Maar hoe dat dan weer moet.

[ Voor 25% gewijzigd door Verwijderd op 22-10-2004 00:08 ]

Pagina: 1