Datum Von Datepicker In Db Speichern

Hallo,

ich würde gerne ein Datum vom Datepicker in meiner Datenbank speichern. Dazu hätte ich ein paar Fragen.

  1. Welches Format könnt ihr empfehlen? (Timestamp, Datetime)

  2. Wie wandelt man das Datum geeignet um? (Ich habe hier etwas vom CTimestampBehavior gelesen. Wie nutze ich den?)

Man soll das behavior im Model definieren, richtig?


public function behaviors(){

return array(

    'CTimestampBehavior' => array(

        'class' => 'zii.behaviors.CTimestampBehavior',

        'createAttribute' => 'create_time',

        'updateAttribute' => 'update_time',

        'setUpdateOnCreate'=> true,

    )

);

}

Was bringt mir das? Er weiß doch dann weder, welches Feld er umformatieren soll, noch, in welches Format? Ich denke mal, dass ich generell den Einsatz von Behaviors noch nicht verstanden habe. Kann mir da vielleicht jemand etwas auf die Sprünge helfen?

Danke!

CTimestampBehavior ist für was anderes gedacht: Es ist bewährte Praxis, jeder Tabelle mit vielen dynamischen Daten 2 Timestamp-Spalten zu verpassen. Eine enthält den Zeitstempel wann der Eintrag angelegt wurde, die andere, wann er zuletzt aktualisiert wurde. Das Behavior setzt diese Werte automatisch jedesmal wenn ein Record angelegt/gespeichert wird.

Was du suchst ist evtl. eher sowas wie das i18n-datetime-behavior (extension). Die ist zwar schon etwas betagt, sollte aber immer noch tun :).

Zu deiner Frage nach Behaviors: Sieh dir dazu mal diesen Abschnitt im Guide an: http://www.yiiframework.com/doc/guide/1.1/de/basics.component#behavior

Kurzgesagt kannst du mit Behaviors zusätzliche Methoden an deine Klassen anfügen. Manche Behaviors machen intensiven Gebrauch von Yii’s Event-System. Damit passieren dann manche Sachen automatisch. Das genannte CTimestampBehavior nutzt z.B. das “onBeforeSave” event, das jedesmal “abgefeuert” wird, kurz bevor ein Record geschrieben wird und setzt dann die 2 Spalten auf die entsprechenden Datumswerte.

ich speicher ein Datum immer im YYYY-MM-DD-Format und benutze das CMaskedTextField-Widget, wo ich im Format dd.mm.YYY eingeben lasse. Das heisst, ich wandel im beforeSave() nach YYYY-MM-DD um und im AfterFind() zurück

Hey,

danke, mit beforeSave und afterFind hat alles geklappt. habe es genau so geregelt wie du.

Beste Grüße!

Wichtig zu wissen ist:

DATETIME speichert das Datum (in Kalendernotation und) ohne Zeitzonenkonvertierung ab.

TIMESTAMP konvertiert vor dem Speichern von der aktuellen Zeitzone nach UTC - und beim Auslesen wieder in die aktuelle Zeitzone zurueck.

Zur Speicherung von User Input ist daher DATETIME besser geeignet.

Jetzt kann man noch die Variante diskutieren ob man auf DATETIME setzt oder auf ein INT Feld um eine (von PHP erzeugte) Timestamp zu speichern. Ich kenne einige Projekte die letzteres tun.

Ich persoenlich ziehe DATETIME Felder vor, insbesondere weil man in der Datenbank direkt das Datum lesen kann ohne jedesmal Timestamps umrechnen zu muessen. Fehlersuche und schnellere, kleinere Korrekturen direkt in der DB gehen damit leichter von der Hand. Letzendes ist halt ein Datum fuer Mennschen intuitiver zu lesen als eine Timestamp…