Zu den Aufzeichnungen der tutorials.de-Live-Workshops
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
2072
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Hallo Leute,

    ich bin gerade auf der Suche nach einer Funktion (sowas wie "parseDateByFormat") der ich einen String als Datum (z.B.'2008-06-14 17:43:02') und ein entsprechendes Format (z.B. 'Y-M-D H:i:s') übergebe und die mir aus diesen Angaben dann einen Unix-Timestamp macht. Das Format soll dabei variieren können (und das Datum vom Aufbau her auch!). Vielleicht bin ich ja nur zu blind und finde die Funktion (-skette) nicht. Ich bin kurz davor mir da selbst etwas zu basteln.

    Danke für Eure Tips.

    Gruß,

    Shockshell
    Geändert von shockshell (24.06.08 um 18:46 Uhr)
     
    Nichts hält so lange wie ein Provisorium....

  2. #2
    Registriert seit
    Feb 2005
    Ort
    NRW
    Beiträge
    460
    Findest Du hier!
     

  3. #3
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Hi,

    das ist es gerade nicht was ich will, weil ich bei dieser Funktion bereits die einzelnen Segmente (Monat, Tag, etc.) extrahiert haben muss um sie an die Funktion zu übergeben. Ich befinde mich sozusagen davor. Ich habe einen Datum im Stringformat und ein dazugehöriges Format. Nun muss ich die einzelnen Teile des Datums diesem Format zuordnen. Sonst weiss ich nicht was ich in die Segmente eintragen muss. Und genau das ist es was mir fehlt. Der Rest (mktime) ist einfach.

    Gruß,

    shockshell.
    Geändert von shockshell (24.06.08 um 19:08 Uhr)
     
    Nichts hält so lange wie ein Provisorium....

  4. #4
    nepda nepda ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Ort
    Chemnitz
    Beiträge
    144
    Wie wäre es denn mit der (fast) so genannten Funktion strtotime()?
     

  5. #5
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Das ist schon dicht dran, aber leider nur der halbe Weg. Ich kann leider nicht davon ausgehen, dass das Datum in einem "englischen" Format geliefert wird. Es sollte wie gesagt "beliebig" sein.

    Gruß,

    Shockshell
     
    Nichts hält so lange wie ein Provisorium....

  6. #6
    nepda nepda ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Ort
    Chemnitz
    Beiträge
    144
    Dann wirst du wohl an regulären Ausdrücken kaum vorbeikommen.
     

  7. #7
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Das hab ich mir fast schon gedacht. Bin gerade dabei mir etwas zu basteln. Werde meine Lösung bei Fertigstellung hier mal posten... Solange lasse ich das Thema noch als offen.
    Geändert von shockshell (24.06.08 um 23:34 Uhr)
     
    Nichts hält so lange wie ein Provisorium....

  8. #8
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    PHP-Code:
    function parseDateByFormat($date$format)
    {
        
    $timestamp null;
        
    $formatPatterns = array(
            
    'a' => '(?P<a>am|pm)',
            
    'A' => '(?P<A>AM|PM)',
            
    'B' => '(?P<B>[0-9]{3})',
        
    //    'c' => '(?P<c>)',
            
    'd' => '(?P<d>[1-9]|[12][0-9]|3[01])',
            
    'D' => '(?P<D>Mon|Tue|Wed|Thu|Fri|Sat|Sun)',
            
    'F' => '(?P<F>January|February|March|April|May|June|July|August|September|October|November|December)',
            
    'g' => '(?P<g>[1-9]|1[0-2])',
            
    'G' => '(?P<G>[0-9]|1[0-9]|2[0-3])',
            
    'h' => '(?P<h>0[1-9]|1[0-2])',
            
    'H' => '(?P<H>[01][0-9]|2[0-3])',
            
    'i' => '(?P<i>[0-4][0-9]|5[0-9])',
            
    'I' => '(?P<I>[01])',
            
    'j' => '(?P<j>[1-9]|[12][0-9]|3[01])',
            
    'l' => '(?P<l>Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)',
            
    'L' => '(?P<L>[01])',
            
    'm' => '(?P<m>0[1-9]|1[0-2])',
            
    'M' => '(?P<M>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)',
            
    'n' => '(?P<n>[1-9]|1[0-2])',
            
    'O' => '(?P<O>[+\-][0-9]{4})',
        
    //    'r' => '(?P<r>)',
            
    's' => '(?P<s>[0-4][0-9]|5[0-9])',
            
    'S' => '(?P<S>st|nd|rd|th)',
            
    't' => '(?P<t>28|29|30|31)',
            
    'T' => '(?P<T>[A-Z]{3})',
            
    'U' => '(?P<U>[1-9][0-9]*)',
            
    'w' => '(?P<w>[0-6])',
            
    'W' => '(?P<W>[1-9]|[1-4][0-9]|5[0-3])',
            
    'Y' => '(?P<Y>[0-9]{4})',
            
    'y' => '(?P<y>[0-9]{2})',
            
    'z' => '(?P<z>[0-9]|[12][0-9][0-9]|3(?:[0-5][0-9]|6[0-5]))',
            
    'Z' => '(?P<Z>-?(?:[0-9]|[1-9][0-9]{3}|[1-3][0-9]{4}|4(?:[0-2][0-9]{3}|3[01][0-9]{2}|3200)))',
        );
        
    $regexp preg_replace('/[a-zA-Z]/e''isset($formatPatterns["$0"])?$formatPatterns["$0"]:"$0"'$format);
        if (
    preg_match('/^'.$regexp.'$/'trim($date), $match)) {
            
    $values = array(0000000);
            foreach (
    $match as $format => $value) {
                if (
    $format == 'g' || $format == 'G' || $format == 'h' || $format == 'H') {
                    
    $values[0] = $value;
                } else if (
    $format == 'i') {
                    
    $values[1] = $value;
                } else if (
    $format == 's') {
                    
    $values[2] = $value;
                } else if (
    $format == 'm' || $format == 'n') {
                    
    $values[3] = $value;
                } else if (
    $format == 'd' || $format == 'j') {
                    
    $values[4] = $value;
                } else if (
    $format == 'Y' || $format == 'y') {
                    
    $values[5] = $value;
                }
            }
            
    $timestamp mktime($values[0], $values[1], $values[2], $values[3], $values[4], $values[5]);
        }
        return 
    $timestamp;
    }
    var_dump(parseDateByFormat('2008-06-14 17:43:02''Y-m-d H:i:s')); 
     
    Markus Wulftange

  9. #9
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Super! Passt (fast)
    Musst beim kleinen d noch eine null am Anfang einfügen
    PHP-Code:
    (?P<d>[1-9]|[12][0-9]|3[01])  => (?P<d>0[1-9]|[12][0-9]|3[01]) 
    Danke.
     
    Nichts hält so lange wie ein Provisorium....

  10. #10
    mitopp Tutorials.de Gastzugang
    Hallo zusammen,

    ich hoffe jemand antwortet auf dieses doch schon etwas ältere Thema. Eventuell vllt auch Gumbo.

    Die Funktion ist super, aber verursacht einen Fehler bei diesem Format: parseDateByFormat('March 10, 2001, 5:16 pm', 'F j, Y, g:i a')
    Könnt ihr mir helfen?
     

  11. #11
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Wie lautet denn die Meldung?
     
    Nichts hält so lange wie ein Provisorium....

  12. #12
    mitopp Tutorials.de Gastzugang
    Keine Fehlermeldung. Nur der Timestamp ist falsch.
    Der Response ist: Timestamp: 976421760 || Formatiert: 10.12.2000 05:16:00 date("d.m.Y H:i:s", Timestamp)
     

  13. #13
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    Hiermit gehts:

    PHP-Code:
    function parseDateByFormat($date$format)
    {
        
    $timestamp null;
        
    $formatPatterns = array(
            
    'a' => '(?P<a>am|pm)',
            
    'A' => '(?P<A>AM|PM)',
            
    'B' => '(?P<B>[0-9]{3})',
        
    //    'c' => '(?P<c>)',
            
    'd' => '(?P<d>[1-9]|[12][0-9]|3[01])',
            
    'D' => '(?P<D>Mon|Tue|Wed|Thu|Fri|Sat|Sun)',
            
    'F' => '(?P<F>January|February|March|April|May|June|July|August|September|October|November|December)',
            
    'g' => '(?P<g>[1-9]|1[0-2])',
            
    'G' => '(?P<G>[0-9]|1[0-9]|2[0-3])',
            
    'h' => '(?P<h>0[1-9]|1[0-2])',
            
    'H' => '(?P<H>[01][0-9]|2[0-3])',
            
    'i' => '(?P<i>[0-4][0-9]|5[0-9])',
            
    'I' => '(?P<I>[01])',
            
    'j' => '(?P<j>[1-9]|[12][0-9]|3[01])',
            
    'l' => '(?P<l>Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)',
            
    'L' => '(?P<L>[01])',
            
    'm' => '(?P<m>0[1-9]|1[0-2])',
            
    'M' => '(?P<M>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)',
            
    'n' => '(?P<n>[1-9]|1[0-2])',
            
    'O' => '(?P<O>[+\-][0-9]{4})',
        
    //    'r' => '(?P<r>)',
            
    's' => '(?P<s>[0-4][0-9]|5[0-9])',
            
    'S' => '(?P<S>st|nd|rd|th)',
            
    't' => '(?P<t>28|29|30|31)',
            
    'T' => '(?P<T>[A-Z]{3})',
            
    'U' => '(?P<U>[1-9][0-9]*)',
            
    'w' => '(?P<w>[0-6])',
            
    'W' => '(?P<W>[1-9]|[1-4][0-9]|5[0-3])',
            
    'Y' => '(?P<Y>[0-9]{4})',
            
    'y' => '(?P<y>[0-9]{2})',
            
    'z' => '(?P<z>[0-9]|[12][0-9][0-9]|3(?:[0-5][0-9]|6[0-5]))',
            
    'Z' => '(?P<Z>-?(?:[0-9]|[1-9][0-9]{3}|[1-3][0-9]{4}|4(?:[0-2][0-9]{3}|3[01][0-9]{2}|3200)))',
        );
        
    $regexp preg_replace('/[a-zA-Z]/e''isset($formatPatterns["$0"])?$formatPatterns["$0"]:"$0"'$format);
        if (
    preg_match('/^'.$regexp.'$/'trim($date), $match)) {
            
    $values = array(0000000);
            foreach (
    $match as $format => $value) {
                if (
    $format == 'g' || $format == 'G' || $format == 'h' || $format == 'H') {
                    
    $values[0] = $value;
                } else if (
    $format == 'i') {
                    
    $values[1] = $value;
                } else if (
    $format == 's') {
                    
    $values[2] = $value;
                } else if (
    $format == 'm' || $format == 'n') {
                    
    $values[3] = $value;
                } else if (
    $format == 'd' || $format == 'j') {
                    
    $values[4] = $value;
                } else if (
    $format == 'Y' || $format == 'y') {
                    
    $values[5] = $value;
                }else if(
    $format=='F'){
                    switch(
    $value){
                        case 
    'January':
                            
    $values[3]=1;
                            break;
                        case 
    'February':
                            
    $values[3]=2;
                            break;
                        case 
    'March':
                            
    $values[3]=3;
                            break;
                        case 
    'April':
                            
    $values[3]=4;
                            break;
                        case 
    'May':
                            
    $values[3]=5;
                            break;
                        case 
    'June':
                            
    $values[3]=6;
                            break;
                        case 
    'July':
                            
    $values[3]=7;
                            break;
                        case 
    'August':
                            
    $values[3]=8;
                            break;
                        case 
    'September':
                            
    $values[3]=9;
                            break;
                        case 
    'October':
                            
    $values[3]=10;
                            break;
                        case 
    'November':
                            
    $values[3]=11;
                            break;
                        case 
    'December':
                            
    $values[3]=12;
                            break;
                    }
                }
            }
            
    $timestamp mktime($values[0], $values[1], $values[2], $values[3], $values[4], $values[5]);
        }
        return 
    $timestamp;
    }
    $time=parseDateByFormat('March 10, 2001, 5:16 pm''F j, Y, g:i a');
    echo 
    date('d.m.Y H:i:s',$time); 
    'F' war in der Schleife nicht abgearbeitet. Gilt auch für andere.
    Das mit der switch case kann man mit den Array auch etwas "hübscher" lösen.
    Gruß

    Shockshell
     
    Nichts hält so lange wie ein Provisorium....

  14. #14
    mitopp Tutorials.de Gastzugang
    Ah ok. Ist mir nicht aufgefallen, dass in der Schleife was fehlt. Danke. Ich teste es morgen mal mit "hübscherem" Array.
     

  15. #15
    mitopp Tutorials.de Gastzugang
    Hallo shockshell,

    es funktioniert hervorragend. Danke.
    Ich habe auch AM|PM abgefangen. Aber ich weiß nicht, wie ich die noch fehlenden Elemente in der Schleife verarbeiten kann.
    Kannst du mir noch einmal helfen?
     

Ähnliche Themen

  1. Datum in Timestamp umwandeln
    Von Kussilein im Forum PHP
    Antworten: 7
    Letzter Beitrag: 04.09.09, 18:29
  2. Datum in timestamp() umwandeln
    Von wildstar im Forum PHP
    Antworten: 2
    Letzter Beitrag: 28.02.06, 12:54
  3. Timestamp nach heutigen Datum, aber beliebiges Jahr, abfragen
    Von MM2410 im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 23.11.05, 17:39
  4. Timestamp in Datum umwandeln?
    Von moistwanted im Forum PHP
    Antworten: 6
    Letzter Beitrag: 23.03.05, 10:43
  5. Datum in timestamp umwandeln
    Von CamCara im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.07.04, 01:14