如何计算打字稿中2个日期之间的时间


138

这适用于Javascript

new Date()-new Date("2013-02-20T12:01:04.753Z")

但是在打字稿中我不能休息两个新日期

Date("2013-02-20T12:01:04.753Z")

不起作用,因为参数不匹配日期签名

Answers:


152

使用该getTime方法获取自1970-01-01以来的总时间(以毫秒为单位),然后减去这些时间:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();

3
我认为您正在混淆getTime()和valueOf()。根据文档,getTime()“获取时间值(以毫秒为单位)。” 而valueOf()则返回自UTC 1970年1月1日午夜起的存储时间值(以毫秒为单位)。
肯·里昂

都做同样的:new Date(1970, 1, 1, 0, 0, 0, 0).valueOf() // returns 2674800000 new Date(1970, 1, 1, 0, 0, 0, 0).getTime() // returns 2674800000
prespic

来自MDN getTime文档的@KenLyon:可以使用此方法帮助将日期和时间分配给另一个Date对象。此方法在功能上等效于valueOf()方法。
PhoneixS

27
提示,而不是使用new Date().getTime()use,Date.now()这样您就不必不必要地制作新对象。
PhoneixS

1
@PhoneixS有趣的是它们是等效的。谢谢你让我知道!另外,这是避免创建新对象的一个​​很好的技巧。
肯·里昂

110

这是应该在打字稿中完成的方式:

(new Date()).valueOf() - (new Date("2013-02-20T12:01:04.753Z")).valueOf()

更好的可读性:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();

3
这是最正确的方法,因为javascript在对对象进行算术运算时在内部使用“ valueOf”。Typescript应该足够聪明(不幸的是,它还没有)来支持它,因为它已经知道Date的valueOf方法返回的是lib.d.ts中定义的数字
Bigjim 2015年

1
有趣的是,现在的打字稿非常聪明,即使您没有定义eventStartTime并且eventEndTime持续时间也被键入为a number(这意味着如果您从字面上接受此处的第三行代码,这里持续时间将是一个数字)
Simon_Weaver

22

这是行不通的,因为Date - Date完全依赖TypeScript旨在防止的类型强制。

使用+前缀可以解决此问题:

var t = Date.now() - +(new Date("2013-02-20T12:01:04.753Z");

或者,如果您不想使用Date.now()

var t = +(new Date()) - +(new Date("2013-02-20T12:01:04.753Z"));

请参阅此处的讨论

或参阅下方的Siddharth Singh的答案,以获得使用以下更优雅的解决方案 valueOf()


1
批准链接编辑,因为由于CodePlex的关闭,现有链接不再有原始讨论;除非有人反对使用web.archive.org,否则这不会以任何方式破坏或破坏原始帖子,而是保留其含义。
裘德·费舍尔

11

为了计算差异,您必须让+运算符

这样typescript将日期转换为数字。

+new Date()- +new Date("2013-02-20T12:01:04.753Z")

在此处,您可以创建公式以将差值转换为minuteshours


3
// TypeScript

const today = new Date();
const firstDayOfYear = new Date(today.getFullYear(), 0, 1);

// Explicitly convert Date to Number
const pastDaysOfYear = ( Number(today) - Number(firstDayOfYear) );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.