将字符串时间解析为JS Date Obj

时间:2017-11-18 20:25:17

标签: javascript

我正在尝试将country = s.query(Country).join(Country.products).filter(Country.id==1).filter(Product.color==1).first() 之类的字符串转换为JavaScript日期对象,例如"7:30am"

我的方法:

Sat Nov 18 2017 7:30:00 GMT-0500 (EST)

我获得了startDate,endDate的无效日期。

试试这里:



function dateObj(d) { // date parser ...
  var parts = d.split(/:|\s/),
    date  = new Date();
  if (parts.pop().toLowerCase() == 'pm') parts[0] = (+parts[0]) + 12;
    date.setHours(+parts.shift());
    date.setMinutes(+parts.shift());
        return date
}
var startTime = "7:30";
var endTime   = "9:30pm";
var startDate = dateObj(startTime); // get date objects
var endDate   = dateObj(endTime);
console.log(startDate, endDate)




4 个答案:

答案 0 :(得分:2)

我宁愿使用正则表达式来提取日期元素,还要为日期格式无效的情况添加一些错误处理。

不要忘记上午12点和下午12点处理。这需要在代码中进行额外处理。

见下文:



function dateObj(d) { // date parser ...
  const rx = /(\d{1,2})\:(\d{1,2})\s*(am|pm)/g;
  const parts = rx.exec(d);
  if (parts === null) {
    return "Not a valid date: " + d;
  }
  date = new Date();
  const amPm = parts.pop().toLowerCase();
  const hour = parseInt(parts[1]);
  if (amPm === 'pm') {
    if (hour !== 12) {
      parts[1] = (parseInt(parts[1])) + 12;
    }
  } else if (amPm === 'am' && hour === 12) {
    parts[1] = 0;
  }
  date.setHours(parts[1]);
  date.setMinutes(parts[2]);
  return date
}

var startTime = "7:30";
var endTime = "9:30pm";
var startDate = dateObj(startTime); // get date objects
var endDate = dateObj(endTime);

console.log(startDate, endDate)
console.log(dateObj("7:30 pm"))
console.log(dateObj("7:30 am"))
console.log(dateObj("7:30am"))
console.log(dateObj("12:30pm"))
console.log(dateObj("12:30 am"))




答案 1 :(得分:0)

如果您输入9:30 pm而不是9:30pm,这对我有用,regex需要有空格:

function dateObj(d) {
    var parts = d.split(/:|\s/),
        date = new Date();

    if (parts.pop().toLowerCase() == 'pm') {
        parts[0] = parts[0] + 12;
    }

    date.setHours(parts[0]);
    date.setMinutes(parts[1]);
    return date;
}

答案 2 :(得分:0)

这将创建一个包含当前时间的新Date对象。

但它基于代码运行的时区。

var timeRe = /(\d+):(\d+)([amp]*)/gi;
function timeParse(time) {
  var today = new Date();
  var match = time.split(timeRe);
  console.log(time, match);
  if (match) {
    var hours = parseInt(match[1],10)+(match[3].toLowerCase()==='pm'?12:0)%24;
    today.setHours(hours);
    today.setMinutes(parseInt(match[2],10));
    today.setSeconds(0);
  }
  return today;

}
var startTime = "7:30";
var endTime   = "9:30pm";
var startDate = timeParse(startTime); // get date objects
var endDate   = timeParse(endTime);
console.log(startDate, endDate)

答案 3 :(得分:0)

在上午/下午之前只需要一个空格:

d = t => new Date(new Date().toDateString() + t.replace(/(.*\d)/, " $1 "))

console.log(d("7:30").toString())
console.log(d("7:30am").toString())
console.log(d("9:30pm").toString())