97

In PHP, you can easily convert an English textual datetime description into a proper date with strtotime().

Is there anything similar in Javascript?

1

10 Answers 10

71

There is not. The closest built-in option is Date.parse(), which parses a very limited subset of what strtotime() can:

var ts = Date.parse("2010-10-29");

It's worth noting that this function returns milliseconds instead of seconds, so you need to divide the result by 1000 to get an equivalent value to PHP's function.

Sign up to request clarification or add additional context in comments.

4 Comments

Nope; this works very different than php strtotime, none of the examples of the php documentation work, not a single one strtotime("now"); strtotime("10 September 2000"); strtotime("+1 day"); strtotime("+1 week"); strtotime("+1 week 2 days 4 hours 2 seconds"); strtotime("next Thursday"); strtotime("last Monday");
This should work, but it's unreliable. Date.parse('2020-06-06') should return the same timestamp as Date.parse('June 6, 2020'), but it doesn't. (1591401600000 vs 1591423200000)
php's strtotime and javascripts Date.parse are only similar at a basic level. As Ivan has commented above, strtotime is able to do far more by guessing the format and taking relative dates like 'tomorrow'.
I've updated the answer to remove the suggestion that this is somehow equivalent to strtotime(). There is no comparable functionality without an external library, which is why this answer got my +1.
57

I found this article and tried the tutorial. Basically, you can use the date constructor to parse a date, then write get the seconds from the getTime() method

var d=new Date("October 13, 1975 11:13:00");
document.write(d.getTime() + " milliseconds since 1970/01/01");

Does this work?

4 Comments

It seems that I does not work it the date is formatted in d.m.Y format.
-1. This only covers RFC 822 or ISO 8601 formatted dates, but strtotime() supports many other formats.
This may happen to satisfy the OP's use case, but it is a technically incorrect, invalid answer to the question. See (and please upvote) Westy92's answer.
Just a quick note to be careful when using this built-in string parsing. Javascript will handle timezones differently for partial ISO date strings. The code new Date('2021-04-01') will have a time of midnight with a UTC timezone where as the date new Date('04/01/2021') will be created with a time of midnight in the local timezone. This difference can create subtle bugs in a program if you're parsing dates with both string formats.
47

Check out this implementation of PHP's strtotime() in JavaScript!

I found that it works identically to PHP for everything that I threw at it.

Update: this function as per version 1.0.2 can't handle this case: '2007:07:20 20:52:45' (Note the : separator for year and month)

Update 2018:

This is now available as an npm module! Simply npm install locutus and then in your source:

var strtotime = require('locutus/php/datetime/strtotime');

2 Comments

I don't normally like answers that are just links to libraries, but in this case since JavaScript doesn't handle nearly the crazy cases as strtotime so this is a fantastic answer. Thank you!
Latest release of Locutus (7 Sep 2018 at this time) does not handle strings like 'yesterday 19:00'.
5

I jealous the strtotime() in php, but I do mine in javascript using moment. Not as sweet as that from php, but does the trick neatly too.

// first day of the month
var firstDayThisMonth = moment(firstDayThisMonth).startOf('month').toDate();

Go back and forth using the subtract() and add() with the endOf() and startOf():

// last day of previous month
var yesterMonthLastDay = moment(yesterMonthLastDay).subtract(1,'months').endOf('month').toDate();

Comments

2
+50

Browser support for parsing strings is inconsistent. Because there is no specification on which formats should be supported, what works in some browsers will not work in other browsers.

Try Moment.js - it provides cross-browser functionality for parsing dates:

var timestamp = moment("2013-02-08 09:30:26.123");
console.log(timestamp.milliseconds()); // return timestamp in milliseconds
console.log(timestamp.second()); // return timestamp in seconds

1 Comment

This does not fully answer the question (and has a negative score). Is there a way to revoke the bounty?
0

There are few modules that provides similar behavior, but not exactly like PHP's strtotime. Among few alternatives I found date-util yields the best results.

Comments

0

var strdate = new Date('Tue Feb 07 2017 12:51:48 GMT+0200 (Türkiye Standart Saati)');
var date = moment(strdate).format('DD.MM.YYYY');
$("#result").text(date); //07.02.2017
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js"></script>

<div id="result"></div>

1 Comment

Deprecation warning: value provided is not in a recognized ISO format. moment construction falls back to js Date() – sooo… same as new Date(strdate) really…
0

Maybe you can exploit a sample function like :

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45 //Adding fourty five minutes
  });
document.body.innerHTML = futureDate;

`

Comments

0

For those looking to convert the datetime to unix timestamp, you can do this using the Moment Library.

For Vue.js, you can do something like

let start = "2022/02/02 02:02:02";
return moment(start).format("x");

Comments

0

JavaScript itself does not have a function like PHP's strtotime() to convert natural (English) language to a Date object.

Therefore you need a library (or write something yourself). A library that is currently (2023) well maintained is Chrono: https://github.com/wanasit/chrono

I supports strings like "10 days after next Friday". A bonus of Chrono is that it also supports some other languages.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.