2016-03-19 44 views
-1

這是我第一次在這裏發佈問題,但是我是StackOverflow的長期用戶。使用javascript每兩週顯示一次日期

我對Javascript很新,我目前正在努力解決一些我在爲我的大學課程創建的網站上遇到的問題。

我想在網站的儀表板上做一個小小的信息框,簡單地告訴你什麼時候下一個垃圾箱收集日。目前這個星期五是每兩週一次,下一個是四月一日。我想知道是否有一種簡單的方法可以顯示下一個bin收集日期,直到收集到垃圾箱的那一天,文本會變成「今天收集垃圾箱」!大約晚上6點之後,它將在兩週內更換爲下一個收集日期。

對不起,這是措辭極爲糟糕!該網站將只在英國使用,所以我不需要擔心時區。

任何幫助將非常感謝!

非常感謝, 艾米麗

+0

請參閱http://stackoverflow.com/help/how-to-ask並顯示您的搜索結果發現/測試 – profesor79

+0

您可能會先用'new Date()'創建一個Date對象。您可以使用* getDay *方法確定一天(5週五)。您還需要一些時期,週五是每兩週週期的開始。 – RobG

回答

0

下面是一些代碼來顯示它可能會怎麼做,希望有足夠的意見。

據我所知,英國的一些地區觀察夏令時,但以下內容不應受時區變化的影響,因爲它使用本地日期方法。

任何日期都可以用於循環的開始,我已經完全隨機選擇了2011年6月10日。此外,可以使用任何時間將最後一天的消息從「今天放入垃圾箱」更改爲標準「下一週期爲x天」。

該算法計算從開始日期到下一整整兩週的毫秒數,方法是從每兩週毫秒的最後一整整兩週減去毫秒數。然後剩下的部分轉換爲全天。

爲了節省週期結束前一天(本例中是週四)的不明確性,該消息表示週期結束於「明天」,而不是在1天內,並且在當天本身,直到18:00或6下午說它的週期今天結束。之後,它說週期在14天或更短時間內結束。

// 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);

你甚至可以添加週期結束的日期,並添加序,所以它可能會讀「把你的垃圾桶了上週五25日,3天時間。」但我會留給你的。

+0

非常感謝您的幫助!這似乎是工作,我想補充日期,即3月25日星期五,它不需要有一個序號,這將是多麼容易添加? – Emily

+0

@ Emily - 您可以通過將* daysLeft *天添加到* now *來獲取週期結束的日期,這與[*將日期添加到一天*]的原理相同(http://stackoverflow.com/問題/ 9989382 /加-1至當前最新/ 9989458#9989458)。 [*格式化日期*]有很多問題和答案(http://stackoverflow.com/search?q=%5Bjavascript%5D+format+date),找到適合的格式。 – RobG

+0

非常感謝,非常感謝您的幫助! – Emily

0

一個可能的解決方案是使用Unix的時代,因爲他們給你的時間在幾秒鐘內從1/1/1970。通過使用這個,我們可以發現我們在兩週內還有多遠。我發現,Math.floor(Date.parse("2016-04-01")/86400000)%14等於8

然後你的代碼可能是:

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!"; 
} 

編輯:拼寫

+0

這是自1970年1月1日起的14天,這是一個星期四的GMT。 OP要當地時間星期五,不用說應該是哪個時區。它還假設每兩週一次與1970年1月2日的時間相吻合。 – RobG

相關問題