我正在尝试创建一个带有 google 注释的时间线,即。为此,我需要输入事件的日期。我拥有的唯一信息是事件的年份和 ISO 周数。Javascript 中有没有一种方法可以仅使用年份和周数来创建 Date 对象?我用谷歌搜索了它,但没有找到任何可行的解决方案。
谢谢您的帮助!
我正在尝试创建一个带有 google 注释的时间线,即。为此,我需要输入事件的日期。我拥有的唯一信息是事件的年份和 ISO 周数。Javascript 中有没有一种方法可以仅使用年份和周数来创建 Date 对象?我用谷歌搜索了它,但没有找到任何可行的解决方案。
谢谢您的帮助!
ISO 周从星期一开始
如果 1 月 1 日在星期一、星期二、星期三或星期四,则在第 01 周。如果 1 月 1 日在星期五、星期六或星期日,则在上一年的第 52 或 53 周
Date.weekofYear= function(s){
var yw= s.split(/\D+0?/),
weeks= 7*yw[1]-7,
date1= new Date(yw[0], 0, 1),
day1= date1.getDay(),
incr= (day1> 0 && day1<5)? -1: 1;
if(yw[2]) weeks+= (+yw[2])-1;// optional day in week
while(date1.getDay()!= 1){
date1.setDate(date1.getDate()+incr);
}
date1.setDate(date1.getDate()+weeks);
return date1;
}
Date.weekofYear('2010-20').toLocaleDateString()
// (use UTC methods to start the weeks on Greenwich instead of local time)
/* returned value: (String)
Monday, May 17, 2010
*/
有趣的问题。这是我的解决方案:
var week2date = (function() {
var weekToDate = {
// last week number in the month: [first date of each week]
4: [4, 11, 18, 25], // jan
8: [1, 8, 15, 22], // feb
13: [1, 8, 15, 22, 29], // march
17: [5, 12, 19, 26], // etc ...
22: [3, 10, 17, 24, 31],
26: [7, 14, 21, 28],
30: [5, 12, 19, 26],
35: [2, 9, 16, 23, 30],
39: [6, 13, 20, 27],
43: [4, 11, 18, 25],
48: [1, 8, 15, 22, 29],
52: [6, 13, 20, 27]
};
return function(week, year) {
if ( week > 52 || week < 01 ) { return false; }
var d = new Date(),
lastw = 0,
month = 0;
for ( var w in weekToDate ) {
if ( !weekToDate.hasOwnProperty(w) ) { continue; }
if ( w >= week ) {
break;
}
lastw = w;
++month;
}
d.setFullYear(year || d.getFullYear(), month, weekToDate[w][week - lastw - 1]);
return d;
}
})();
采用:
console.log(week2date(13));
console.log(week2date(38, 1983));
输出:
Mon Mar 29 2010 18:51:28 GMT-0700 (PST) {}
Tue Sep 20 1983 18:51:28 GMT-0700 (PST) {}
我在维基百科上使用这张表来获取日期信息。
我支持 Mr.s @kennebec 的回答,但由于我还不能发表评论,我想补充一点,一年中一周表示的 ISO 符号是yyyy-Www
. 举个例子:2000-W01
。还要注意周填充。