+1 vote
in SoSci Survey (dt.) by s082232 (355 points)
edited by SoSci Survey

Liebes Support-Team,

in unserem aktuellen Projekt beantworten die Teilnehmer*innen jeden Tag einen Fragebogen, den sie per Serienmail zugestellt bekommen. Im Fragebogen ist ein Datumsabruf eingebaut, der eigentlich immer einwandfrei funktioniert, nur zum Monatswechsel erscheint die Fehlermeldung:

„Dieser Fragebogen ist nur gültig von 29.02.2020 00:00 bis 01.03.2020 07:00."

Dabei stimmen beim Abruf sowohl Zeitraum als auch Datum. Das Problem trat in zwei vorhergehenden Studien im letzten Jahr nicht auf, aber in der aktuellen Studie in diesem Jahr bereits zwei Mal (Ende Januar, Ende Februar).

Vielen Dank für Ihre Hilfe!

Das ist der Code, der das Datum abfragt:

 if (!isset($studyDay)) { 
   $studyDay = readGET('usd');  // read day of study from URL sent with email
   registerVariable($studyDay);
 }
 put('SP05_01', $studyDay);  // save day of study in questionnaire data

 $now = date("d.m.Y H:i");
 $timeRange = dbGet('Day'.$studyDay);
 $start = date($timeRange[0]);
 $end = date($timeRange[1]);

 if (($studyDay == 1) || (($now >= $start) && ($now <=$end)) ||  ($studyDay == 1)) {   // allow first email to be clicked anytime to send follow-up mails

.... (weiterer Code) ....

 } else { // if Questionaire has been called on wrong date
//    html('Dieser Fragebogen ist nur gültig von <strong> '.$timeRange[0].' bis '.$timeRange[1].'</strong>.<br>'); 
//    html('Der Fragebogen kann daher aktuell NICHT ausgefüllt werden. <br> Die Emails für den aktuellen Tag werden immer um 12 Uhr mittags verschickt. Bitte schauen Sie gegegenfalls nach, ob Sie schon eine neue Email haben. <br> Sollte das Problem trotzdem noch auftreten, wenden Sie sich bitte baldmöglichst an die Studienleiterin.');
 html('<h2 style="background-color: red; color: white; font-size: 13px; font-weight: bold; padding: 2px 6px 0px 6px; margin: 32px 0px 0px 0px">Hoppla!</h2>
<div style="color: red; margin: 0px; padding: 8px; border: 2px solid red"><p>Dieser Fragebogen ist nur gültig von <strong> '.$timeRange[0].' bis '.$timeRange[1].'</strong>.</p><p>Bitte füllen Sie den Fragebogen immer am aktuellen Tag aus. <br> Die Emails für den aktuellen Tag werden immer um 12 Uhr mittags verschickt. Bitte schauen Sie gegegenfalls nach, ob Sie schon eine neue Email haben. <br> Sollte das Problem trotzdem noch auftreten, wenden Sie sich bitte baldmöglichst an die <a href="mailto:karin.matko@psychologie.tu-chemnitz.de">Studienleiterin.</a></p></div>');
   buttonHide();
   pageStop();
 }

1 Answer

+1 vote
by SoSci Survey (303k points)
selected by s082232
 
Best answer

Das Problem kann ich recht einfach erklären:

2 ist größer als 0.

Gut, vielleicht muss ich ein wenig ausholen. Üblicherweise vergleicht man bei der Arbeit mit Computern Zeitstempel. Das ist die Anzahl Sekunden seit dem 1.1.1970 um 0 Uhr. Mit diesen kann man sehr komfortabel rechnen und sie eben vergleichen.

Sie hingegen verwenden das Datum als String (Text):

 $now = date("d.m.Y H:i");
 $start = date($timeRange[0]);
 $end = date($timeRange[1]);

Dabei kommt folgendes heraus, z.B.

 $now = '02.03.2020 21:38';
 $start = '29.02.2020 00:00';
 $end = '02.03.2020 23:59';

Ich habe den Zeitraum jetzt mal etwas verlängert, damit ich das aktuelle Datum verwenden kann. Aber es geht um das Prinzip.

Betrachten Sie diese 3 Zeilen jetzt bitte einmal nicht als Datum, sondern als Text. Damit es einfacher fällt, habe ich die 0 durch "A" ersetzt, die 1 durch "B" u.s.w.

 $now = 'AC.AD.CACA CB:DL';
 $start = 'CJ.AC.CACA AA:AA';
 $end = 'AC.AD.CACA CD:FJ';

So, nun vergleichen wir mal ($now >= $start) entsprechend Ihrem Code. Was kommt zuerst "AC" oder "CJ"? Genau. $now ist nun kleiner als $start. Entsprechend ist Ihr Code der Meinung, das etwas nicht passt.

Inzwischen sehen Sie auch, weshalb das Problem immer zum Monatswechsel auftritt. Da ändert sich die erste Stelle des Tages - und zwar "nach unten". Schuld an Ihrer Misere ist also die technikfeindliche Schreibweise für das Datum.

Lösung: Verwenden Sie Zeitstempel. Versuchen Sie es bitte einmal mit folgender Modifikation:

 $now = time();
 $timeRange = dbGet('Day'.$studyDay);
 $start = strtotime($timeRange[0]);
 $end = strtotime($timeRange[1]);

Ob unten das korrekte Datum ermittelt wurde können Sie wie folgt testen:

debug(date('d.m.Y H:i', $start));
debug(date('d.m.Y H:i', $end));
by s082232 (355 points)
Fantastisch! Vielen Dank! Das hat funktioniert.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...