Avatar billede sjh Nybegynder
17. maj 2004 - 16:20 Der er 20 kommentarer og
1 løsning

opdel at dato

Hvordan kan jeg få opdelt en givet dato?

Jeg skal ha lavet det så man kan skrive dato på alle måder. fx.
17-05-2004, 17/05-2004, 17/05/2004, 2004-05-17, 17-05-04 osv..

Og så skal det gerne passe ind i Date2Num()

<?php
  function Date2Num($Dato) {
    return mktime(0, 0, 0, $month, $day, $year);
  }
?>
Avatar billede madd Nybegynder
17. maj 2004 - 16:21 #1
Kig på funktionen strtotime().

/mattias
Avatar billede sjh Nybegynder
17. maj 2004 - 16:28 #2
virker ikke med:
<?php
  echo strtotime("17/05-2004"); //-- Return -1
?>
Avatar billede bromer Nybegynder
17. maj 2004 - 16:56 #3
ellers kan du lave en case med de forskellige formater du gerne vil fange. Når du har fanget formatet kan du opdele med explode().
Avatar billede Slettet bruger
17. maj 2004 - 21:41 #4
Derudover er der nogle formater, du er nødt til at vælge fra. Det er jo umuligt for et script at gætte om 05-06-04 er 5. juni 2004 eller 4. juni 2005.
Avatar billede sjh Nybegynder
17. maj 2004 - 22:12 #5
Ja kan godt se det.. hvorfor er der også så mange måder at gøre det på :|

Når men jeg kunne godt bruge noget kode så jeg kan komme lidt vider.. ;) nogle som lige kan komme med nogle eks. på hvordan man kunne gøre det i php?
Avatar billede Slettet bruger
17. maj 2004 - 22:31 #6
Du kan starte med det her:

<?php
  function Date2Num($Dato) {
    // 17.05.2004 og 7.5.2004 (uanset skilletegn)
    $soeg[]='/^(\d?\d)[^\d](\d?\d)[^\d](\d{4})$/';
    $erstat[]='$3-$2-$1';

    // 2004.05.17 (uanset skilletegn) og 20040517
    $soeg[]='/^(\d{4})[^\d]?(\d{2})[^\d]?(\d{2})$/';
    $erstat[]='$1-$2-$3';

    list($year, $month, $day) = explode($preg_replace($soeg,$erstat,$Dato));

    return mktime(0, 0, 0, $month, $day, $year);
  }
?>
Avatar billede sjh Nybegynder
17. maj 2004 - 22:36 #7
Måsk smart. men fatter O af hvad der sker... hvis det så bare var noget med if (... :|
Avatar billede Slettet bruger
17. maj 2004 - 22:57 #8
OK, jeg forklarer lidt:

/^(\d?\d)[^\d](\d?\d)[^\d](\d{4})$/

Dette er en såkaldt RegExp, som er en slags avanceret tekstfilter, der kan afsindigt mange underlige ting. Her har jeg dog ikke brugt det helt vilde.

/ er bare en start- (og slut) markør.
\d betyder et ciffer
\d? betyder et ciffer eller ingenting
\d?\d betyder dermed et ciffer eller ingenting efterfulgt af et ciffer - dvs et eller 2 cifre
[^\d] betyder et tegn, der ikke er et ciffer
\d{4} betyder 4 cifre

^ betyder start på strengen (Undtagen når det står i [])
$ betyder slut på strengen

() bruges til at markere ting, der skal bruges i erstat-delen.

Så hele den lange kode /^(\d?\d)[^\d](\d?\d)[^\d](\d{4})$/ betyder altså

Strengen begynder med 1 eller 2 cifre, som vi gemmer som $1, derefter kommer et tegn, der ikke er et tal, efterfulgt af 1 eller 2 cifre, som vi gemmer som $2. Så er der endu et ikke-tal og tilsidst 4 cifre, som vi gemmer som $3. Så er strengen slut.

Hvis $Dato passer på ovennævnt beskrivelse, så bliver den lavet om til '$3-$2-$1' dvs. det vi gemte ovenfor, bare i omvendt rækkefølge og med minus imellem.

Noget tilsvarende sker med det andet $soeg/$erstat-par.

Når $dato er lavet om til 2004-17-05, splitter explode() den op i de tre elementer, som så bliver puttet i passende variable.
Avatar billede Slettet bruger
17. maj 2004 - 23:00 #9
Og jeg mente naturligvis 2004-05-17 til sidst.
Avatar billede sjh Nybegynder
17. maj 2004 - 23:06 #10
jeg har lavet en i Visual Basic.. men ville godt have den lavet om til PHP :)

Private Sub Form_Load()
  Me.Caption = Date2Num("hej2004med05dig17exp") 'Return 17/05-2004
  Me.Caption = Date2Num("exp17hej05med2004dig") 'Return 17/05-2004
End Sub

Public Function Date2Num(ByVal strDato As String) As String
Dim i As Integer, c As Integer
Dim strOne As String, blnNumber As Boolean
Dim arrOut(2) As String 'month, day, year
  For i = 1 To Len(strDato)
    strOne = Mid$(strDato, i, 1)
    Select Case strOne
          Case 0 To 9
            If c <= 2 Then
              arrOut(c) = (arrOut(c) & strOne)
              blnNumber = True
            End If
          Case Else
            If blnNumber = True Then
              c = c + 1
              blnNumber = False
            End If
    End Select
  Next
  If Len(arrOut(2)) = 4 Then
    Date2Num = (arrOut(0) & "/" & arrOut(1) & "-" & arrOut(2))
  ElseIf Len(arrOut(0)) = 4 Then
    Date2Num = (arrOut(2) & "/" & arrOut(1) & "-" & arrOut(0))
  End If
End Function
Avatar billede Slettet bruger
17. maj 2004 - 23:40 #11
Den fatter jeg så ikke meget af. (Og så alligevel - jeg kan vidst godt se, hvad der foregår.)

Jeg har rettet i regexp, så den også godtager hele ord og sætninger imellem tallene. Dermed gør vores to scripts nærmest det samme. (Bortset fra at den putter det i mktime())



<?php
  function Date2Num($Dato) {
    // tre klumper tal med andre tegn uden om
    $soeg[]='/^[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+$/';
    $erstat[]='$1-$2-$3';

    // Deler 8 cifre op som XXXX-XX-XX
    $soeg[]='/^[^\d]*(\d{4})(\d{2})(\d{2})[^\d]*$/';
    $erstat[]='$1-$2-$3';

    $arrOut = explode($preg_replace($soeg,$erstat,$Dato));
   
    if (strlen($arrOut[0])==4) {
      $resultat=mktime(0, 0, 0, $arrOut[2], $arrOut[1], $arrOut[0]);
    } elseif (strlen($arrOut[2])==4) {
      $resultat=mktime(0, 0, 0, $arrOut[0], $arrOut[1], $arrOut[2]);
    } else {
      $resultat=false;
    }
    return $resultat;
  }
?>
Avatar billede sjh Nybegynder
17. maj 2004 - 23:48 #12
for fejl i linje 16 -> Fatal error: Call to undefined function: () in .....

$arrOut = explode($preg_replace($soeg,$erstat,$Dato));
Avatar billede Slettet bruger
17. maj 2004 - 23:52 #13
Der var lige et $-tegn for meget i den linie. Ret til explode(preg_replace
Avatar billede sjh Nybegynder
17. maj 2004 - 23:55 #14
ny fejl i linje 16 -> Warning: Wrong parameter count for explode() in ...

$arrOut = explode(preg_replace($soeg,$erstat,$Dato));
Avatar billede Slettet bruger
18. maj 2004 - 00:14 #15
Jeg forstår altså heller ikke, hvor det $ kom fra... Nåh, men der, hvor du lige fjernede $-tegnet, skal der stå '-',
Avatar billede Slettet bruger
18. maj 2004 - 00:15 #16
Dvs.

$arrOut = explode('-',preg_replace($soeg,$erstat,$Dato));
Avatar billede sjh Nybegynder
18. maj 2004 - 16:45 #17
Ja nu kommer der ikke nogle fejl, men den retuner heller ikke noget.

Jeg tester det sådan:

<?php
  echo Date2Num("17/05-2004");
?>
Avatar billede Slettet bruger
18. maj 2004 - 23:15 #18
Der var et + som skulle have været en *

<?php
  function Date2Num($Dato) {
    // tre klumper tal med andre tegn uden om
    $soeg[]='/^[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]*$/';
    $erstat[]='$1-$2-$3';

    // Deler 8 cifre op som XXXX-XX-XX
    $soeg[]='/^[^\d]*(\d{4})(\d{2})(\d{2})[^\d]*$/';
    $erstat[]='$1-$2-$3';

    $arrOut = explode($preg_replace($soeg,$erstat,$Dato));
 
    if (strlen($arrOut[0])==4) {
      $resultat=mktime(0, 0, 0, $arrOut[2], $arrOut[1], $arrOut[0]);
    } elseif (strlen($arrOut[2])==4) {
      $resultat=mktime(0, 0, 0, $arrOut[0], $arrOut[1], $arrOut[2]);
    } else {
      $resultat=false;
    }
    return $resultat;
  }
?>
Avatar billede sjh Nybegynder
19. maj 2004 - 00:54 #19
Pyha.. fik det til at virke, måtte lave lidt om på det i arrOut[0,1,2] men nu skulle det virke.. Takker mange gange for hjælpen :-)

<?php
  function Num2Date($Number) {
    return date("d/m-Y", $Number);
  }
?>
<?php
  function Date2Num($Dato) {
    // tre klumper tal med andre tegn uden om
    $soeg[]='/^[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]*$/';
    $erstat[]='$1-$2-$3';

    // Deler 8 cifre op som XXXX-XX-XX
    $soeg[]='/^[^\d]*(\d{4})(\d{2})(\d{2})[^\d]*$/';
    $erstat[]='$1-$2-$3';

    $arrOut = explode('-',preg_replace($soeg,$erstat,$Dato));

    if (strlen($arrOut[2])==4) {
      $resultat=mktime(0, 0, 0, $arrOut[1], $arrOut[0], $arrOut[2]);
    } elseif(strlen($arrOut[0])==4) {
      $resultat=mktime(0, 0, 0, $arrOut[1], $arrOut[2], $arrOut[0]);
    } else {
      $resultat=mktime(0, 0, 0, $arrOut[1], $arrOut[0], $arrOut[2]);
    }
    return $resultat;
  }
?>
<?php
  //-- Test
  echo Num2Date(Date2Num("17/05-2004"))."<br>";
  echo Num2Date(Date2Num("2004-05-17"))."<br>";
  echo Num2Date(Date2Num("17/05-04"))."<br>";
?>
Avatar billede Slettet bruger
19. maj 2004 - 14:08 #20
Det var da utroligt, så mange små fejl, jeg fik ind i det lille script. ;-(

Godt du fandt ud af det. (Jeg burde nok teste kode, før jeg sender indlæg, men nogle gange går det hurtigt.)
Avatar billede sjh Nybegynder
19. maj 2004 - 22:48 #21
ha ha :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester