如何计算两个日期之间的秒数?

254

我有两个日期 YYYY-MM-DDZZZZ-NN-EE

如何计算它们之间的秒数?


203
我试着在约会之间留下至少半个小时的时间,避免被抓住。 - Don Branson
1
yyyy-MM-dd 很清楚(年,月,日 - 注意它们不是全部大写),但 ZZZZ-NN-EE 不太清楚。我将其解释为(时区,???,星期几)。这是一年中的第几周吗?如果是,那应该是 ww。但即使是这样,我们仍然需要年份来计算差异。您能否提供一些实际样本值? - BalusC
8
我认为他只是选择了下一个字母来表示第二个日期(Y → Z,M → N 和 D → E)。使用类似于 startDate 和 endDate 这样的变量名可能会更好。 - Austin Salonen
1
啊,我明白了。这个问题确实可以表达得更清楚些。 - BalusC
10个回答

330

我理解YYYY和ZZZZ是整数值,表示年份,MM和NN是整数值,表示年份的月份,DD和EE是整数值,表示每个月的日子。

var t1 = new Date(YYYY, MM, DD, 0, 0, 0, 0);
var t2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0);
var dif = t1.getTime() - t2.getTime();

var Seconds_from_T1_to_T2 = dif / 1000;
var Seconds_Between_Dates = Math.abs(Seconds_from_T1_to_T2);

一个方便的将来参考来源是MDN网站

或者,如果你的日期以javascript可以解析的格式出现

var dif = Date.parse(MM + " " + DD + ", " + YYYY) - Date.parse(NN + " " + EE + ", " + ZZZZ);

然后你可以将那个值用作毫秒差(在我的两个示例中,dif具有相同的含义)


1
例子中使用的格式不太正确。小写yyyy表示4位数年份,大写MM表示2位数月份,小写dd表示2位数日期。 - BalusC
1
马丁,我有一种印象,这里没有使用任何日期格式。MM DD, YYYY 和 NN EE, ZZZZ 实际上是史蒂文要求的“示例值”。换句话说,他并没有进行任何格式化处理。 - Wagner Silveira
根据情况而定,Math.round 可能是更好的选择。 - gphilip
绝对可以,对于整数秒数使用Math.Round(x),对于正整数秒数使用Math.Round(Math.Abs(x))。 - Martin
在有人终于注意到缺少分号之前,这段代码已经存在了6年,获得了76个赞和45886次浏览xD。 - Martin
显示剩余4条评论

116
只需减去:

var a = new Date();
alert("Wait a few seconds, then click OK");

var b = new Date();
var difference = (b - a) / 1000;

console.log("You waited: " + difference + " seconds");


1
@user3344977 - 然后就有点有趣了!检查一下 ab 的值,确保它们是日期类型。 - Seth
1
@Seth 你说得对,所以我删除了我的评论... 我的“日期”之一实际上是一个字符串。这个很完美。 - user3344977
1
你的答案(仅使用 new Date() - new Date())和 @Martin 的答案(使用 new Date().getTime() - new Date().getTime())有什么区别? - krummens
1
回答我之前评论中的问题:TypeScript 不喜欢将日期对象相减,会出现以下错误:The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.。然而,@Martin 的答案在 TypeScript 中是有效的。 - krummens
1
我支持使用 getTime() - 将 new Date() 隐式转换为数字可能是基于约定而非规范。我没有在 规范 中看到操作符的行为定义。对我来说,这表明行为是基于强制转换规则隐含的。我认为明确地(首先将其转换为毫秒,以便您知道正在减去的是毫秒)更清晰。如果一个非日期对象意外地发送到您的函数中,它也会立即捕获 @user3344977 提到的错误。 - Seth

25

你可以简单地做到它。

var secondBetweenTwoDate = Math.abs((new Date().getTime() - oldDate.getTime()) / 1000);

16
如果你的一个或两个日期在未来,那么如果你想要精确到秒的准确性,我恐怕你会失望。UTC时间存在闰秒,这些闰秒直到发生前大约6个月才能确定,因此任何比这更长的日期都可能不准确,并且实际上,由于人们不经常更新其设备,你可能发现将来的任何时间都会有一些误差。
这个链接提供了一个关于设计日期/时间库的理论的好解释以及为什么会出现这种情况: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs

8
谢谢提到闰秒问题!即使是一些本应该更加了解的人(例如POSIX委员会)也会出现处理不当的情况,这真的很令人沮丧。+1 - Jim Lewis
3
值得一提的是,ECMA标准明确忽略闰秒(即使是过去的闰秒):在时间值中闰秒被忽略。假设每天恰好有86,400,000毫秒 - Sylvain Leroux

6
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 1000)
);

6

2
getSeconds() -> 返回秒数。(范围为0-59)。应该使用valueOf()或getTime()。 - steven

6

简单方式:

function diff_hours(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60 * 60);
  return Math.abs(Math.round(diff));

 }


function diff_minutes(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60);
  return Math.abs(Math.round(diff));

 }

function diff_seconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  return Math.abs(Math.round(diff));

 }

function diff_miliseconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime());
  return Math.abs(Math.round(diff));

 }


dt1 = new Date(2014,10,2);
dt2 = new Date(2014,10,3);
console.log(diff_hours(dt1, dt2));


dt1 = new Date("October 13, 2014 08:11:00");
dt2 = new Date("October 14, 2014 11:13:00");
console.log(diff_hours(dt1, dt2));

console.log(diff_minutes(dt1, dt2));

console.log(diff_seconds(dt1, dt2));

console.log(diff_miliseconds(dt1, dt2));

0
function parseDate(str) {
  const [dateStr, timeStr] = str.split(' ');
  const [m,d,y] = dateStr.split('/');
  const [h,min] = timeStr.split(':');
  const date = new Date(y,m,d,h,min,0, 0);
  
  return date;
}

const date1 = parseDate('28/6/2022 22:55');
const date2 = parseDate('28/6/2022 22:58');
const diffInSeconds = (date2 - date1) / 1000;

console.log(diffInSeconds)

-3
在Bash中:
bc <<< "$(date --date='1 week ago' +%s) - \
    $(date --date='Sun,  29 Feb 2004 16:21:42 -0800' +%s)"

需要安装bc和gnu date。


3
这与什么有关? - Dropout

-12

.Net 提供了 TimeSpan 类来为您执行数学运算。

var time1 = new Date(YYYY, MM, DD, 0, 0, 0, 0)
var time2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0)

Dim ts As TimeSpan = time2.Subtract(time1)

ts.TotalSeconds

@Jeff,你可能想要删除这个答案,这样就不会失去分数。他们要求JavaScript源代码,而不是Visual Basic源代码。 - Entree

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