像在 PHP 中一样在 JavaScript 中获取一年中的一周

新手上路,请多包涵

如何获得当前的一年中的周数,例如 PHP 的 date('W')

它应该是一年中的 ISO-8601 周数,从星期一开始的周数。

原文由 PeeHaa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 483
2 个回答

你应该可以在这里得到你想要的: http ://www.merlyn.demon.co.uk/js-date6.htm#YWD。

同一站点上更好的链接是: Working with week

编辑

这是基于提供的链接和 Dommer 早期发布的一些代码。它已针对 http://www.merlyn.demon.co.uk/js-date6.htm#YWD 上的结果进行了轻微测试。请彻底测试,不提供任何保证。

编辑 2017

在观察夏令时期间的日期和 1 月 1 日为星期五的年份存在问题。通过使用所有 UTC 方法修复。以下将相同的结果返回给 Moment.js。

 /* For a given date, get the ISO week number
 *
 * Based on information at:
 *
 * THIS PAGE (DOMAIN EVEN) DOESN'T EXIST ANYMORE UNFORTUNATELY
 * http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
 *
 * Algorithm is to find nearest thursday, it's year
 * is the year of the week number. Then get weeks
 * between that date and the first day of that year.
 *
 * Note that dates in one year can be weeks of previous
 * or next year, overlap is up to 3 days.
 *
 * eg 2014/12/29 is Monday in week 1 of 2015
 * 2012/1/1 is Sunday in week 52 of 2011
 */
 function getWeekNumber(d) {
 // Copy date so don't modify original
 d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
 // Set to nearest Thursday: current date + 4 - current day number
 // Make Sunday's day number 7
 d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
 // Get first day of year
 var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
 // Calculate full weeks to nearest Thursday
 var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
 // Return array of year and week number
 return [d.getUTCFullYear(), weekNo];
 }

 var result = getWeekNumber(new Date());
 document.write('It\'s currently week ' + result[1] + ' of ' + result[0]);

创建“UTC”日期时,小时数归零。

最小化的原型版本(仅返回周数):

 Date.prototype.getWeekNumber = function(){
 var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
 var dayNum = d.getUTCDay() || 7;
 d.setUTCDate(d.getUTCDate() + 4 - dayNum);
 var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
 return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
 };

 document.write('The current ISO week number is ' + new Date().getWeekNumber());

测试部分

在本节中,您可以输入 YYYY-MM-DD 格式的任何日期,并检查此代码给出的周数是否与 Moment.js ISO 周数相同(从 2000 年到 2050 年的 50 年测试)。

 Date.prototype.getWeekNumber = function(){
 var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
 var dayNum = d.getUTCDay() || 7;
 d.setUTCDate(d.getUTCDate() + 4 - dayNum);
 var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
 return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
 };

 function checkWeek() {
 var s = document.getElementById('dString').value;
 var m = moment(s, 'YYYY-MM-DD');
 document.getElementById('momentWeek').value = m.format('W');
 document.getElementById('answerWeek').value = m.toDate().getWeekNumber();
 }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

 Enter date YYYY-MM-DD: <input id="dString" value="2021-02-22">
 <button onclick="checkWeek(this)">Check week number</button><br>
 Moment: <input id="momentWeek" readonly><br>
 Answer: <input id="answerWeek" readonly>

原文由 RobG 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题