String als Datum auslesen um Wochentag zu ermitteln
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
beispiel
break
code
date
datum
format
funktion
http
jahr
manual
monat
part
problem
tag
termin
tran
url
wochentag
wunsch
-
Hallo liebe Gemeinde,
ich möchte aus einem tag/datum">Datumsstring, zB. 12.12.2012 , welcher so in der Datenbank liegt den Wochentag ermitteln. Wie kann ich aus diesem String wieder ein Datum machen?
Es gibt eine Vielzahl von Date-Funktionen, aber für mich erschließt sich da immer nur die Möglichkeit das aktuelle Datum auszulesen. Für das "Rückwärtst" finde ich mich nicht durch?
Vielen Dank im Vorraus, Frank -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
http://forums.devshed.com/php-development-5/get-weekday-from-date-yyyy-mm-dd-3478.html
Vielleicht hilft das weiter. ;) -
ist das Datum im "deutschen" Datums-Format ? .... DD.MM.YYY
ist der Trenner zwischan Tag, Monat und JAhr immer ein Punkt ?
hier eine Funktion mit zwei Beispielen.
<?php // ------------------------------------------------------ function wochentag($datum, $debug=false) { $parts = explode('.',$datum); $timestamp = strtotime( $parts[2] .'-'. $parts[1] .'-'. $parts[0]); $weekday_short = date('D',$timestamp); $weekday_long = date('l',$timestamp); $trans = array( 'Monday' => 'Montag', 'Tuesday' => 'Dienstag', 'Wednesday' => 'Mittwoch', 'Thursday' => 'Donnerstag', 'Friday' => 'Freitag', 'Saturday' => 'Samstag', 'Sunday' => 'Sonntag', 'Mon' => 'Mo', 'Tue' => 'Di', 'Wed' => 'Mi', 'Thu' => 'Do', 'Fri' => 'Fr', 'Sat' => 'Sa', 'Sun' => 'So', ); $weekday_short_ger = $trans[$weekday_short]; $weekday_long_ger = $trans[$weekday_long]; if ($debug !== false) { print " <br />========== DEBUG ========== <br />\n"; print "Datum: $datum <br />\n"; print "TimeStamp: $timestamp <br />\n"; print "Wochentag (lang): $weekday_long_ger <br />\n"; print "Wochentag (kurz): $weekday_short_ger <br />\n"; print " <br />\n"; } $out = $weekday_long_ger; return $out; } // ------------------------------------------------------ print "<p> ----------- Beispiel 1 ------------ </p>\n"; $datum1 = '12.12.2012'; $w_day1 = wochentag($datum1); print "<p>$datum1 ist ein $w_day1</p>\n"; print "<br />\n"; print "<br />\n"; print "<p> ----------- Beispiel 2 ------------ </p>\n"; $datum2 = '01.11.2013'; $w_day2 = wochentag($datum2, true); print "<p>$datum2 ist ein $w_day2</p>\n"; print "<br />\n"; print "<br />\n"; // ------------------------------------------------------ ?>
... das Beispiel 1 ist ohne Debug-Ausgabe und das Beispiel 2 ist mit ... .
Die Ausgabe davon ist
----------- Beispiel 1 ------------ 12.12.2012 ist ein Mittwoch ----------- Beispiel 2 ------------ ========== DEBUG ========== Datum: 01.11.2013 TimeStamp: 1383260400 Wochentag (lang): Freitag Wochentag (kurz): Fr 01.11.2013 ist ein Freitag ...
Wenn anderes Datums-Format (oder mit Stunden, Minuten, Sekunden)
dann den Teil entsprechend ändern wo der $timestamp erstellt wird.
Beachte: strtotime() erwartet ein in englischer Textform angegebenes Datum,
also muss man bei "deutschen" Datums-Format zuerst umstellen zu englischem.
Beitrag zuletzt geändert: 1.11.2013 10:15:56 von privatkredit -
Intelligent wäre es schon vorneweg, ein Datum immer als timestamp in der datenbank zu haben, den mit date() kannst du aus dem timestamp den datumstring generieren und dann würdest du jetzt nicht vor diesem problem stehen...
Wie auch immer, mit folgendem code dürfte es gehen:
$date = "12.12.2012"; $tag = date("l",strtotime($date)); switch($tag){ case "Monday": $tag = "Montag"; break; case "Tuesday": $tag = "Dienstag"; break; case "Wednesday": $tag = "Mittwoch"; break; case "Thursday": $tag = "Donnerstag"; break; case "Friday": $tag = "Freitag"; break; case "Saturday": $tag = "Samstag"; break; case "Sunday": $tag = "Sonntag"; break; } echo $tag;
-
Hallo liebe Helfer,
Das Problem ist, es soll ein Termin vereinbart werden, bei dem ein Wunschtermin in der Zukunft eingegeben wird. DAs wird auch von Mitgliedern sein, welche nicht mit anderen Terminformaten zu tun haben, also nur 12.01.2013 ect. zu tun hatten und haben. Das möchte ich dann zur Quittierung mit dem Wochentag ausgeben.
Ich bin jetzt noch nicht zum Ausprobieren gekommen, aber ich denke, eure Beispiele werden mir weiterhelfen, ansonsten melde ich mich wieder.
Vielen, vielen Dank ich hätte das kaum selber rausgefunden, schön dass es euch gibt,
allen ein schönes Wochenende,
Frank -
Hallo
Wie trägt der User seinen Wunsch-Termin ein ? in ein einfaches Textfeld ?
ich würde es mit 3 Dropdown machen,
so das jedes Element (Tag, Monat, Jahr) einzeln ausgewählt wird.
dann gibt es kein Problem mit dem Datums-Format (deu / eng, Trennzeichen, etc)
Beispiel:
<html> <head> <title>Termin</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body bgcolor="#FFFFFF" text="#000000"> <?php // ------------------------------------------------------------------ $runfile = $_SERVER['PHP_SELF']; print "<br /> --- <a href=\"$runfile\">HOME / START</a> ---\n"; print "<br />\n"; function wochentag($termin, $format='timestamp') { if ($format == 'string') { $parts = explode('.',$termin); $timestamp = strtotime( $parts[2] .'-'. $parts[1] .'-'. $parts[0]); } else { $timestamp = $termin; } $weekday_long = date('l',$timestamp); $trans = array( 'Monday' => 'Montag', 'Tuesday' => 'Dienstag', 'Wednesday' => 'Mittwoch', 'Thursday' => 'Donnerstag', 'Friday' => 'Freitag', 'Saturday' => 'Samstag', 'Sunday' => 'Sonntag', 'Mon' => 'Mo', 'Tue' => 'Di', 'Wed' => 'Mi', 'Thu' => 'Do', 'Fri' => 'Fr', 'Sat' => 'Sa', 'Sun' => 'So', ); $weekday_long_ger = $trans[$weekday_long]; return $weekday_long_ger; } // ------------------------------------------------------------------ if (!empty($_REQUEST['tag']) && !empty($_REQUEST['monat']) && !empty($_REQUEST['jahr'])) { print '<br>'."\n"; print '<h2>Neuen Wunsch-Termin ... speichern:</h2>'."\n"; print '<br>'."\n"; $wunsch_tag = $_REQUEST['tag']; $wunsch_mon = $_REQUEST['monat']; $wunsch_jah = $_REQUEST['jahr']; $datum_string_ger = $wunsch_tag.'-'.$wunsch_mon.'-'.$wunsch_jah; $datum_string_eng = $wunsch_jah.'-'.$wunsch_mon.'-'.$wunsch_tag; $termin_timestamp = strtotime($datum_string_eng); $termin_wochentag = wochentag($termin_timestamp); print "<br />\n"; print "<br /> Datum deutsch: ".$datum_string_ger."\n"; print "<br /> Datum english: ".$datum_string_eng."\n"; print "<br /> Unix TimeStamp: ".$termin_timestamp."\n"; print "<br /> Termin Wochentag: ".$termin_wochentag."\n"; print "<br />\n"; // ---- hier den Wunsch-Termin mit $wunsch_timestamp in die DB speichern // ---- INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) // ------------------------------------------------------------------ } else { // ------------------------------------------------------------------ ?> <br> <h2>Neuen Wunsch-Termin ... eintragen:</h2> <br> <form name="form1" method="post" action="<?php print $runfile; ?>"> Tag: <select name="tag"> <?php // ------------------------------------------------ for ($xd=1; $xd<=31; $xd++) { $zd = str_pad($xd,2,'0',STR_PAD_LEFT); print ' <option value="'.$zd.'">'.$zd.'</option>'."\n"; } // ------------------------------------------------ ?> </select> Monat: <select name="monat"> <?php // ------------------------------------------------ for ($xm=1; $xm<=12; $xm++) { $zm = str_pad($xm,2,'0',STR_PAD_LEFT); print ' <option value="'.$zm.'">'.$zm.'</option>'."\n"; } // ------------------------------------------------ ?> </select> Jahr: <select name="jahr"> <?php // ------------------------------------------------ $start_jahr = date('Y'); $ender_jahr = ($start_jahr + 10); // ------------------------------------------------ for ($xy=$start_jahr; $xy<=$ender_jahr; $xy++) { $zy = $xy; print ' <option value="'.$zy.'">'.$zy.'</option>'."\n"; } // ------------------------------------------------ ?> </select> Termin eintragen: <input type="submit" name="next" value="OK"> </form> <br> <br> <br> <?php // ------------------------------------------------------------------ } // ------------------------------------------------------------------ ?> <br> <br> <br> </body> </html>
mit 3 dropDowns kann im Eingabe-Format nichts schief gehen,
dann kannst du das Datum gleich in einen Timestamp umrechnen
und dann den Termin auch gleich als Timestamp speichern.
Beitrag zuletzt geändert: 2.11.2013 9:59:15 von myvotes -
Warum denn so kompliziert?
PHP hat eine Funktion namens strtotime und die Funktion date, damit kann man das Datum parsen und den Wochentag bestimmen:
<?php $date = "12.12.2012"; // Der String mit dem Datum $time = strtotime($date); // Hier wird der Timestamp generiert $weekday = date("w", $time ); // Den Wochentag bestimmen (0 = So, 1 = Mo, ...) $days = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); // Array mit den Tagen echo($days[$weekday]); // Und den Tag zum Datum ausgeben. ?>
Oder in einer kurzen Funktion:
<?php function wochentag($datum) { $days = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); // Array mit den Tagen $time = strtotime( $datum ); // Timestamp bestimmen return ($time !== false) ? $days[ date("w", $time) ] : false; // Das Ergebnis zurückgeben, im Fehlerfall false } var_dump(wochentag("12.12.2012")); // -> Mi var_dump(wochentag("12.12.2012")); // -> false ?>
Durch das nutzen der Option "w" bei Date kann damit direkt auf ein Array zugegriffen werden und es wird kein switch-Konstrukt benötigt. -
ich dachte das Problem ist das Datums-Format
denn .... laut PHP Doku erwartet strtotime() ein englisches Datums-Format
... also YYYY-MM-DD
Der TE hat aber anscheinend ein deutsches Datums-Format
... also: DD-MM-YYYY
daher der Tipp die Eingabe mit 3 DropDowns zu machen anstatt 1 Textfeld
dann kann es kein Problem mit deutsches oder englisches Format geben.
aber ... anscheinend ist das strtotime() doch relativ egal ...
print "<br /> am 03.11.2013 ist ein ". wochentag("03.11.2013"); // -> So print "<br /> am 2013-11-03 ist ein ". wochentag("2013-11-03"); // -> So
was ist jetzt richtig ?
... muss man für strtotime() doch kein englisches Datums-Format nehmen,
so wie es in der PHP Doku steht, ... aber wozu steht es dann dort so ?!
-
Lies mal die "PHP-Doku" etwas genauer. Da ist alles genau beschrieben.
Strtotime() kann, genauso wie der Konstruktor von DateTime, verschieden formatierte Daten einlesen. Allerdings haben beide Interpretationsspielraum, wenn das Datumsformat nicht eindeutig zuordenbar ist. Das geschieht bspw. bei Angabe einer zweistelligen Jahreszahl. Deswegen sind diese Funktionen vor allem dafür geeignet, Daten von Quellen einzulesen, deren Format bekannt ist. Ungeprüft übernommene Benutzereingaben gehören nicht dazu. Der Datums-String, den der TE aus seiner Datenbank ausliest, aber (höchstwahrscheinlich) schon.
Für Benutzereingaben würde ich keine komplexen Datums-Auswahl-Formularelemente bauen. Denn die müssten dann schon auf Browser-Seite Plausibilitätsprüfungen anstellen. Bspw. hat jeder Monat eine andere Zahl von Tagen, beim Februar hängt die Zahl sogar vom Jahr ab. Da das auf Serverseite sowieso nochmal geprüft werden muss, würde ich dem User als Standardeinstellung ein Frei-Form-Feld anbieten. Nur wenn der Browser mehr kann, darfs dann auch etwas Komfortableres sein. Auf dem Server versuchst du dann, die Benutzereingabe in ein Datum zu wandeln. Scheitert der Vorgang, muss der User nochmal ran. Mit strtotime() kann man nicht erkennen, was an der Benutzereingabe falsch war. Mit DateTime::__construct() geht das: Bei nicht erkannten Formaten wirft das eine Exception. Die kannst du auslesen oder (besser) DateTime::getLastErrors() befragen. Das liefert eine Liste von mehr oder weniger verständlichen Fehlerbeschreibungen.
Beitrag zuletzt geändert: 3.11.2013 11:51:41 von alopex -
Liebe Helfer,
ich danke euch herzlichst für die umfangreiche Hilfe. Ich bin immer wieder begeister, wie umfangreich und kompetent das hier ist. Viele überfordern mich aber auch gleich wieder damit, mahct aber nichts.
Ich werde erst mal eine einfache Variante nehmen, um auch voran zu kommen. Leider steht mir fürs Programmieren nicht so viel Zeit zur Verfügung, ist eher ein immer mehr lieb werdenes Hobby.
Also vielen Dank noch mal, wir lesen uns sicher noch oft,
schöne Woche allen noch, Frank -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage