【问题标题】:How can I create epoch from String?如何从字符串创建纪元?
【发布时间】:2016-11-13 17:29:28
【问题描述】:

所有,我需要使用 Javascript 从字符串创建纪元时间。现在我知道我可以使用以下内容:

var dateStr = '01/01/2016 1:10 PM'
var dateObj = new Date(dateStr);
console.log(dateObj.getSeconds());

我遇到的问题是,使用上面的代码,我的数据中有毫秒。以以下为例:

var dateStr = '01/01/2016 1:10:49.181 PM'
var dateObj = new Date(dateStr);
console.log(dateObj.getSeconds());

使用该格式,我得到一个 NaN 错误。有没有办法将第二个示例中的日期时间转换为纪元,同时保留毫秒?

【问题讨论】:

  • 您忘记在getSeconds 之后使用() 来调用该函数。而且它不返回毫秒,它只返回0,因为你的时间里没有秒。
  • 我想你说的是getTime(),而不是getSeconds()。将毫秒除以 1000 得到秒。

标签: javascript datetime epoch


【解决方案1】:

dateObj.getTime() 将返回自纪元以来的毫秒数。除以 1000 并四舍五入得到秒数。

var dateStr = '01/01/2016 1:10 PM'
var dateObj = new Date(dateStr);
console.log(Math.round(dateObj.getTime() / 1000));

var dateStr = '01/01/2016 1:10:49.181'
var dateObj = new Date(dateStr);
console.log(Math.round(dateObj.getTime() / 1000));

【讨论】:

  • 是的,这适用于 '01/01/2016 1:10 PM',我正在尝试为以下值执行此操作:'01/01/2016 1:10:49.181'
  • 它适用于我的 Chrome。但是日期解析是特定于实现的。如果您需要更多控制权,可能需要使用moment.js
  • 我将它插入到一个沙盒项目中,纯 html 和 javascript,第二次(以毫秒为单位)我得到的是 NaN。这似乎是特定于浏览器的。您的代码适用于 Chrome,但不适用于 Safari。在我的应用程序中,我正在使用 Rhino 无头运行这个 javascript,除了使用 moment.js 之外还有什么建议吗?
  • MDN 显示了 Javascript 可以解析的标准日期格式,它们不包括秒的小数部分。因此,如果您不想使用 moment.js,则需要编写自己的代码来查找小数并将其删除,例如date.replace(/\.\d+/, '')
【解决方案2】:

以下是一种可能的解决方法:

var dateStr = '01/01/2016 1:10:49.181 PM',
    reg = new RegExp(/\.[0-9]{1,3}/);

var dateObj = new Date(dateStr.replace(reg, ''));

console.log(
  (dateObj.getTime() + 1000 * Number(reg.exec(dateStr)[0]))
);

这将包括最终结果中的毫秒数 (1451650249181)。您也可以完全丢弃它们,在这种情况下,您只需要 replace 部分而不需要 exec 部分。

反向操作

以下是使用标准日期方法的反向操作的可能方法。

注意:几乎没有测试过。

var ts = new Date(1451650249181);

var dateStr =
  ('0' + ts.getDate()).substr(-2, 2) + '/' +
  ('0' + (ts.getMonth() + 1)).substr(-2, 2) + '/' +
  ts.getFullYear() + ' ' +
  (ts.getHours() % 12 || 12) + ':' +
  ('0' + ts.getMinutes()).substr(-2, 2) + ':' +
  ('0' + ts.getSeconds()).substr(-2, 2) + '.' +
  ('00' + (ts.getTime() % 1000)).substr(-3, 3) + ' ' +
  (ts.getHours() >= 12 ? 'PM' : 'AM');

【讨论】:

  • 你就是那个人,谢谢。我很快就需要在这里做相反的事情。您是否知道跨平台解决方法可以在我的日期对象中包含毫秒?同样,使用 rhino 将是无头的。
  • @user316114 好吧。在我的脑海中,我想不出一个简单的和优雅的跨平台解决方法来进行反向操作。请参阅我编辑的答案以获取可能的解决方案,但这是一段相当臃肿的代码。
猜你喜欢
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多