Huy Le
Huy Le

Reputation: 501

Parse String Time to JS Date Obj

I am trying to convert a string of time such as "7:30am" to JavaScript Date Object like Sat Nov 18 2017 7:30:00 GMT-0500 (EST)

My approach:

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)

I got Invalid Date for both startDate, endDate.

Try here:

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:30am";
var endTime   = "9:30pm";
var now       = new Date();
var startDate = dateObj(startTime); // get date objects
var endDate   = dateObj(endTime);
var test = dateObj(startTime)
console.log(startDate, endDate)

Upvotes: 2

Views: 181

Answers (4)

Intervalia
Intervalia

Reputation: 10945

This will create a new Date object that includes the current time.

But it is based on the timezone of where the code is run.

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)

Upvotes: 0

Slai
Slai

Reputation: 22876

It just needs a space before am/pm :

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())

Upvotes: 0

gil.fernandes
gil.fernandes

Reputation: 14611

I would rather use a regular expression to extract the date elements and also add some error handling for the case the date format is not valid.

And do not forget also to handle 12am and 12pm. This needs extra handling in the code.

See below:

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"))

Upvotes: 2

ewizard
ewizard

Reputation: 2862

This is working for me if you enter 9:30 pm instead of 9:30pm, the white space needs to be there for 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;
}

Upvotes: 0

Related Questions