22

I have to parse a date and time string of format "2015-01-16 22:15:00". I want to parse this into JavaScript Date Object. Any help on this?

I tried some jquery plugins, moment.js, date.js, xdate.js. Still no luck.

yuva
  • 3,108
  • 4
  • 20
  • 35

6 Answers6

46

With moment.js you can create a moment object using the String+Format constructor:

var momentDate = moment('2015-01-16 22:15:00', 'YYYY-MM-DD HH:mm:ss');

Then, you can convert it to JavaScript Date Object using toDate() method:

var jsDate = momentDate.toDate();
moises.vilar
  • 501
  • 4
  • 3
  • I tried using moment.js, but there was an error, "ReferenceError: moment is not defined". I had set the js path in my html too. – yuva Jan 17 '15 at 18:07
  • As Matt Johnson said, you have to follow the [instructions](http://momentjs.com/docs/#/use-it/browser/) for using moment.js in your browser application. – moises.vilar Jan 18 '15 at 13:49
10

A better solution, I am now using date.js - https://code.google.com/p/datejs/

I included the script in my html page as this -

<script type="text/javascript" src="path/to/date.js"></script>

Then I simply parsed the date string "2015-01-16 22:15:00" with specifying the format as,

var dateString = "2015-01-16 22:15:00";
var date = Date.parse(dateString, "yyyy-MM-dd HH:mm:ss");
yuva
  • 3,108
  • 4
  • 20
  • 35
  • 4
    This fails for me. It seems that this date.js parse function only works on a single format. The second argument is ignored completely. – Marc Sep 08 '16 at 14:52
7
new Date("2015-01-16T22:15:00")

See Date.parse().

The string must be in the ISO-8601 format. If you want to parse other formats use moment.js.

moment("2015-01-16 22:15:00").toDate();
dusky
  • 1,133
  • 7
  • 12
  • This worked for me. What I did was a little hack improvement to the suggestion you provided, I have posted that solution in comment. Thanks :) – yuva Jan 17 '15 at 18:49
2

I was trying to use moment.js guys. But since I was having this error, "ReferenceError: moment is not defined", I had to skip it for now. I am using an temporary workaround for now.

function parseDate(dateString) {
    var dateTime = dateString.split(" ");
    var dateOnly = dateTime[0];
    var timeOnly = dateTime[1];

    var temp = dateOnly + "T" + timeOnly;
    return new Date(temp);
}
yuva
  • 3,108
  • 4
  • 20
  • 35
2

Bit annoying, but not hard to write a parsing method yourself without any dependencies. Regular expressions are great to check the input against one or many date formats. Though, the Date in the format provided 'just works' by now. I.e. new Date('2015-01-16 22:15:00') works for me in firefox. I did this for a date that looked like '08.10.2020 10:40:32', which does not work and maybe the date provided does not work in some browsers. But this way you can parse it without relying on built in parsing methods.

function getAsDate(input) {
    if (!input) return null;
    if (input instanceof Date) return input;

    // match '2015-01-16 22:15:00'
    const regexDateMatch = '^[0-9]{4}\-[0-9]{1,2}\-[0-9]{1,2}\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}$';
    if(input.match(regexDateMatch)) {
        const [year, month, day, hours, minutes, seconds] = input.split(/[-: ]/).map(x => parseInt(x));
        const date = new Date(year, month, day, hours, minutes, seconds);
        return date;
    }

    // Date formats supported by JS
    return new Date(input);
}

Using Regex capture groups as suggested would also be an option.

function getAsDate(input) {
    if (!input) return null;
    if (input instanceof Date) return input;

    // match '2015-01-16 22:15:00'
    const regexDateMatch = '^([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})\ ([0-9]{2})\:([0-9]{2})\:([0-9]{2})$';
    let match;
    if((match = input.match(regexDateMatch))) {
        const [year, month, day, hours, minutes, seconds] = match.slice(1, 7).map(x => parseInt(x));
        const date = new Date(year, month, day, hours, minutes, seconds);
        return date;
    }

    // Date formats supported by JS
    return new Date(input);
}

Hopefully JS upcomming temporal API will have a proper widely supported way to parse dates with a custom template. Then eventually we won´t have to deal with this anymore and all the other oddities of JS Date.

Max
  • 1,536
  • 1
  • 14
  • 18
  • I like your answer (for flexible parsing and lack of dependencies) but would suggest it could be improved by using regex 'capture groups'. The regex would just need some parens adding to define the groups. Then year, month etc. could simply be accessed from the array returned from input.match() – David Easley Sep 02 '22 at 14:23
1

If you are sure it's in the desired format and don't need to error check, you can parse it manually using split (and optionally replace). I needed to do something similar in my project (MM/DD/YYYY HH:mm:ss:sss) and modified my solution to fit your format. Notice the subtraction of 1 in the month.

var str = "2015-01-16 22:15:00"; 
//Replace dashes and spaces with : and then split on :
var strDate = str.replace(/-/g,":").replace(/ /g,":").split(":");
var aDate = new Date(strDate[0], strDate[1]-1, strDate[2], strDate[3], strDate[4], strDate[5]) ; 
JSub
  • 111
  • 8