Javascript equivalent of php's strtotime()?
Asked Answered
A

10

96

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

Is there anything similar in Javascript?

Apograph answered 29/10, 2010 at 0:40 Comment(1)
For parsing from the format dd.mm.yyyy, check #1577253Solorio
E
56

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?

Emie answered 29/10, 2010 at 0:48 Comment(4)
It seems that I does not work it the date is formatted in d.m.Y format.Solorio
-1. This only covers RFC 822 or ISO 8601 formatted dates, but strtotime() supports many other formats.Forbearance
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.Ryan
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.Resonance
P
69

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.

Palfrey answered 5/2, 2012 at 18:51 Comment(4)
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");Obvert
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)Catchfly
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'.Latrinalatrine
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.Donetsk
E
56

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?

Emie answered 29/10, 2010 at 0:48 Comment(4)
It seems that I does not work it the date is formatted in d.m.Y format.Solorio
-1. This only covers RFC 822 or ISO 8601 formatted dates, but strtotime() supports many other formats.Forbearance
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.Ryan
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.Resonance
H
44

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');
Heda answered 12/7, 2013 at 2:8 Comment(2)
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!Madonia
Latest release of Locutus (7 Sep 2018 at this time) does not handle strings like 'yesterday 19:00'.Demonstrative
P
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();
Pentachlorophenol answered 9/1, 2016 at 20:43 Comment(0)
S
1

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
Shepley answered 8/5, 2016 at 20:49 Comment(1)
This does not fully answer the question (and has a negative score). Is there a way to revoke the bounty?Heda
L
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.

Lasso answered 14/6, 2016 at 23:47 Comment(0)
U
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>
Unprincipled answered 6/2, 2017 at 9:57 Comment(1)
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…Forbore
P
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;

`

Psychokinesis answered 24/5, 2019 at 22:52 Comment(0)
R
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");
Reyesreykjavik answered 7/3, 2022 at 8:31 Comment(0)
O
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.

Ovenware answered 11/11, 2023 at 20:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.