Rolf B: Datum kürzen

Beitrag lesen

Hallo ursus,

nicht mein Minus, aber ich denke, im Falle des string-Zweigs bist Du tatsächlich zu leichtsinnig. Man sollte ein paar Datumsformate verstehen, oder zumindest sicher sein, dass der String ein ISO-Datum ist bevor man ihn als solches interpretiert.

D.h. man sollte die Formate "yyyy-mm-dd", "yy-mm-dd", "dd.mm.yy und "dd.mm.yyyy" prüfen, und vielleicht noch "mm/dd/yyyy" und "mm/dd/yy". Ich weiß, dass das nicht sehr zuverlässig ist, aber besser als blindlings GIGO anzuwenden und yyyy-mm-dd zu unterstellen.

D.h.

function date2german($date = false)
{
  switch (gettype($date))
  {
    case 'boolean': 
      return date('d.m.y');
    case 'integer':
      return date('d.m.y', $date);
    case 'string':
      $yearOffs = strlen($date) == 8 ? 0 : 2;
      $fmtDate = function($s, $d, $m, $y) {
          return substr($s, $d, 2).".".substr($s, $m, 2).".".substr($s, $y, 2);
      };
      // yy-mm-dd   oder yyyy-mm-dd
      if ($date[$yearOffs+2] == "-" && $date[$yearOffs+5] == "-")
         return $fmtDate($date, $yearOffs+6, $yearOffs+3, $yearOffs);
      // dd.mm.yy oder dd.mm.yyyy
      if ($date[2] == "." && $date[5] == ".")
         return $fmtDate($date, 0, 3, $yearOffs+6);
      // mm/dd/yy oder mm/dd/yyyy
      if ($date[2] == "/" && $date[5] == "/")
         return $fmtDate($date, 3, 0, $yearOffs+6);
   }
   trigger_error("function date2german: Typ für '$date' nicht implementiert.",
                 E_USER_NOTICE);
   return false;
}

function test($input)
{
   echo "$input -> <" . date2german($input) . ">\n";
}

test(false);
test(time());
test("1.4.17");
test("01.04.17");
test("01.04.2017");
test("01/04/17");
test("01/04/2017");
test("17-04-01");
test("2017-04-01");

Wobei man das noch mit Regexen ausfeilen kann…

function date2german($date = false)
{
  switch (gettype($date))
  {
    case 'boolean': 
      return date('d.m.y');
    case 'integer':
      return date('d.m.y', $date);
    case 'string':
      // yy-mm-dd   oder yyyy-mm-dd
      // dd.mm.yy oder dd.mm.yyyy
      // mm/dd/yy oder mm/dd/yyyy
      if (preg_match("/^(?<year>\d\d?|\d{4})-(?<month>\d\d?)-(?<day>\d\d?)$/", $date, $matches) ||
          preg_match("/^(?<day>\d\d?)\.(?<month>\d\d?)\.(?<year>\d\d?|\d{4})$/", $date, $matches) ||
          preg_match("/^(?<month>\d\d?)\/(?<day>\d\d?)\/(?<year>\d\d?|\d{4})$/", $date, $matches)
         )
         return       str_pad($matches['day'], 2, STR_PAD_LEFT)
              . "." . str_pad($matches['month'],2,STR_PAD_LEFT)
              . "." . str_pad($matches['year'],2,STR_PAD_LEFT);
      trigger_error("function date2german: '$date' hat unbekanntes Format.",
                     E_USER_NOTICE);
      return false;

   }
   trigger_error("function date2german: Typ für '$date' nicht implementiert.",
                 E_USER_NOTICE);
   return false;
}

function test($input)
{
   echo "$input -> <" . date2german($input) . ">\n";
}

test(false);
test(time());
test("1.4.7");
test("1.4.17");
test("01.04.17");
test("01.04.217");
test("01.04.2017");
test("1/4/7");
test("01/04/17");
test("01/04/217");
test("01/04/2017");
test("7-04-1");
test("17-4-1");
test("2017-4-01");
test("217-04-01");
test("2017-04-01");

Rolf

--
sumpsi - posui - clusi
0 44

Datum kürzen

  1. 1
    1. 0
      1. 0
  2. 0
  3. 0
    1. 0
      1. 0
      2. 0
        1. 0
        2. 0
          1. 0
            1. 0
              1. 0
                1. 0
                  1. 0
                    1. 0
                      1. 0
                        1. 0
                  2. 1
                    1. 0
                      1. 0
                        1. 0
                          1. 0
                            1. 0
                            2. 0

                              microtime(true)

                              1. 0
                                1. 0
                                  1. 0
                                    1. 5
                              2. 0
                              3. 0
                                1. -1

                                  Kann passieren

                          2. 0
                            1. 0
                      2. 0
                        1. 0
                      3. 0
                        1. 0
                          1. 0
                            1. 0

                              PS: Benchmark Code

                            2. 0
                              1. 0
      3. 0