2016-03-19 47 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

相关问题