Javascript中与php的strtotime()函数相当的函数是什么?

96

在 PHP 中,你可以使用 strtotime() 方法将英文文本格式的日期时间转换为正确的日期。

那么在 JavaScript 中有类似的方法吗?


要从格式dd.mm.yyyy进行解析,请查看https://dev59.com/lXI-5IYBdhLWcg3w-96b - Valentin Despa
10个回答

68

没有。最接近内置选项是Date.parse(),它解析的内容是 非常有限的子集,与strtotime()可以解析的内容相比要少得多:

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

值得注意的是,这个函数返回的是毫秒而不是秒,所以你需要将结果除以1000才能得到与PHP函数等效的值。


37
不行,它与php strtotime有很大不同,php文档中的所有示例都不起作用,没有一个可以使用。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"); - Ivan Castellanos
这应该可以工作,但不可靠。Date.parse('2020-06-06')应该返回与Date.parse('June 6, 2020')相同的时间戳,但它没有。(1591401600000 vs 1591423200000) - Vincent
PHP的strtotime和JavaScript的Date.parse仅在基本层面上相似。正如Ivan在上面评论的那样,strtotime能够通过猜测格式并接受相对日期(如“明天”)来做更多的事情。 - Nigel Atkinson
我已经更新了答案,删除了建议这与strtotime()等效的说法。没有可比较的功能,除非使用外部库,这就是为什么这个答案得到我的+1的原因。 - miken32

55

我找到了这篇文章,并尝试了其中的教程。基本上,你可以使用日期构造函数来解析日期,然后使用getTime()方法获取秒数。

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

这个行得通吗?


似乎日期格式为d.m.Y时它无法工作。 - Valentin Despa
33
这仅适用于RFC 822或ISO 8601格式的日期,但是strtotime()支持许多其他格式。 - Ja͢ck
1
这可能满足OP的使用情况,但从技术上讲,它是一个不正确、无效的回答。请查看(并点赞)Westy92的回答。 - Nate Abele
1
使用内置字符串解析时要小心。Javascript会对部分ISO日期字符串处理时区有所不同。代码new Date('2021-04-01')将具有UTC时区的午夜时间,而日期new Date('04/01/2021')将在本地时区创建午夜时间。如果您同时解析两种字符串格式的日期,则此差异可能会在程序中产生微妙的错误。 - Alana Storm

44

看看这个JavaScript实现的PHP strtotime()函数!

我发现它可以处理我所有尝试的东西,与PHP完全一致。

更新:根据版本1.0.2,此函数无法处理以下情况:'2007:07:20 20:52:45'(请注意年份和月份之间的:分隔符)

2018年更新:

现在可以作为一个npm模块获得!只需运行npm install locutus,然后在您的源代码中使用:

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

5
我通常不喜欢只给出库链接的答案,但在这种情况下,由于JavaScript处理的情况并不像strtotime那样复杂,所以这是一个很棒的答案。谢谢! - Fusty
Locutus的最新版本(截至2018年9月7日)无法处理像“昨天19:00”这样的字符串。 - nicolas

5

我羡慕php中的strtotime()函数,但我在JavaScript中使用moment来完成它。虽然不如php中的那么方便,但也能整洁地完成任务。

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

使用subtract()add()endOf()startOf()来前后移动:

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

1

浏览器对于解析字符串不一致。由于没有规定应该支持哪些格式,某些浏览器中有效的内容在其他浏览器中可能无效。

尝试使用Moment.js - 它提供了跨浏览器功能,可用于解析日期

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

这并没有完全回答问题(且得分为负)。有没有一种方法可以撤销悬赏? - Westy92

0
JavaScript本身没有像PHP的strtotime()函数那样将自然语言(英语)转换为Date对象的功能。
因此,您需要一个库(或自己编写一些代码)。 一个目前(2023年)维护良好的库是Chrono:https://github.com/wanasit/chrono 我支持类似于"10 days after next Friday"的字符串。Chrono的一个额外好处是它还支持其他一些语言。

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>


弃用警告:提供的值不是已知的 ISO 格式。moment 构造回退到 js 的 Date() - 所以...实际上与new Date(strdate)相同... - deceze

0
也许你可以利用一个示例函数,例如:

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;

`


0

有一些模块提供了类似的行为,但并不完全像 PHP 的 strtotime。在几个替代方案中,我发现 date-util 提供了最好的结果。


0

对于那些想将日期时间转换为 Unix 时间戳的人,可以使用 Moment 库来实现。

对于 Vue.js,您可以像这样操作

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接