2016-03-19 12 views
-1

Dies ist mein erstes Mal eine Frage auf hier aber ich bin ein langfristiger Benutzer von StackOverflow.Zeigen Sie ein Datum zweizehntägig mit Javascript

Ich bin sehr neu in Javascript und versuche derzeit einige Probleme zu lösen, die ich auf einer Website habe, die ich für meinen Universitätskurs erstelle.

Ich versuche, ein kleines Informationsfeld auf dem Dashboard der Website zu erstellen, das Ihnen einfach sagt, wann Ihr nächster Mülltonnensammeltag ist. Dies ist derzeit alle 2 Wochen an einem Freitag, der nächste ist der 1. April. Ich habe mich gefragt, ob es eine einfache Möglichkeit für mich gibt, das nächste Mülltonnensammlungsdatum anzuzeigen, bis es der Tag der Mülleimersammlung ist, in dem sich der Text ändern würde, um "Bin Collection heute" zu sagen. und nach etwa 18 Uhr würde es in zwei Wochen zum nächsten Abholdatum wechseln.

Sorry, wenn das extrem schlecht formuliert ist! Die Website wird nur in Großbritannien verwendet, so dass ich mir keine Gedanken über Zeitzonen machen muss.

Jede Hilfe würde sehr geschätzt werden!

Vielen Dank, Emily

+0

siehe http://stackoverflow.com/help/how-to-ask und zeigen, was Sie bereits entdeckt/getestet haben – profesor79

+0

Sie könnten mit der Erstellung eines Date-Objekts mit 'new Date()' beginnen. Sie können den Tag mit der Methode * getDay * bestimmen (5 ist Freitag).Sie brauchen auch eine Epoche, für die am Freitag der vierzehntägige Zyklus beginnt. – RobG

Antwort

0

Nachfolgend finden Sie einige Code zu zeigen, wie es getan werden könnte, hoffentlich gibt es genügend Kommentare.

Soweit ich weiß, beobachten einige Teile des Vereinigten Königreichs Sommerzeit, aber das Folgende sollte nicht von einer Änderung der Zeitzone betroffen sein, da es lokale Datumsmethoden verwendet.

Jedes Datum kann für den Beginn des Zyklus verwendet werden, ich habe am 10. Juni 2011 völlig zufällig ausgewählt. Außerdem kann jede Tageszeit verwendet werden, um die Nachricht am letzten Tag von "put your bins out today" auf den Standard "next cycle is in x days" zu ändern.

Der Algorithmus berechnet die Anzahl der Millisekunden für die nächsten zwei Wochen ab dem Startdatum, indem die Anzahl der Millisekunden von den letzten zwei Wochen von den Millisekunden pro zwei Wochen subtrahiert wird. Dann wird der Rest in ganze Tage umgewandelt.

Um Zweideutigkeiten am Tag vor dem Ende des Zyklus (in diesem Fall ein Donnerstag) zu speichern, wird der Zyklus "morgen" anstelle von 1 Tag und am Tag selbst bis 18:00 oder 6 Uhr beendet pm heißt es, der Zyklus endet heute. Danach sagt es, dass der Zyklus in 14 Tagen oder weniger endet.

// Date objects are based on milliseconds (8.64e7 per day) 
 
// Calculate milliseconds for a fortnight 
 
var msPerFortnight = 8.64e7 * 14; 
 

 
// Any date can be the start of the fortnightly cycle 
 
// Make Friday 10 June 2011 first day of cycle, 
 
// Cycles end on 25 March, 6 April 2016. 
 
// Note months are zero based so June is 5 
 
var firstDayOfCycle = new Date(2011, 5, 10); 
 

 
// Time of day to stop showing "put bins out today" message on start/end day 
 
// 18 is 6 pm 
 
var endHour = 18; 
 

 
// Get the day name for the cycle start/end 
 
var dayName = ['Sunday','Monday','Tuesday','Wednesday','Thursday', 
 
       'Friday','Saturday'][firstDayOfCycle.getDay()]; 
 

 
// Convert end hour to convenient format with am/pm 
 
var endHourNeat = (endHour % 12 || 12) + ' ' + (endHour < 12? 'am' : 'pm'); 
 

 
// Get a date for now 
 
var now = new Date(); 
 

 
// Get milliseconds to next full fortnight by 
 
// msPerFortnight minus milliseconds since last full fortnight 
 
var m = msPerFortnight - ((new Date() - firstDayOfCycle) % msPerFortnight); 
 

 
// Calculate time remaining full days 
 
var daysLeft = Math.ceil(m/8.64e7); 
 

 
// Create a human friendly message 
 
var message; 
 

 
// If more then one day left, or after 18:00 on last day, show this message 
 
if (daysLeft == 14 && now.getHours() < endHour) { 
 
    message = 'Today is ' + dayName + ', so please put your bins out before ' + endHourNeat + '!'; 
 
} else if (daysLeft > 1) { 
 
    message = 'Put your bins out on ' + dayName + ' in ' + daysLeft + 
 
      ' day' + (daysLeft == 1?'':'s') + ' time.'; 
 
} else if (daysLeft == 1) { 
 
    message = 'Put your bins out tomorrow, on ' + dayName + '.'; 
 
} 
 

 
document.write(message);

Sie können sogar das Datum des Endes des Zyklus hinzuzufügen und Ordnungs hinzufügen, so dass es möglicherweise „Setzen Sie Ihre Behälter heraus am Freitag, dem 25., in 3 Tagen Zeit“ lesen. Aber ich überlasse das dir.

+0

Vielen Dank für Ihre Hilfe! Das scheint zu funktionieren, ich würde gerne das Datum hinzufügen, also Freitag, 25. März, es muss nicht unbedingt eine Ordinalzahl haben, wie einfach wäre das hinzuzufügen? – Emily

+0

@ Emily-Sie können das Datum des Endes des Zyklus erhalten, indem Sie * daysLeft * Tage zu * now * hinzufügen, es ist das gleiche Prinzip wie [* Hinzufügen eines Tages zu einem Datum *] (http://stackoverflow.com/ Fragen/9989382/add-1-zu-aktuelles-Datum/9989458 # 9989458). Es gibt viele Fragen und Antworten zu [* Formatierungsdaten *] (http://stackoverflow.com/search?q=%5Bjavascript%5D+format+date), finden Sie eine, die passt. – RobG

+0

Vielen Dank, wirklich schätze deine Hilfe! – Emily

0

Eine mögliche Lösung ist Unix Epoche zu verwenden, weil sie Sie Ihre Zeit in Sekunden vom 1.1.1970 geben. Mit diesem können wir herausfinden, wie weit wir in zwei Wochen sind. Ich fand, dass Math.floor(Date.parse("2016-04-01")/86400000)%14 gleich 8.

Dann könnte Ihr Code sein:

var days_into_fortnight=Math.floor(Date.now()/86400000)%14; 
var string_to_show; 
var days_to_collection; 
if (days_into_fortnight==8){ 
    string_to_show="Bin collection!"; 
} 
else{ 
    if(days_into_fortnight<8){ 
     days_to_collection=8-days_into_fortnight; 
    } 
    else{ 
     days_to_collection=22-days_into_fortnight; 
    } 
    string_to_show=days_to_collection.toString()+" day(s) to collection!"; 
} 

Edit: Rechtschreibung

+0

Dies misst 14 Tage seit dem 1. Januar 1970 GMT, was ein Donnerstag war. Das OP will den lokalen Freitag, ohne zu sagen, welche Zeitzone das sein soll. Es nimmt auch an, dass der vierzehntägige Zyklus mit dem 2. Januar zusammenfällt, wenn es der 9. Januar 1970 sein könnte. – RobG

Verwandte Themen