Node.js - 如何生成Unix时间戳格式的时间?

98

我正尝试使用Ubuntu终端将数据发送到2003端口上的图形化carbon-cache进程:

echo "test.average 4 `date +%s`" | nc -q0 127.0.0.1 2003

Node.js:

var socket = net.createConnection(2003, "127.0.0.1", function() {
    socket.write("test.average "+assigned_tot+"\n");
    socket.end();
});

当我在Ubuntu上使用终端窗口命令发送数据时,它可以正常工作。但是,我不知道如何从Node.js以Unix Epoch格式发送时间戳?

Graphite理解此格式的指标:metric_path value timestamp。

谢谢!


+new Date() == Unix日期 - dandavis
@dandavis 实际上那只是日期。你需要调用 getTime() 来获取毫秒数。 - tadman
@tadman:不,"+"将日期强制转换为它的valueOf()值,这是一个表示自1970年以来毫秒数的数字。简而言之,您永远不需要使用getTime()。 - dandavis
这是一个有趣的优化。那个值仍然是毫秒,所以你需要除以1000来得到秒数。 - tadman
7个回答

194

本地JavaScript Date系统以毫秒为单位工作,而不是秒,但除此之外,它与UNIX中的“纪元时间”相同。

您可以将秒的小数部分向下舍入并通过执行以下操作获取UNIX纪元:

Math.floor(+new Date() / 1000)

更新:正如Guillermo所指出的,另一种语法可能更易读:

Math.floor(new Date().getTime() / 1000)

第一个示例中的+是JavaScript中的怪癖,它强制将其作为数字进行计算,这具有将其转换为毫秒的相同效果。第二个版本明确地执行此操作。


1
相同于~~(new Date/1000)或Math.floor(new Date/1000) - dandavis
耶!time_t是我们最接近星际日期的东西。 - tadman
3
Typescript 会抱怨这个问题,因为日期的类型与数字不同,还有 Date.parse(new Date()) / 1000 等等,请考虑使用以下方式:Math.floor(new Date().getTime() / 1000) 或 Math.floor(+new Date() / 1000) - edelwater
1
我投票支持这个答案,因为它很有用,但我必须说我更喜欢更易于阅读的new Date().getTime()而不是+newDate()。 - Guillermo F. Lopez
更简短的写法:Math.floor(Date.now() / 1000) - jakub.g
显示剩余2条评论

25

如果可以的话,我强烈推荐使用 moment.js。要获取自 UNIX 纪元以来的毫秒数,请执行

moment().valueOf()

要获取自UNIX纪元以来的秒数,请执行以下操作

moment().unix()

您也可以这样转换时间:

moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()

我经常这样做。

要在Node上安装moment.js

npm install moment

并且使用它

var moment = require('moment');
moment().valueOf();

ref


11
使用moment.js相对于类似于Math.floor(new Date() / 1000)这样的方法是否有特定的优势? - Alex
1
@Alex - 对我来说,我更喜欢moment.js简洁的语法和更全面的功能。你可以像这样做:moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').add(3, 'days') - FullStack

6

在 TypeScript 中,只需运行 Math.floor(new Date().getTime() / 1000) 即可。

> Math.floor(new Date().getTime() / 1000)
1581040613

我目前正在运行 Node 13.7.0 版本。


5

以下是简化it的辅助方法,请将以下内容复制并粘贴到您的JS文件顶部:

Date.prototype.toUnixTime = function() { return this.getTime()/1000|0 };
Date.time = function() { return new Date().toUnixTime(); }

现在你可以通过简单的调用在任何地方使用它:
// Get the current unix time: 
console.log(Date.time())

// Parse a date and get it as Unix time
console.log(new Date('Mon, 25 Dec 2010 13:30:00 GMT').toUnixTime())

示例:

     
    Date.prototype.toUnixTime = function() { return this.getTime()/1000|0 };
    Date.time = function() { return new Date().toUnixTime(); }

    // Get the current unix time: 
    console.log("Current Time: " + Date.time())

    // Parse a date and get it as Unix time
    console.log("Custom Time (Mon, 25 Dec 2010 13:30:00 GMT): " + new Date('Mon, 25 Dec 2010 13:30:00 GMT').toUnixTime())


2
你应该避免修改你不拥有的对象的原型 - James Monger

5

在ECMAScript5之后,您可以使用以下内容:

Math.floor(Date.now() / 1000);

生成以秒为单位的时间戳。


2
使用momentjs:
以下两个变量具有相同的值:
console.log(moment().format('X'))
console.log(moment.utc().format('X'))

使用内置的Date()函数:

console.log(new Date().getTime())   // including fractional seconds
console.log(Math.floor(new Date().getTime()/1000))    // up to seconds

1
AWS SDK 包含用于转换亚马逊日期格式的实用函数。例如,在从 S3 获取对象的回调中,有一个属性“LastModified”以亚马逊日期格式呈现。(似乎他们没有做任何事情,只是导出标准的 Date 类来表示他们的日期属性,例如 S3 对象的“LastModified”属性) 该格式包括一些内置的各种格式的实用程序(不幸的是,没有 Unix 时间戳的实用程序)。
let awsTime = response.LastModified
console.log("Time Formats",{
    "String"           : awsTime.toString(),
    "JSON"             : awsTime.toJSON(),
    "UTCString"        : awsTime.toUTCString(),
    "TimeString"       : awsTime.toTimeString(),
    "DateString"       : awsTime.toDateString(),
    "ISOString"        : awsTime.toISOString(),
    "LocaleTimeString" : awsTime.toLocaleTimeString(),
    "LocaleDateString" : awsTime.toLocaleDateString(),
    "LocaleString"     : awsTime.toLocaleString()
})
/*
Time Formats {
  String: 'Fri Sep 27 2019 16:54:31 GMT-0400 (EDT)',
  JSON: '2019-09-27T20:54:31.000Z',
  UTCString: 'Fri, 27 Sep 2019 20:54:31 GMT',
  TimeString: '16:54:31 GMT-0400 (EDT)',
  DateString: 'Fri Sep 27 2019',
  ISOString: '2019-09-27T20:54:31.000Z',
  LocaleTimeString: '16:54:31',
  LocaleDateString: '2019-9-27',
  LocaleString: '2019-9-27 16:54:31'
}
*/

然而,AWS工具函数包括一个“date”模块,其中还包括其他函数,包括unixTimestamp方法:
let awsTime = response.LastModified
let unixEpoch = Math.floor(AWS.util.date.unixTimestamp(awsTime))

注意:此方法默认返回浮点数值。因此,Math.floor()。
来自aws-sdk.js(最新版)的函数代码:
/**
 * @return [Integer] the UNIX timestamp value for the current time
 */
 unixTimestamp: function unixTimestamp(date) {
     if (date === undefined) { date = util.date.getDate(); }
     return date.getTime() / 1000;
 }

还有rfc822和iso8601的方法。


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