星期和时间是我拥有的唯一两个信息片段。如何使用Date
或moment.js
构建有效的日期对象(当前周)?
我尝试了以下但是它似乎不起作用:
moment('Saturday 9:00 PM').format()
// "Invalid date"
答案 0 :(得分:2)
var date = 'Saturday 9:00 PM';
var days = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
];
var parts = date.split(/\s/);
var day = days.indexOf(parts[0]);
var hours = Number(parts[1].match(/^(\d+)/)[1]);
var mins = Number(parts[1].match(/:(\d+)/)[1]);
var AMPM = parts[2];
if(AMPM == "PM" && hours<12) hours = hours+12;
if(AMPM == "AM" && hours==12) hours = hours-12;
var d = new Date();
var dday = d.getDay();
d.setDate(d.getDate() + (day - dday));
d.setHours(hours);
d.setMinutes(mins);
答案 1 :(得分:1)
以下解析OP日期字符串格式,它使用Sunday作为一周的第一天。如果时间是&#34; 09:32:23&#34;该字符串可以包括秒。和#34; Mon&#34;或者&#34; Mo&#34;而不是全名,并且不区分大小写(&#39; mo&#39; ==&#39; Mo&#39; ==&#39; MO&#39;等等)。它还可以使用匹配而不是 split 来处理逗号,在星期一,上午9点和第34天。
// Turn a string like "Saturday 9:00 PM" into a date
// Assumes day in current week, Sunday is first day of week
var parseString = (function() {
// constants
var reAP = /am$/i;
var days = {su:0,mo:1,tu:2,we:3,th:4,fr:5,sa:6};
var reS = /[ :]+/;
var reNum = /^[0-9]+$/;
return function(s) {
var b = s.split(reS);
var now = new Date();
var nowDay = now.getDay();
var tgtDay = days[s.substr(0,2).toLowerCase()];
now.setDate(now.getDate() - nowDay + tgtDay);
now.setHours( (reAP.test(s)? 0 : 12) + +b[1], b[2], (reNum.test(b[3])? b[3]:0 ));
return now;
}
}());
答案 2 :(得分:1)
你可以通过用moment().week()
获取周数来将它添加到你已经拥有的字符串中(因为说星期六本身是不明确的),并且正如@Rocket Hazmat所说的那样,使用moment.js&#39; parsing formats。请注意,下面的解决方案为您提供本周的周六(可能不是下一个周六)。
time_string = "Saturday 9:00 PM";
week_number = moment().week(); // 19
time_string = time_string + ' ' + week_number; // now you have "Saturday 9:00 PM 19"
time = moment(time_string, "dddd h A w"); // guides parsing to read a day, hour,
// am/pm and week number
现在我们已经在2014年第19周,那将time
:Sat May 10 2014 21:00:00 GMT -0000
对于上周六的星期六(可能与上周六不同),以下内容以及额外的减法产生:Sat May 03 2014 21:00:00 GMT -0000
time_string = "Saturday 9:00 PM";
week_number = moment().week(); // 19
week_number = week_number - 1; // 18 = 19 - 1
time_string = time_string + ' ' + week_number; // now you have "Saturday 9:00 PM 18"
time = moment(time_string, "dddd h A w"); // guides parsing to read a day, hour,
// am/pm and week number
请注意,如果您未指定周数,则默认为1
,并在1月份为您提供日期。
答案 3 :(得分:1)
如果主要关注自然语言解析,您可能会考虑专门关注自然语言的库,例如Sugar。
var dt = Date.create('Saturday 9:00 AM');