簡體   English   中英

四舍五入日期

[英]Rounding date by multiple weeks

像這樣將日期四舍五入到本周的開始很容易:

 function roundWeek() { var current = new Date(); var startOfWeek = current.getDate() - current.getDay(); console.log(new Date(current.setDate(startOfWeek))); } roundWeek(); 

四舍五入一個星期時,這可以很好地工作,但四舍五入時,它將變得更加復雜。

例如,假設我想在三個星期內四舍五入。 我知道這將需要一個時期(例如new Date(0) )才能正確計算三周期間的開始日期,但這也會引起問題:

1970年1月1日( new Date(0) )發生在星期四,因此,假設我以以下方式使用它,它將始終計算出星期四在星期四:

 function roundWeek(weeks) { var current = new Date(); const WEEK_IN_MS = 60*60*24*7*1000; //sec * min * hr * day * ms var index = Math.floor( (current.getTime() / (WEEK_IN_MS*weeks)) ); var startOfPeriod = new Date( index * WEEK_IN_MS*weeks ); console.log( startOfPeriod ); } roundWeek(3); 

如何對其進行修改,使其正確地在星期日而不是星期四開始? 有更好的方法嗎? 最重要的是:a年會引起此問題嗎?

您需要確定是否要從1970年1月1日(12/28/69)之前或之后的星期日開始,為期三周。 例如,1970年1月14日將舍入到哪個星期日? 然后,您可以計算星期四與上一個星期日或下一個星期日之間的差異,並將其相加或相減(取決於您做出的決定)。

這是您功能的一種變體,它也將日期作為測試的輸入。

 function roundWeek(weeks, d) { var current = new Date(d); var first_sunday = 60 * 60 * 24 * 4 * 1000 // seconds between Sunday and Thursday const WEEK_IN_MS = 60 * 60 * 24 * 7 * 1000; // week in ms var index = Math.floor((current.getTime() / (WEEK_IN_MS * weeks))); console.log(`${weeks}-week periods from ${d.getMonth()+1}/${d.getDate()}/${d.getFullYear()} ${index}`) var startOfPeriod = new Date(index * WEEK_IN_MS * weeks - first_sunday); console.log("1st day of period:", startOfPeriod); } // round to three weeks starting Sunday before Jan 1 1970 roundWeek(3, new Date('January 2, 1970')); // Dec 28, 1968 roundWeek(3, new Date('January 14, 1970')); // Dec 28, 1968 roundWeek(3, new Date('January 22, 1970')); // next three weeks roundWeek(3, new Date('May 16, 2018')); // since today. Sundaay May 6 

由於leap年不會改變一周的時間,因此它們應該無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM