如何转换"周六晚上9点"到目前为止?

时间:2014-05-07 20:44:30

标签: javascript date momentjs

星期和时间是我拥有的唯一两个信息片段。如何使用Datemoment.js构建有效的日期对象(当前周)?

我尝试了以下但是它似乎不起作用:

moment('Saturday 9:00 PM').format()
// "Invalid date"

4 个答案:

答案 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);

FIDDLE

答案 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周,那将timeSat 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');