Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisproblem timestamp,mktime,strtotime und php

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verständnisproblem timestamp,mktime,strtotime und php

    Hallo,

    vorab, ich glaube ist irgendwie nicht mein tag...

    folgendes problem:

    ich ziehe ein datum von einem anderen ab in dem ich sie mit strtotime in
    den timestamp umrechne und dann subtrahiere.
    Okay, jetzt teile ich das ergebnis durch die anzahl der tage die ein monat hat
    Bsp: 365 tage / 12 = 30,4126 und das wird in sekunden umgerechnet.

    das problem mit mktime ist das das ergebnis automatisch ein richtiges datum ist, also 31.11 wird zu 1.12 und so weiter,
    ich habe erwartet das strtotime das nicht macht. Es klingt komisch aber ich brauche das Datum 31.11, 29.02...,
    weil ich, es geht um vertragsende,dann ein tag zurückspringen muss/soll.
    Wenn ich das ergebnis der berechnungen mit strtotime(verwende keine andere funktin) ausrechne und mit date formatiere und ausgebe,
    bekomme ich automatisch das korrekte datum, also es wird eins weiter gesprungen.

    ich möchte eigentlich das falsche datum mit checkdate später prüfen und ein tag subtrahieren.

    gibt es eine schöne lösung an das falsche datum zu kommen.

    achso, was ich berechne:

    1. aktuelles datum - damaliges bestell datum / Tage des Monats
    2. das ergebnis + kündigungsfrist
    3. dieses ergebnis - laufzeit / autom. vertragsverlängerung
    4. dieses ergebnis * vertragsverlängerung + laufzeit
    5. das ergebnis wird zum bestelldatum hinzuaddiert
    also so
    PHP-Code:
    strtotime("+ ".$ergebnis." month"$bestelldatum); 
    nur zum verständnis.

    eigentlich möchte ich nur wissen ob sich strtotime wie mktime verhält und wenn ja was ich machen kann um ein falsches datum zu bekommen

    gruß

    und danke fürs lesen


  • #2
    Kannst du nochmal ganz knapp und eindeutig sagen, was du machen willst?

    Kommentar


    • #3
      ein kunde tätigt eine bestellung, dieses datum (zur zeit der bestellung)
      landet als startdatum in der datenbank.
      der kunde kündigt irgendwann später und jetzt soll das kündigungsdatum errechnet werden.
      Zum errechnen ist das datum abhängig von
      laufzeit die ausgewählt werden kann(während der bestellung)
      kündigungsfrist(steht als wert in der DB) die eingehalten werden muss und
      automatische vetragsverlängerung (die steht in der DB)

      fällt das errechnete datum auf den 31.11 z.B. soll nicht auf 1.12 gesprungen werden (strtotime macht das so)
      sondern 31.11 bleiben und ich mache ein checkdate drüber (und - 1 Tag)
      auf 30.11. dies ist von der firma das gewünschte kündigungsdatum.

      Kommentar


      • #4
        Wenn du durch deine Berechnungen auf den 31.11. kommst, hast du eh ein schlechtes Script.

        Sagen wir, ich melde mich an, meine Vertragslaufzeit geht jeweils 6 Monate, verlängert sich automatisch, wenn ich nicht 14 Tage vor ablauf kündige.

        Vorhandene Werte:
        Anmeldung: 01.01.2005
        Kündigseingang: 28.06.2005
        Kündigungsfrist: 14 Tage
        Vertragslaufzeit: 6 Monate

        Zu errechnende Datum:
        Vertragsende: 31.12.2005

        Hab ich das so richtig verstanden? (bevor ich hier anfang zu rechnen und zu coden )

        Kommentar


        • #5
          kündige mal am 31.08 + 6 monate = 31.02 -> das wäre dann 3.03(strtotime)
          oder am 31.03 + 6 Montate = 31.09, vertraglich sind 6 Monate 6 Monate, auslaufen muss der vertrag ein tag davor
          das heißt , bestätigt mir auch unsere rechtsabteilung,
          dieses datum muss ich haben und es darf auch vorkommen, nur brauche ich den tag davor.

          Kommentar


          • #6
            Nö, Monate sind Monate, und nicht 30,4126 Tage wie du es oben behauptet hast.
            Auf die Frage: Wieviel Tage hat ein Monat, kannst du nicht mit einem Wort/Zahl antworten.

            Wenn ich am 31.08.2005 kündige + 6 Monate, ist das nicht der 31.02. (das Datum gibt es nicht, wind dich raus wie du willst) und damit der 03.03., sondern der 28.02.2006.

            Kommentar


            • #7
              Denke das müsste so gehen, hab es nicht getestet. Hoffe ich konnte dir helfen.

              Code:
              <?
              $bestelldatum = 1134041460; // 08.12.2005 12:31 Uhr
              $kuendigungsfrist = 14; // in Tagen
              $vertragslaufzeit = 60; // in Tagen
              
              $newsec = 3600*24*$kuendigungsfrist;
              $newsec = (3600*24*$vertragslaufzeit)+$newsec+$bestelldatum;
              
              echo "Bestelldatum: ".$bestelldatum."
              ";
              echo "Kündigungsdatum: ".date("d.m.Y H:i", $newsec);
              ?>

              Kommentar


              • #8
                dieses datum muss ich haben und es darf auch vorkommen, nur brauche ich den tag davor.
                Aber trotzdem macht es keinen Sinn einen 31.11. zu errechnen.
                Was spricht dagegen vom 1.12. einen Tag abzuziehen? Ergibt auch den 30.11.

                Ich würde weiterhin mit dem Timestamp rechnen bis du das endgültige Ergebnis hast (ohne davor in Jahre, Tage oder was auch immer umzurechnen) und dann den Timestamp mit date() korrekt formatieren.

                Kommentar


                • #9
                  *zustimmung*

                  Kommentar


                  • #10
                    bei 12 Montate Vertragslaufzeit und 12 monate autom. Verlängerung:
                    ich kündige am 28.02.2001 - vertragsende soll sein 28.02.2002(super)
                    ich kündige am 29.02.2000 - vertragsende soll sein 29.02.2001, gibt es nicht also
                    ein tag zurück und nicht ein tag vor....., so soll es halt gemacht werden.

                    Kommentar


                    • #11
                      dann prüf doch einfach mit Date ob es ein Schaltjahr ist dann weiste ob du einen tag drauf oder runter rechnen musst. *korrigiert mich wenn ich falsch liege*

                      Kommentar


                      • #12
                        @webbie der timestamp wird mit date korrekt formatiert.

                        ich darf nicht immer ein tag abziehen 30.12 2001 ist 30.12 2002.
                        und hier sind wir bei meiner kernfrage wie bekomme ich dann heraus das es ein falsches datum war, wenn es gleich richtig dargestellt wird

                        Kommentar


                        • #13
                          es ist nicht immer schaltjahr abhängig, wie die beispiele davor zeigen

                          Kommentar


                          • #14
                            Müsste doch mit mktime korrekt zu realisieren sein.

                            Vielleicht hilft dir das:

                            date("d.m.Y", mktime(0,0,0,3,0,2000));

                            Wenn du für Tag 0 einträgst bei mktime wird immer der letzte Tag des vorherigen Monats ausgegeben.

                            In obigen Fall wäre das der 29.2.
                            Änderst du 2000 in 2001, dann wäre es der 28.2.

                            entsprechend könntest du auch zu den Monaten z.B. 6 Monate addieren und würdest passend 30 oder 31 Tage bekommen, jenachdem was es für ein Monat ist.

                            z.B. Laufzeit bis ende August
                            echo date("d.m.Y",mktime(0,0,0,9,0,2002));

                            gibt den 31. zurück.

                            Bei Laufzeit bis ende September
                            echo date("d.m.Y",mktime(0,0,0,10,0,2002));
                            gibt den 30. zurück.

                            Wichtig ist wie gesagt die 0 als Tagesangabe.
                            Schaltjahre werden auch korrekt berücksichtigt. Ich hoffe das hilft dir weiter.

                            Kommentar


                            • #15
                              ist ein schöner ansatz probiere das mal aus
                              danke

                              Kommentar

                              Lädt...
                              X