Pit: Datum subtrahieren

Hallo,

ich habe ein kleines Problem. Ich möchte anhand von 2 Datümer ermitteln, ob die zeitspanne zwischen diesen beiden Datümern.

$d1 = '2018-10-22 02:00';
$d2 = '2018-10-23 01:59';
$datetime1 = date_create($d1);
$datetime2 = date_create($d2);
$interval = date_diff($datetime1, $datetime2);
echo abs($interval->format('%a'));

ergibt 0, für mich bräuchte ich aber eine Funktion, die mir für

$d1 = '2018-10-22 23:59';
$d2 = '2018-10-23 00:01';
$datetime1 = date_create($d1);
$datetime2 = date_create($d2);
$interval = date_diff($datetime1, $datetime2);
echo abs($interval->format('%a'));

1 ausgibt.

Wie gehe ich das an?

Pit

  1. Hallo Pit,

    du willst unabhängig von der Zeit vergleichen, d.h. den Timestamp vom Zeitanteil befreien. Dazu könnte Dir eine dieser beiden Methoden helfen.

    $datetime1 = date_create($d1)->setTime(0,0,0);
    $datetime2 = date_create(substr($d2,0,10));
    

    Rolf

    --
    sumpsi - posui - clusi
    1. Hi Rolf,

      Stimmt, so gehts! Ich habe mich für Variante1 entschieden.

      Pit

  2. Du machst es Dir zu schwer.

    <?php
    
    $d1 = '2018-10-22 02:00';
    $d2 = '2018-10-23 01:59';
    
    # Splitten, um Tag und Uhrzeit zu trennen 
    $d1 = explode( ' ', $d1 );
    $d2 = explode( ' ', $d2 );
    
    # Uhrzeit weglassen, Zeitpunkt (Sekunden seit 1.1.1970) ermitteln
    $d1 = strtotime( $d1[0] );
    $d2 = strtotime( $d2[0] );
    
    # Differenz:
    $interval = $d1 - $d2;
    
    
    ### Eine von vielen Alternativen ###
    # $d1 = preg_replace( '/ [0-9]{1,2}:[0-9]{1,2}$/', '' , $d1 );
    # $d2 = preg_replace( '/ [0-9]{1,2}:[0-9]{1,2}$/', '' , $d2 );
    # $d1 = strtotime( $d1 );
    # $d2 = strtotime( $d2 );
    
    # $interval = $d1 - $d2;
    ####################################
    
    # Für Ausgabe durch 84600 dividieren
    echo $interval / ( 60 * 60 * 24 );
    
    1. Hi Regina,

      erstmal danke für Deine Hilfe.

      Du machst es Dir zu schwer.

      Bei allem Respekt, aber ich finde nun wirklich

      $d1 = '2018-10-22 02:00';
      $d2 = '2018-10-23 01:59';
      $datetime1 = date_create($d1)->setTime(0,0,0);
      $datetime2 = date_create($d2)->setTime(0,0,0);
      $interval = date_diff($datetime1, $datetime2);
      echo abs($interval->format('%a'));
      

      nicht schwieriger als Deine Lösung.

      <?php
      
      $d1 = '2018-10-22 02:00';
      $d2 = '2018-10-23 01:59';
      
      # Splitten, um Tag und Uhrzeit zu trennen 
      $d1 = explode( ' ', $d1 );
      $d2 = explode( ' ', $d2 );
      
      # Uhrzeit weglassen, Zeitpunkt (Sekunden seit 1.1.1970) ermitteln
      $d1 = strtotime( $d1[0] );
      $d2 = strtotime( $d2[0] );
      
      # Differenz:
      $interval = $d1 - $d2;
      
      
      ### Eine von vielen Alternativen ###
      # $d1 = preg_replace( '/ [0-9]{1,2}:[0-9]{1,2}$/', '' , $d1 );
      # $d2 = preg_replace( '/ [0-9]{1,2}:[0-9]{1,2}$/', '' , $d2 );
      # $d1 = strtotime( $d1 );
      # $d2 = strtotime( $d2 );
      
      # $interval = $d1 - $d2;
      ####################################
      
      # Für Ausgabe durch 84600 dividieren
      echo $interval / ( 60 * 60 *24 );
      

      Dennoch danke für die Hilfe,

      Pit

    2. Tach!

      Du machst es Dir zu schwer.

      Du machst es dir zu einfach. Mit den Datümern 2018-03-25 und 2018-03-26 ergibt deine Vorgehensweise -0.95833333333333.

      dedlfix.

      1. Hallo dedlfix,

        die Sommerzeit wird doch bestimmt bald abgeschafft 😂

        Aber wegen dieses Fehlers und weil $d1 - $d2 gedreht ist, also das Vorzeichen nicht der Vorgabe entspricht, habe ich mich mal zum warnenden Klick auf das - bequemt.

        Rolf

        --
        sumpsi - posui - clusi
        1. weil $d1 - $d2 gedreht ist, also das Vorzeichen nicht der Vorgabe entspricht

          @Rolf B : Du willst eine "1"? Du kriegst eine "1"!

          $d1 = '2018-10-22 02:00';
          $d2 = '2018-10-23 01:59';
           
          header ( "Content-Type: text/nonsens; charset=ASCII" );
          echo Rolf_B( $d1, $d2 );
          
          function Rolf_B( $s1, $s2) {
              if ( $s1 == $s2 ) {
                  return 0;
              } else {
                  return 1;
              }
          }
          

          Das erfüllt die Vorgaben sehr exakt und kleinlich. Und zwar genau die gemachten Vorgaben, nichts anderes. Das ist doch genau das, was Du (Rolf B) willst. Oder?

          1. Hallo Regina,

            nein, ich würde das eher mit dem ternary Operator erledigen.

            Rolf

            --
            sumpsi - posui - clusi
      2. Du machst es dir zu einfach. Mit den Datümern 2018-03-25 und 2018-03-26 ergibt deine Vorgehensweise -0.95833333333333.

        Tja. -0.95833333333333 (Tage) kann die (im Rahmen der erwartbaren Genauigkeit) korrekte Zeitspanne zwischen zwei Datumsangaben sein, wenn man 00:00:00 als Zeitpunkt der Messung am jeweiligen Tag ansieht. Unter den gleichen Prämissen kann -3.0416666666667 (Tage) die Zeitspanne zwischen zwei sorgfältig ausgewählten Tagen im Oktober sein.

        Wenn man ganze Zahlen haben will hilft das Runden (round()), will man ein anderes Vorzeichen muss bei der Substraktion Subjekt und Substrahend eben herumdrehen, will man den absoluten Betrag, so wende man die Funktion abs() an.

        Will man aber nur ein wenig rummaulen, so kritisiere man ganz einfach - ohne freilich selbst Lösungen anzubieten - die Ansätze der anderen.

        1. Tach!

          Will man aber rur ein wenig rummaulen, so kritisiere man ganz einfach - ohne freilich selbst Lösungen anzubieten - die Ansätze der anderen.

          Eine Lösung war bereits da, da musste ich nichts mehr hinzufügen. Aber ich habe auch eine: mit UTC-Zeiten rechnen, wenn man die Uhrzeit nicht braucht.

          Es gibt nur kein UTC-Pendant zu strtotime(), aber strtotime('2018-03-25 UTC') kann man nehmen. Nun kann man problemlos mit 24 Stunden für jeden Tag rechnen. Zum Extrahieren von Teilen muss man aber gmdate() statt date() nehmen.

          dedlfix.