将普通日期转换为Unix时间戳

202

如何在JavaScript中将普通日期2012.08.10转换为Unix时间戳?

示例:http://jsfiddle.net/J2pWj/

我看到很多关于在PHP、Ruby等语言中进行转换的帖子,但我需要在JS内部完成这个操作。


1
你尝试过 newDate.getTime() / 1000 吗? - Gareth Parker
@LokiAstari 是的,抱歉。我确实搜索了但没有找到那个。 - Stan
4
或许我有所遗漏,但是“Unix时间戳”对于所有工程和计算机科学都非常基础。希望能有内置的便捷方法。目前我使用的是Math.floor((+new Date())/1000) - Mars Robertson
这个很好用:https://dev59.com/42Mk5IYBdhLWcg3w7CGX#72047159 - Ank_247shbm
13个回答

401

70
向下取整,否则它不是 Unix 时间戳(会有小数点)。 - B T
@fguillen,Mooseman,我运行并检查了这段代码。一旦我将Unix时间戳转换为日期,它给出的是2012.08.09而不是2012.08.10。为什么会这样..? - WP Learner
1
@user2584538,请看下面的答案。您必须删除小数点。 - theVinchi
3
@导师,UNIX时间以秒为单位计量,而不是毫秒。 - Nicu Surdu
2
你为什么要将结果除以1000?因为getTime函数返回的是毫秒。 - Shahin Ghasemi
显示剩余2条评论

85
parseInt((new Date('2012.08.10').getTime() / 1000).toFixed(0))

toFixed(0)添加到除以1000以从毫秒转换为秒时删除任何小数位非常重要。

.getTime()函数返回时间戳(以毫秒为单位),但真正的Unix时间戳始终以秒为单位。


8
请注意,这将返回一个字符串而不是数字。 - Capaj
4
好的,将答案改为使用parseInt()将其转换回整数。 - theVinchi
3
如果性能很重要,可能更好、更正确的选项是使用 Math.round 或者 Math.floor,而不是将其转换为字符串再转回整数。具体来说,可以使用以下方式:Math.round(new Date('2012.08.10').getTime() / 1000) - mindplay.dk
我还没有测试过这个,但是我想说一下我的看法,相比于当前最佳方法Math.floor(new Date('2012.08.10').getTime() / 1000),这种方法会非常慢。原因是因为这段代码涉及到字符串操作,而在我的理解中,这比仅仅处理数字更加耗费性能。 - jaquinocode

41

var d = '2016-01-01T00:00:00.000Z';
console.log(new Date(d).valueOf()); // returns the number of milliseconds since the epoch


1
这个答案没有被采纳的唯一原因是它返回的是毫秒数,而问题是关于Unix时间戳的,它们是以为单位测量的。因此,您仍然需要执行所有其他答案建议的除法和Math.floor()操作。 - Tyler V.

15

你应该查看moment.js API,它非常易于使用并且有很多内置功能。

我认为对于你的问题,你可以使用类似以下代码:

var unixTimestamp = moment('2012.08.10', 'YYYY.MM.DD').unix();

12
你可以使用 Date.parse() 方法来实现。
Date.parse($("#yourCustomDate).val())

Date.parse("03.03.2016") 输出-> 1456959600000

Date.parse("2015-12-12") 输出-> 1449878400000

这段内容是关于日期解析的示例,第一行代码是将字符串"03.03.2016"转换成时间戳输出,输出结果为1456959600000。第二行代码是将字符串"2015-12-12"转换成时间戳输出,输出结果为1449878400000。

1
这个答案与6年前Barmar给出的答案有何不同? - Capricorn

11
var date = new Date('2012.08.10');
var unixTimeStamp = Math.floor(date.getTime() / 1000);

在这种情况下,重要的是只返回一个整数(所以简单的除法不起作用),并且只返回实际经过的秒数(这就是为什么此代码使用Math.floor()而不是Math.round())。

7
你可以使用 Date.parse(),但它所接受的输入格式是依赖于实现的。然而,如果你能将日期转换为 ISO 格式(YYYY-MM-DD),大多数实现都应该能够理解。
参见为什么 Date.parse 给出错误的结果?

6

4
在这里我想添加两个评论:一元加号运算符不需要,因为 / 已经是一个数学运算符。另外,如果类型很重要的话,toFixed 返回的是一个字符串而不是一个数字。 - Laurens

1
使用 dayjs 库:
dayjs('2019-01-25').unix() // 1548381600

1
var datestr = '2012.08.10';
var timestamp = (new Date(datestr.split(".").join("-")).getTime())/1000;

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